annot-server/static/js/libs-annotviz.js
author rougeronj
Sat, 18 Apr 2015 09:37:57 +0200
changeset 167 2b99fed0285e
parent 130 0a2b4991d48c
permissions -rw-r--r--
Update for 'Atelier 3 jour 3' and clean gulpfile
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
108
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"lodash":[function(require,module,exports){
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
(function (global){
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * @license
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * Build: `lodash modern -o ./dist/lodash.js`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * Available under MIT license <http://lodash.com/license>
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
;(function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  /** Used as a safe reference for `undefined` in pre ES5 environments */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
  var undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
  /** Used to pool arrays and objects used internally */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
  var arrayPool = [],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
      objectPool = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
  /** Used to generate unique IDs */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  var idCounter = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
  var keyPrefix = +new Date + '';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  /** Used as the size when optimizations are enabled for large arrays */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
  var largeArraySize = 75;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
  /** Used as the max size of the `arrayPool` and `objectPool` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  var maxPoolSize = 40;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  /** Used to detect and test whitespace */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
  var whitespace = (
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    // whitespace
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    ' \t\x0B\f\xA0\ufeff' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    // line terminators
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    '\n\r\u2028\u2029' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    // unicode category "Zs" space separators
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    '\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
  );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
  /** Used to match empty string literals in compiled template source */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
  var reEmptyStringLeading = /\b__p \+= '';/g,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
   * Used to match ES6 template delimiters
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
  /** Used to match regexp flags from their coerced string values */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
  var reFlags = /\w*$/;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
  /** Used to detected named functions */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
  var reFuncName = /^\s*function[ \n\r\t]+\w/;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
  /** Used to match "interpolate" template delimiters */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
  var reInterpolate = /<%=([\s\S]+?)%>/g;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
  /** Used to match leading whitespace and zeros to be removed */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
  /** Used to ensure capturing order of template delimiters */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
  var reNoMatch = /($^)/;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
  /** Used to detect functions containing a `this` reference */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
  var reThis = /\bthis\b/;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
  /** Used to match unescaped characters in compiled string literals */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
  var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
  /** Used to assign default `context` object properties */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
  var contextProps = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    'parseInt', 'setTimeout'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
  ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
  /** Used to make template sourceURLs easier to identify */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
  var templateCounter = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
  /** `Object#toString` result shortcuts */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
  var argsClass = '[object Arguments]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
      arrayClass = '[object Array]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
      boolClass = '[object Boolean]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
      dateClass = '[object Date]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
      funcClass = '[object Function]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
      numberClass = '[object Number]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
      objectClass = '[object Object]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
      regexpClass = '[object RegExp]',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
      stringClass = '[object String]';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
  /** Used to identify object classifications that `_.clone` supports */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
  var cloneableClasses = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
  cloneableClasses[funcClass] = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
  cloneableClasses[boolClass] = cloneableClasses[dateClass] =
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
  cloneableClasses[numberClass] = cloneableClasses[objectClass] =
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
  /** Used as an internal `_.debounce` options object */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
  var debounceOptions = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    'leading': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    'maxWait': 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    'trailing': false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
  };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
  /** Used as the property descriptor for `__bindData__` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
  var descriptor = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    'configurable': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    'enumerable': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    'value': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    'writable': false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
  };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
  /** Used to determine if values are of the language type Object */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
  var objectTypes = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    'boolean': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    'function': true,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    'object': true,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
    'number': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
    'string': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    'undefined': false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
  };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
  /** Used to escape characters for inclusion in compiled string literals */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
  var stringEscapes = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    '\\': '\\',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    "'": "'",
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
    '\n': 'n',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    '\r': 'r',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    '\t': 't',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    '\u2028': 'u2028',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    '\u2029': 'u2029'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
  };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
  /** Used as a reference to the global object */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
  var root = (objectTypes[typeof window] && window) || this;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
  /** Detect free variable `exports` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
  /** Detect free variable `module` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
  /** Detect the popular CommonJS extension `module.exports` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
  var freeGlobal = objectTypes[typeof global] && global;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
    root = freeGlobal;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
  /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
   * The base implementation of `_.indexOf` without support for binary searches
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
   * or `fromIndex` constraints.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
   * @param {Array} array The array to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
   * @param {*} value The value to search for.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
   * @param {number} [fromIndex=0] The index to search from.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
   * @returns {number} Returns the index of the matched value or `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
  function baseIndexOf(array, value, fromIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
    var index = (fromIndex || 0) - 1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
        length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
    while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
      if (array[index] === value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
        return index;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
    return -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
   * An implementation of `_.contains` for cache objects that mimics the return
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
   * @param {Object} cache The cache object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
   * @param {*} value The value to search for.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
   * @returns {number} Returns `0` if `value` is found, else `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
  function cacheIndexOf(cache, value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
    var type = typeof value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
    cache = cache.cache;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    if (type == 'boolean' || value == null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
      return cache[value] ? 0 : -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
    if (type != 'number' && type != 'string') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
      type = 'object';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
    var key = type == 'number' ? value : keyPrefix + value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
    cache = (cache = cache[type]) && cache[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
    return type == 'object'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
      : (cache ? 0 : -1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
   * Adds a given value to the corresponding cache object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
   * @param {*} value The value to add to the cache.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
  function cachePush(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    var cache = this.cache,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
        type = typeof value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
    if (type == 'boolean' || value == null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
      cache[value] = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
    } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
      if (type != 'number' && type != 'string') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        type = 'object';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
      var key = type == 'number' ? value : keyPrefix + value,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
          typeCache = cache[type] || (cache[type] = {});
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
      if (type == 'object') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
        (typeCache[key] || (typeCache[key] = [])).push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
        typeCache[key] = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
   * Used by `_.max` and `_.min` as the default callback when a given
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
   * collection is a string value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
   * @param {string} value The character to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
   * @returns {number} Returns the code unit of given character.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
  function charAtCallback(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
    return value.charCodeAt(0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
   * Used by `sortBy` to compare transformed `collection` elements, stable sorting
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
   * them in ascending order.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
   * @param {Object} a The object to compare to `b`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
   * @param {Object} b The object to compare to `a`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
   * @returns {number} Returns the sort order indicator of `1` or `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
  function compareAscending(a, b) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
    var ac = a.criteria,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
        bc = b.criteria,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
        index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
        length = ac.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
    while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
      var value = ac[index],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
          other = bc[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
      if (value !== other) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        if (value > other || typeof value == 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
          return 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        if (value < other || typeof other == 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
          return -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
    // that causes it, under certain circumstances, to return the same value for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
    //
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    // This also ensures a stable sort in V8 and other engines.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
    // See http://code.google.com/p/v8/issues/detail?id=90
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
    return a.index - b.index;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
   * Creates a cache object to optimize linear searches of large arrays.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
   * @param {Array} [array=[]] The array to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
  function createCache(array) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
    var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
        length = array.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
        first = array[0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
        mid = array[(length / 2) | 0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
        last = array[length - 1];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
    if (first && typeof first == 'object' &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
        mid && typeof mid == 'object' && last && typeof last == 'object') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
      return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
    var cache = getObject();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
    var result = getObject();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
    result.array = array;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
    result.cache = cache;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
    result.push = cachePush;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
    while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
      result.push(array[index]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
    return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
   * Used by `template` to escape characters for inclusion in compiled
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
   * string literals.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
   * @param {string} match The matched character to escape.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
   * @returns {string} Returns the escaped character.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
  function escapeStringChar(match) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
    return '\\' + stringEscapes[match];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
   * Gets an array from the array pool or creates a new one if the pool is empty.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
   * @returns {Array} The array from the pool.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
  function getArray() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
    return arrayPool.pop() || [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
   * Gets an object from the object pool or creates a new one if the pool is empty.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
   * @returns {Object} The object from the pool.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
  function getObject() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
    return objectPool.pop() || {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
      'array': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
      'cache': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
      'criteria': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
      'false': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
      'index': 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
      'null': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
      'number': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
      'object': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
      'push': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
      'string': null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
      'true': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
      'undefined': false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
      'value': null
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
   * Releases the given array back to the array pool.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
   * @param {Array} [array] The array to release.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
  function releaseArray(array) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
    array.length = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
    if (arrayPool.length < maxPoolSize) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
      arrayPool.push(array);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
   * Releases the given object back to the object pool.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
   * @param {Object} [object] The object to release.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
  function releaseObject(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
    var cache = object.cache;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
    if (cache) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
      releaseObject(cache);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
    if (objectPool.length < maxPoolSize) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
      objectPool.push(object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
   * Slices the `collection` from the `start` index up to, but not including,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
   * the `end` index.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
   * Note: This function is used instead of `Array#slice` to support node lists
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
   * in IE < 9 and to ensure dense arrays are returned.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
   * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
   * @param {Array|Object|string} collection The collection to slice.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
   * @param {number} start The start index.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
   * @param {number} end The end index.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
   * @returns {Array} Returns the new array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
  function slice(array, start, end) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
    start || (start = 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
    if (typeof end == 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
      end = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
    var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
        length = end - start || 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
        result = Array(length < 0 ? 0 : length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
    while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
      result[index] = array[start + index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
    return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
  /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
  /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
   * Create a new `lodash` function using the given context object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
   *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
   * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
   * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
   * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
   * @param {Object} [context=root] The context object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
   * @returns {Function} Returns the `lodash` function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
   */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
  function runInContext(context) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    // Avoid issues with some ES3 environments that attempt to use values, named
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    // after built-in constructors like `Object`, for the creation of literals.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
    // ES5 clears this up by stating that literals must use built-in constructors.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
    // See http://es5.github.io/#x11.1.5.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
    /** Native constructor references */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
    var Array = context.Array,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
        Boolean = context.Boolean,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
        Date = context.Date,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
        Function = context.Function,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
        Math = context.Math,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
        Number = context.Number,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
        Object = context.Object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
        RegExp = context.RegExp,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
        String = context.String,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
        TypeError = context.TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
     * Used for `Array` method references.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
     * Normally `Array.prototype` would suffice, however, using an array literal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
     * avoids issues in Narwhal.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
    var arrayRef = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
    /** Used for native method references */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
    var objectProto = Object.prototype;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
    /** Used to restore the original `_` reference in `noConflict` */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
    var oldDash = context._;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
    /** Used to resolve the internal [[Class]] of values */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
    var toString = objectProto.toString;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
    /** Used to detect if a method is native */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
    var reNative = RegExp('^' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
      String(toString)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
        .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
        .replace(/toString| for [^\]]+/g, '.*?') + '$'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
    /** Native method shortcuts */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
    var ceil = Math.ceil,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
        clearTimeout = context.clearTimeout,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
        floor = Math.floor,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
        fnToString = Function.prototype.toString,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
        hasOwnProperty = objectProto.hasOwnProperty,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
        push = arrayRef.push,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
        setTimeout = context.setTimeout,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
        splice = arrayRef.splice,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
        unshift = arrayRef.unshift;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
    /** Used to set meta data on functions */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
    var defineProperty = (function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
      // IE 8 only accepts DOM elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
      try {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
        var o = {},
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
            func = isNative(func = Object.defineProperty) && func,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
            result = func(o, o, o) && func;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
      } catch(e) { }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
    }());
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
    /* Native method shortcuts for methods with the same name as other `lodash` methods */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
        nativeIsFinite = context.isFinite,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
        nativeIsNaN = context.isNaN,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
        nativeMax = Math.max,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
        nativeMin = Math.min,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
        nativeParseInt = context.parseInt,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
        nativeRandom = Math.random;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
    /** Used to lookup a built-in constructor by [[Class]] */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
    var ctorByClass = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
    ctorByClass[arrayClass] = Array;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
    ctorByClass[boolClass] = Boolean;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
    ctorByClass[dateClass] = Date;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
    ctorByClass[funcClass] = Function;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
    ctorByClass[objectClass] = Object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
    ctorByClass[numberClass] = Number;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
    ctorByClass[regexpClass] = RegExp;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
    ctorByClass[stringClass] = String;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
     * Creates a `lodash` object which wraps the given value to enable intuitive
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
     * method chaining.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
     * and `unshift`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
     * Chaining is supported in custom builds as long as the `value` method is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
     * implicitly or explicitly included in the build.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
     * The chainable wrapper functions are:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
     * and `zip`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
     * The non-chainable wrapper functions are:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
     * `template`, `unescape`, `uniqueId`, and `value`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
     * The wrapper functions `first` and `last` return wrapped values when `n` is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
     * provided, otherwise they return unwrapped values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
     * Explicit chaining can be enabled by using the `_.chain` method.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
     * @name _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
     * @constructor
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
     * @category Chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
     * @param {*} value The value to wrap in a `lodash` instance.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
     * @returns {Object} Returns a `lodash` instance.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
     * var wrapped = _([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
     * // returns an unwrapped value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
     * wrapped.reduce(function(sum, num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
     *   return sum + num;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
     * // => 6
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
     * // returns a wrapped value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
     * var squares = wrapped.map(function(num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
     *   return num * num;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
     * _.isArray(squares);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
     * _.isArray(squares.value());
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
    function lodash(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
       ? value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
       : new lodashWrapper(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
     * A fast path for creating `lodash` wrapper objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
     * @param {*} value The value to wrap in a `lodash` instance.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
     * @param {boolean} chainAll A flag to enable chaining for all methods
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
     * @returns {Object} Returns a `lodash` instance.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
    function lodashWrapper(value, chainAll) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
      this.__chain__ = !!chainAll;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
      this.__wrapped__ = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
    // ensure `new lodashWrapper` is an instance of `lodash`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
    lodashWrapper.prototype = lodash.prototype;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
     * An object used to flag environments features.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
     * @type Object
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
    var support = lodash.support = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
     * Detect if functions can be decompiled by `Function#toString`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
     * @memberOf _.support
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
     * @type boolean
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
     * Detect if `Function#name` is supported (all but IE).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
     * @memberOf _.support
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
     * @type boolean
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
    support.funcNames = typeof Function.name == 'string';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
     * By default, the template delimiters used by Lo-Dash are similar to those in
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
     * embedded Ruby (ERB). Change the following template settings to use alternative
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
     * delimiters.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
     * @type Object
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
    lodash.templateSettings = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
      /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
       * Used to detect `data` property values to be HTML-escaped.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
       *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
       * @memberOf _.templateSettings
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
       * @type RegExp
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
       */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
      'escape': /<%-([\s\S]+?)%>/g,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
      /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
       * Used to detect code to be evaluated.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
       *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
       * @memberOf _.templateSettings
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
       * @type RegExp
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
       */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
      'evaluate': /<%([\s\S]+?)%>/g,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
      /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
       * Used to detect `data` property values to inject.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
       *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
       * @memberOf _.templateSettings
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
       * @type RegExp
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
       */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
      'interpolate': reInterpolate,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
      /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
       * Used to reference the data object in the template text.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
       *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
       * @memberOf _.templateSettings
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
       * @type string
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
       */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
      'variable': '',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
      /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
       * Used to import variables into the compiled template.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
       *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
       * @memberOf _.templateSettings
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
       * @type Object
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
       */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
      'imports': {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
        /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
         * A reference to the `lodash` function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
         *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
         * @memberOf _.templateSettings.imports
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
         * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
         */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
        '_': lodash
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
     * The base implementation of `_.bind` that creates the bound function and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
     * sets its meta data.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
     * @param {Array} bindData The bind data array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
     * @returns {Function} Returns the new bound function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
    function baseBind(bindData) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
      var func = bindData[0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
          partialArgs = bindData[2],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
          thisArg = bindData[4];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
      function bound() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
        // `Function#bind` spec
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
        // http://es5.github.io/#x15.3.4.5
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
        if (partialArgs) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
          // avoid `arguments` object deoptimizations by using `slice` instead
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
          // of `Array.prototype.slice.call` and not assigning `arguments` to a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
          // variable as a ternary expression
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
          var args = slice(partialArgs);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
          push.apply(args, arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
        // mimic the constructor's `return` behavior
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
        // http://es5.github.io/#x13.2.2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
        if (this instanceof bound) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
          // ensure `new bound` is an instance of `func`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
          var thisBinding = baseCreate(func.prototype),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
              result = func.apply(thisBinding, args || arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
          return isObject(result) ? result : thisBinding;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
        return func.apply(thisArg, args || arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
      setBindData(bound, bindData);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
      return bound;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
     * The base implementation of `_.clone` without argument juggling or support
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
     * for `thisArg` binding.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
     * @param {*} value The value to clone.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
     * @param {boolean} [isDeep=false] Specify a deep clone.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
     * @param {Function} [callback] The function to customize cloning values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
     * @param {Array} [stackA=[]] Tracks traversed source objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
     * @param {Array} [stackB=[]] Associates clones with source counterparts.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
     * @returns {*} Returns the cloned value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
    function baseClone(value, isDeep, callback, stackA, stackB) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
      if (callback) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
        var result = callback(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
        if (typeof result != 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
          return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
      // inspect [[Class]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
      var isObj = isObject(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
      if (isObj) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
        var className = toString.call(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
        if (!cloneableClasses[className]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
          return value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
        var ctor = ctorByClass[className];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
        switch (className) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
          case boolClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
          case dateClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
            return new ctor(+value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
          case numberClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
          case stringClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
            return new ctor(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
          case regexpClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
            result = ctor(value.source, reFlags.exec(value));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
            result.lastIndex = value.lastIndex;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
            return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
        return value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
      var isArr = isArray(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
      if (isDeep) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
        // check for circular references and return corresponding clone
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
        var initedStack = !stackA;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
        stackA || (stackA = getArray());
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
        stackB || (stackB = getArray());
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
        var length = stackA.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
        while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
          if (stackA[length] == value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
            return stackB[length];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
        result = isArr ? ctor(value.length) : {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
      else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
        result = isArr ? slice(value) : assign({}, value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
      // add array properties assigned by `RegExp#exec`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
      if (isArr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
        if (hasOwnProperty.call(value, 'index')) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
          result.index = value.index;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
        if (hasOwnProperty.call(value, 'input')) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
          result.input = value.input;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
      // exit for shallow clone
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
      if (!isDeep) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
        return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
      // add the source value to the stack of traversed objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
      // and associate it with its clone
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
      stackA.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
      stackB.push(result);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
      // recursively populate clone (susceptible to call stack limits)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
      (isArr ? forEach : forOwn)(value, function(objValue, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
      if (initedStack) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
        releaseArray(stackA);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
        releaseArray(stackB);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
     * The base implementation of `_.create` without support for assigning
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
     * properties to the created object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
     * @param {Object} prototype The object to inherit from.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
     * @returns {Object} Returns the new object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
    function baseCreate(prototype, properties) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
      return isObject(prototype) ? nativeCreate(prototype) : {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
    // fallback for browsers without `Object.create`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
    if (!nativeCreate) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
      baseCreate = (function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
        function Object() {}
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
        return function(prototype) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
          if (isObject(prototype)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
            Object.prototype = prototype;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
            var result = new Object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
            Object.prototype = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
          return result || context.Object();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
        };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
      }());
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
     * The base implementation of `_.createCallback` without support for creating
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
     * "_.pluck" or "_.where" style callbacks.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
     * @param {*} [func=identity] The value to convert to a callback.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
     * @param {*} [thisArg] The `this` binding of the created callback.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
     * @param {number} [argCount] The number of arguments the callback accepts.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
     * @returns {Function} Returns a callback function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
    function baseCreateCallback(func, thisArg, argCount) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
      if (typeof func != 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
        return identity;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
      // exit early for no `thisArg` or already bound by `Function#bind`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
      if (typeof thisArg == 'undefined' || !('prototype' in func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
        return func;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
      var bindData = func.__bindData__;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
      if (typeof bindData == 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
        if (support.funcNames) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
          bindData = !func.name;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
        bindData = bindData || !support.funcDecomp;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
        if (!bindData) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
          var source = fnToString.call(func);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
          if (!support.funcNames) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
            bindData = !reFuncName.test(source);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
          if (!bindData) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
            // checks if `func` references the `this` keyword and stores the result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
            bindData = reThis.test(source);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
            setBindData(func, bindData);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
      // exit early if there are no `this` references or `func` is bound
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
      if (bindData === false || (bindData !== true && bindData[1] & 1)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
        return func;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
      switch (argCount) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
        case 1: return function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
          return func.call(thisArg, value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
        };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
        case 2: return function(a, b) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
          return func.call(thisArg, a, b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
        };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
        case 3: return function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
          return func.call(thisArg, value, index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
        };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
        case 4: return function(accumulator, value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
          return func.call(thisArg, accumulator, value, index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
        };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
      return bind(func, thisArg);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
     * The base implementation of `createWrapper` that creates the wrapper and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
     * sets its meta data.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
     * @param {Array} bindData The bind data array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
     * @returns {Function} Returns the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
    function baseCreateWrapper(bindData) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
      var func = bindData[0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
          bitmask = bindData[1],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
          partialArgs = bindData[2],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
          partialRightArgs = bindData[3],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
          thisArg = bindData[4],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
          arity = bindData[5];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
      var isBind = bitmask & 1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
          isBindKey = bitmask & 2,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
          isCurry = bitmask & 4,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
          isCurryBound = bitmask & 8,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
          key = func;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
      function bound() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
        var thisBinding = isBind ? thisArg : this;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
        if (partialArgs) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
          var args = slice(partialArgs);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
          push.apply(args, arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
        if (partialRightArgs || isCurry) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
          args || (args = slice(arguments));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
          if (partialRightArgs) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
            push.apply(args, partialRightArgs);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
          if (isCurry && args.length < arity) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
            bitmask |= 16 & ~32;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
        args || (args = arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
        if (isBindKey) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
          func = thisBinding[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
        if (this instanceof bound) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
          thisBinding = baseCreate(func.prototype);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
          var result = func.apply(thisBinding, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
          return isObject(result) ? result : thisBinding;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
        return func.apply(thisBinding, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
      setBindData(bound, bindData);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
      return bound;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
     * The base implementation of `_.difference` that accepts a single array
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
     * of values to exclude.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
     * @param {Array} array The array to process.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
     * @param {Array} [values] The array of values to exclude.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
     * @returns {Array} Returns a new array of filtered values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
    function baseDifference(array, values) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
          indexOf = getIndexOf(),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
          length = array ? array.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
          isLarge = length >= largeArraySize && indexOf === baseIndexOf,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
          result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
      if (isLarge) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
        var cache = createCache(values);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
        if (cache) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
          indexOf = cacheIndexOf;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
          values = cache;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
        } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
          isLarge = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
        var value = array[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
        if (indexOf(values, value) < 0) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
          result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
      if (isLarge) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
        releaseObject(values);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
     * The base implementation of `_.flatten` without support for callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
     * shorthands or `thisArg` binding.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
     * @param {Array} array The array to flatten.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
     * @param {number} [fromIndex=0] The index to start from.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
     * @returns {Array} Returns a new flattened array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
    function baseFlatten(array, isShallow, isStrict, fromIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
      var index = (fromIndex || 0) - 1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
          length = array ? array.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
          result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
        var value = array[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
        if (value && typeof value == 'object' && typeof value.length == 'number'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
            && (isArray(value) || isArguments(value))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
          // recursively flatten arrays (susceptible to call stack limits)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
          if (!isShallow) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
            value = baseFlatten(value, isShallow, isStrict);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
          var valIndex = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
              valLength = value.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
              resIndex = result.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
          result.length += valLength;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
          while (++valIndex < valLength) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
            result[resIndex++] = value[valIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
        } else if (!isStrict) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
          result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
     * The base implementation of `_.isEqual`, without support for `thisArg` binding,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
     * that allows partial "_.where" style comparisons.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
     * @param {*} a The value to compare.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
     * @param {*} b The other value to compare.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
     * @param {Function} [callback] The function to customize comparing values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
     * @param {Array} [stackA=[]] Tracks traversed `a` objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
     * @param {Array} [stackB=[]] Tracks traversed `b` objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
      // used to indicate that when comparing objects, `a` has at least the properties of `b`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
      if (callback) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
        var result = callback(a, b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
        if (typeof result != 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
          return !!result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
      // exit early for identical values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
      if (a === b) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
        // treat `+0` vs. `-0` as not equal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
        return a !== 0 || (1 / a == 1 / b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
      var type = typeof a,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
          otherType = typeof b;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
      // exit early for unlike primitive values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
      if (a === a &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
          !(a && objectTypes[type]) &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
          !(b && objectTypes[otherType])) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
        return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
      // http://es5.github.io/#x15.3.4.4
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
      if (a == null || b == null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
        return a === b;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
      // compare [[Class]] names
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
      var className = toString.call(a),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
          otherClass = toString.call(b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
      if (className == argsClass) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
        className = objectClass;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
      if (otherClass == argsClass) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
        otherClass = objectClass;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
      if (className != otherClass) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
        return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
      switch (className) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
        case boolClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
        case dateClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
          // coerce dates and booleans to numbers, dates to milliseconds and booleans
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
          return +a == +b;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
        case numberClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
          // treat `NaN` vs. `NaN` as equal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
          return (a != +a)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
            ? b != +b
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
            // but treat `+0` vs. `-0` as not equal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
            : (a == 0 ? (1 / a == 1 / b) : a == +b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
        case regexpClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
        case stringClass:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
          // treat string primitives and their corresponding object instances as equal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
          return a == String(b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
      var isArr = className == arrayClass;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
      if (!isArr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
        // unwrap any `lodash` wrapped values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
            bWrapped = hasOwnProperty.call(b, '__wrapped__');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
        if (aWrapped || bWrapped) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
        // exit for functions and DOM nodes
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
        if (className != objectClass) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
          return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
        // in older versions of Opera, `arguments` objects have `Array` constructors
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
        var ctorA = a.constructor,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
            ctorB = b.constructor;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
        // non `Object` object instances with different constructors are not equal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
        if (ctorA != ctorB &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
              ('constructor' in a && 'constructor' in b)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
            ) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
          return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
      // assume cyclic structures are equal
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
      // the algorithm for detecting cyclic structures is adapted from ES 5.1
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
      var initedStack = !stackA;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
      stackA || (stackA = getArray());
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
      stackB || (stackB = getArray());
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
      var length = stackA.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
      while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
        if (stackA[length] == a) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
          return stackB[length] == b;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
      var size = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
      result = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
      // add `a` and `b` to the stack of traversed objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
      stackA.push(a);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
      stackB.push(b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
      // recursively compare objects and arrays (susceptible to call stack limits)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
      if (isArr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
        // compare lengths to determine if a deep comparison is necessary
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
        length = a.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
        size = b.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
        result = size == length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
        if (result || isWhere) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
          // deep compare the contents, ignoring non-numeric properties
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
          while (size--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
            var index = length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
                value = b[size];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
            if (isWhere) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
              while (index--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
                  break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
                }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
              }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
              break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
      else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
        // which, in this case, is more costly
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
        forIn(b, function(value, key, b) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
          if (hasOwnProperty.call(b, key)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
            // count the number of properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
            size++;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
            // deep compare each property value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
        if (result && !isWhere) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
          // ensure both objects have the same number of properties
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
          forIn(a, function(value, key, a) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
            if (hasOwnProperty.call(a, key)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
              // `size` will be `-1` if `a` has more properties than `b`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
              return (result = --size > -1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
          });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
      stackA.pop();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
      stackB.pop();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
      if (initedStack) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
        releaseArray(stackA);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
        releaseArray(stackB);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
     * The base implementation of `_.merge` without argument juggling or support
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
     * for `thisArg` binding.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
     * @param {Object} object The destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
     * @param {Object} source The source object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
     * @param {Function} [callback] The function to customize merging properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
     * @param {Array} [stackA=[]] Tracks traversed source objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
     * @param {Array} [stackB=[]] Associates values with source counterparts.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
    function baseMerge(object, source, callback, stackA, stackB) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
      (isArray(source) ? forEach : forOwn)(source, function(source, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
        var found,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
            isArr,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
            result = source,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
            value = object[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
          // avoid merging previously merged cyclic sources
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
          var stackLength = stackA.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
          while (stackLength--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
            if ((found = stackA[stackLength] == source)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
              value = stackB[stackLength];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
              break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
          if (!found) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
            var isShallow;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
            if (callback) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
              result = callback(value, source);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
              if ((isShallow = typeof result != 'undefined')) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
                value = result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
              }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
            if (!isShallow) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
              value = isArr
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
                ? (isArray(value) ? value : [])
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
                : (isPlainObject(value) ? value : {});
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
            // add `source` and associated `value` to the stack of traversed objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
            stackA.push(source);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
            stackB.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
            // recursively merge objects and arrays (susceptible to call stack limits)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
            if (!isShallow) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
              baseMerge(value, source, callback, stackA, stackB);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
        else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
          if (callback) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
            result = callback(value, source);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
            if (typeof result == 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
              result = source;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
          if (typeof result != 'undefined') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
            value = result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
        object[key] = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
     * The base implementation of `_.random` without argument juggling or support
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
     * for returning floating-point numbers.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
     * @param {number} min The minimum possible value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
     * @param {number} max The maximum possible value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
     * @returns {number} Returns a random number.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
    function baseRandom(min, max) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
      return min + floor(nativeRandom() * (max - min + 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
     * The base implementation of `_.uniq` without support for callback shorthands
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
     * or `thisArg` binding.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
     * @param {Array} array The array to process.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
     * @param {Function} [callback] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
     * @returns {Array} Returns a duplicate-value-free array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
    function baseUniq(array, isSorted, callback) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
          indexOf = getIndexOf(),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
          length = array ? array.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
          result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
          seen = (callback || isLarge) ? getArray() : result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
      if (isLarge) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
        var cache = createCache(seen);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
        indexOf = cacheIndexOf;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
        seen = cache;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
        var value = array[index],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
            computed = callback ? callback(value, index, array) : value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
        if (isSorted
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
              ? !index || seen[seen.length - 1] !== computed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
              : indexOf(seen, computed) < 0
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
            ) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
          if (callback || isLarge) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
            seen.push(computed);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
          result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
      if (isLarge) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
        releaseArray(seen.array);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
        releaseObject(seen);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
      } else if (callback) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
        releaseArray(seen);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
     * Creates a function that aggregates a collection, creating an object composed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
     * of keys generated from the results of running each element of the collection
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
     * through a callback. The given `setter` function sets the keys and values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
     * of the composed object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
     * @param {Function} setter The setter function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
     * @returns {Function} Returns the new aggregator function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
    function createAggregator(setter) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
      return function(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
        var result = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
        var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
            length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
        if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
          while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1362
            var value = collection[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1363
            setter(result, value, callback(value, index, collection), collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
        } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1366
          forOwn(collection, function(value, key, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
            setter(result, value, callback(value, key, collection), collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
          });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
        return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1374
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1375
     * Creates a function that, when called, either curries or invokes `func`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1376
     * with an optional `this` binding and partially applied arguments.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1377
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1379
     * @param {Function|string} func The function or method name to reference.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
     * @param {number} bitmask The bitmask of method flags to compose.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1381
     *  The bitmask may be composed of the following flags:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
     *  1 - `_.bind`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
     *  2 - `_.bindKey`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
     *  4 - `_.curry`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
     *  8 - `_.curry` (bound)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1386
     *  16 - `_.partial`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
     *  32 - `_.partialRight`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
     * @param {Array} [partialArgs] An array of arguments to prepend to those
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
     *  provided to the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
     * @param {Array} [partialRightArgs] An array of arguments to append to those
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
     *  provided to the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1392
     * @param {*} [thisArg] The `this` binding of `func`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1393
     * @param {number} [arity] The arity of `func`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
     * @returns {Function} Returns the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1397
      var isBind = bitmask & 1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
          isBindKey = bitmask & 2,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
          isCurry = bitmask & 4,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1400
          isCurryBound = bitmask & 8,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1401
          isPartial = bitmask & 16,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1402
          isPartialRight = bitmask & 32;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1403
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1404
      if (!isBindKey && !isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
      if (isPartial && !partialArgs.length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
        bitmask &= ~16;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1409
        isPartial = partialArgs = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1410
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1411
      if (isPartialRight && !partialRightArgs.length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1412
        bitmask &= ~32;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1413
        isPartialRight = partialRightArgs = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1415
      var bindData = func && func.__bindData__;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1416
      if (bindData && bindData !== true) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1417
        // clone `bindData`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1418
        bindData = slice(bindData);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1419
        if (bindData[2]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
          bindData[2] = slice(bindData[2]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
        if (bindData[3]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
          bindData[3] = slice(bindData[3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
        // set `thisBinding` is not previously bound
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1426
        if (isBind && !(bindData[1] & 1)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1427
          bindData[4] = thisArg;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1428
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1429
        // set if previously bound but not currently (subsequent curried functions)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1430
        if (!isBind && bindData[1] & 1) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
          bitmask |= 8;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
        // set curried arity if not yet set
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
        if (isCurry && !(bindData[1] & 4)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
          bindData[5] = arity;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
        // append partial left arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
        if (isPartial) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
          push.apply(bindData[2] || (bindData[2] = []), partialArgs);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
        // append partial right arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
        if (isPartialRight) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
        // merge flags
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
        bindData[1] |= bitmask;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
        return createWrapper.apply(null, bindData);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
      // fast path for `_.bind`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1455
     * Used by `escape` to convert characters to HTML entities.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1456
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
     * @param {string} match The matched character to escape.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
     * @returns {string} Returns the escaped character.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
    function escapeHtmlChar(match) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
      return htmlEscapes[match];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1465
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1466
     * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1467
     * customized, this method returns the custom method, otherwise it returns
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1468
     * the `baseIndexOf` function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1470
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
     * @returns {Function} Returns the "indexOf" function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
    function getIndexOf() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1478
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1479
     * Checks if `value` is a native function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
    function isNative(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
      return typeof value == 'function' && reNative.test(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1487
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1488
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1489
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1490
     * Sets `this` binding data on a given function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1493
     * @param {Function} func The function to set data on.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1494
     * @param {Array} value The data array to set.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
    var setBindData = !defineProperty ? noop : function(func, value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1497
      descriptor.value = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
      defineProperty(func, '__bindData__', descriptor);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1499
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
     * A fallback implementation of `isPlainObject` which checks if a given value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1503
     * is an object created by the `Object` constructor, assuming objects created
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1504
     * by the `Object` constructor have no inherited enumerable properties and that
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1505
     * there are no `Object.prototype` extensions.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1506
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1507
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1508
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1509
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
    function shimIsPlainObject(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
      var ctor,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
          result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1515
      // avoid non Object objects, `arguments` objects, and DOM elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1516
      if (!(value && toString.call(value) == objectClass) ||
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
        return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
      // In most environments an object's own properties are iterated before
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
      // its inherited properties. If the last iterated property is an object's
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
      // own property then there are no inherited enumerable properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
      forIn(value, function(value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1524
        result = key;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1525
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
      return typeof result == 'undefined' || hasOwnProperty.call(value, result);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1528
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1530
     * Used by `unescape` to convert HTML entities to characters.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1531
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1532
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1533
     * @param {string} match The matched character to unescape.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1534
     * @returns {string} Returns the unescaped character.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1535
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
    function unescapeHtmlChar(match) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
      return htmlUnescapes[match];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1538
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1539
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1540
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1541
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1542
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1543
     * Checks if `value` is an `arguments` object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1544
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1548
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1549
     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1550
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1551
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1552
     * (function() { return _.isArguments(arguments); })(1, 2, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1553
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1554
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1555
     * _.isArguments([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1556
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1557
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
    function isArguments(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
      return value && typeof value == 'object' && typeof value.length == 'number' &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
        toString.call(value) == argsClass || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1562
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1563
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1564
     * Checks if `value` is an array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1565
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1566
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1567
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1568
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1569
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1570
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1571
     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1572
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1573
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1574
     * (function() { return _.isArray(arguments); })();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1575
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1576
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1577
     * _.isArray([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1578
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1579
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1580
    var isArray = nativeIsArray || function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1581
      return value && typeof value == 'object' && typeof value.length == 'number' &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1582
        toString.call(value) == arrayClass || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1583
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1584
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1585
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
     * A fallback implementation of `Object.keys` which produces an array of the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1587
     * given object's own enumerable property names.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1588
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1589
     * @private
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1590
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1591
     * @param {Object} object The object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1592
     * @returns {Array} Returns an array of property names.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1593
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1594
    var shimKeys = function(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1595
      var index, iterable = object, result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1596
      if (!iterable) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1597
      if (!(objectTypes[typeof object])) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1598
        for (index in iterable) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1599
          if (hasOwnProperty.call(iterable, index)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1600
            result.push(index);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1601
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1602
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1603
      return result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1604
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1605
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1606
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1607
     * Creates an array composed of the own enumerable property names of an object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1608
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1609
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1610
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1611
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1612
     * @param {Object} object The object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1613
     * @returns {Array} Returns an array of property names.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1614
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1615
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1616
     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1617
     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1618
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1619
    var keys = !nativeKeys ? shimKeys : function(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1620
      if (!isObject(object)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1621
        return [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1622
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1623
      return nativeKeys(object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1624
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1625
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1626
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1627
     * Used to convert characters to HTML entities:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1628
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1629
     * Though the `>` character is escaped for symmetry, characters like `>` and `/`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1630
     * don't require escaping in HTML and have no special meaning unless they're part
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1631
     * of a tag or an unquoted attribute value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1632
     * http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact")
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1633
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1634
    var htmlEscapes = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1635
      '&': '&amp;',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1636
      '<': '&lt;',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1637
      '>': '&gt;',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1638
      '"': '&quot;',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1639
      "'": '&#39;'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1640
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1641
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1642
    /** Used to convert HTML entities to characters */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1643
    var htmlUnescapes = invert(htmlEscapes);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1644
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1645
    /** Used to match HTML entities and HTML characters */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1646
    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1647
        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1648
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1649
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1650
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1651
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1652
     * Assigns own enumerable properties of source object(s) to the destination
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1653
     * object. Subsequent sources will overwrite property assignments of previous
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1654
     * sources. If a callback is provided it will be executed to produce the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1655
     * assigned values. The callback is bound to `thisArg` and invoked with two
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1656
     * arguments; (objectValue, sourceValue).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1657
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1658
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1659
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1660
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1661
     * @alias extend
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1662
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1663
     * @param {Object} object The destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1664
     * @param {...Object} [source] The source objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1665
     * @param {Function} [callback] The function to customize assigning values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1666
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1667
     * @returns {Object} Returns the destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1668
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1669
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1670
     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1671
     * // => { 'name': 'fred', 'employer': 'slate' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1672
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1673
     * var defaults = _.partialRight(_.assign, function(a, b) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1674
     *   return typeof a == 'undefined' ? b : a;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1675
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1676
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1677
     * var object = { 'name': 'barney' };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1678
     * defaults(object, { 'name': 'fred', 'employer': 'slate' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1679
     * // => { 'name': 'barney', 'employer': 'slate' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1680
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1681
    var assign = function(object, source, guard) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1682
      var index, iterable = object, result = iterable;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1683
      if (!iterable) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1684
      var args = arguments,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1685
          argsIndex = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1686
          argsLength = typeof guard == 'number' ? 2 : args.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1687
      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1688
        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1689
      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1690
        callback = args[--argsLength];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1691
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1692
      while (++argsIndex < argsLength) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1693
        iterable = args[argsIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1694
        if (iterable && objectTypes[typeof iterable]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1695
        var ownIndex = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1696
            ownProps = objectTypes[typeof iterable] && keys(iterable),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1697
            length = ownProps ? ownProps.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1698
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1699
        while (++ownIndex < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1700
          index = ownProps[ownIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1701
          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1702
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1703
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1704
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1705
      return result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1706
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1707
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1708
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1709
     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1710
     * be cloned, otherwise they will be assigned by reference. If a callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1711
     * is provided it will be executed to produce the cloned values. If the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1712
     * callback returns `undefined` cloning will be handled by the method instead.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
     * The callback is bound to `thisArg` and invoked with one argument; (value).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1714
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
     * @param {*} value The value to clone.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
     * @param {boolean} [isDeep=false] Specify a deep clone.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
     * @param {Function} [callback] The function to customize cloning values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
     * @returns {*} Returns the cloned value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1727
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1728
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1729
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1730
     * var shallow = _.clone(characters);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
     * shallow[0] === characters[0];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
     * var deep = _.clone(characters, true);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
     * deep[0] === characters[0];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1738
     * _.mixin({
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1739
     *   'clone': _.partialRight(_.clone, function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1740
     *     return _.isElement(value) ? value.cloneNode(false) : undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1741
     *   })
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1742
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1743
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1744
     * var clone = _.clone(document.body);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
     * clone.childNodes.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
     * // => 0
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
    function clone(value, isDeep, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
      // allows working with "Collections" methods without using their `index`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
      // and `collection` arguments for `isDeep` and `callback`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1751
      if (typeof isDeep != 'boolean' && isDeep != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1752
        thisArg = callback;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1753
        callback = isDeep;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1754
        isDeep = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1755
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1756
      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1757
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1758
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1759
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1760
     * Creates a deep clone of `value`. If a callback is provided it will be
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1761
     * executed to produce the cloned values. If the callback returns `undefined`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1762
     * cloning will be handled by the method instead. The callback is bound to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1763
     * `thisArg` and invoked with one argument; (value).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1764
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1765
     * Note: This method is loosely based on the structured clone algorithm. Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1766
     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1767
     * objects created by constructors other than `Object` are cloned to plain `Object` objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1768
     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1769
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1770
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1771
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1772
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1773
     * @param {*} value The value to deep clone.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1774
     * @param {Function} [callback] The function to customize cloning values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1775
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1776
     * @returns {*} Returns the deep cloned value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1777
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1778
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1779
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1780
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1781
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1782
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1783
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1784
     * var deep = _.cloneDeep(characters);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1785
     * deep[0] === characters[0];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1786
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1787
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1788
     * var view = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1789
     *   'label': 'docs',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1790
     *   'node': element
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1791
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1792
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1793
     * var clone = _.cloneDeep(view, function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1794
     *   return _.isElement(value) ? value.cloneNode(true) : undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1795
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1796
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1797
     * clone.node == view.node;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1798
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1799
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1800
    function cloneDeep(value, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1801
      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1802
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1803
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1804
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1805
     * Creates an object that inherits from the given `prototype` object. If a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1806
     * `properties` object is provided its own enumerable properties are assigned
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1807
     * to the created object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1808
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1809
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1810
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1811
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1812
     * @param {Object} prototype The object to inherit from.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1813
     * @param {Object} [properties] The properties to assign to the object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1814
     * @returns {Object} Returns the new object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1815
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1816
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1817
     * function Shape() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1818
     *   this.x = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1819
     *   this.y = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1820
     * }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1821
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1822
     * function Circle() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1823
     *   Shape.call(this);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1824
     * }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1825
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1826
     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1827
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1828
     * var circle = new Circle;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1829
     * circle instanceof Circle;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1830
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1831
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1832
     * circle instanceof Shape;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1833
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1834
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1835
    function create(prototype, properties) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1836
      var result = baseCreate(prototype);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1837
      return properties ? assign(result, properties) : result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1838
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1839
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1840
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1841
     * Assigns own enumerable properties of source object(s) to the destination
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1842
     * object for all destination properties that resolve to `undefined`. Once a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1843
     * property is set, additional defaults of the same property will be ignored.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1844
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1845
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1846
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1847
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1848
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1849
     * @param {Object} object The destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1850
     * @param {...Object} [source] The source objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1851
     * @param- {Object} [guard] Allows working with `_.reduce` without using its
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1852
     *  `key` and `object` arguments as sources.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1853
     * @returns {Object} Returns the destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1854
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1855
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1856
     * var object = { 'name': 'barney' };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1857
     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1858
     * // => { 'name': 'barney', 'employer': 'slate' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1859
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1860
    var defaults = function(object, source, guard) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1861
      var index, iterable = object, result = iterable;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1862
      if (!iterable) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1863
      var args = arguments,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1864
          argsIndex = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1865
          argsLength = typeof guard == 'number' ? 2 : args.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1866
      while (++argsIndex < argsLength) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1867
        iterable = args[argsIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1868
        if (iterable && objectTypes[typeof iterable]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1869
        var ownIndex = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1870
            ownProps = objectTypes[typeof iterable] && keys(iterable),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1871
            length = ownProps ? ownProps.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1872
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1873
        while (++ownIndex < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1874
          index = ownProps[ownIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1875
          if (typeof result[index] == 'undefined') result[index] = iterable[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1876
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1877
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1878
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1879
      return result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1880
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1881
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1882
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1883
     * This method is like `_.findIndex` except that it returns the key of the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1884
     * first element that passes the callback check, instead of the element itself.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1885
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1886
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1887
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1888
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1889
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1890
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1891
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1892
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1893
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1894
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1895
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1896
     * @param {Object} object The object to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1897
     * @param {Function|Object|string} [callback=identity] The function called per
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1898
     *  iteration. If a property name or object is provided it will be used to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1899
     *  create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1900
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1901
     * @returns {string|undefined} Returns the key of the found element, else `undefined`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1902
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1903
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1904
     * var characters = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1905
     *   'barney': {  'age': 36, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1906
     *   'fred': {    'age': 40, 'blocked': true },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1907
     *   'pebbles': { 'age': 1,  'blocked': false }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1908
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1909
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1910
     * _.findKey(characters, function(chr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1911
     *   return chr.age < 40;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1912
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1913
     * // => 'barney' (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1914
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1915
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1916
     * _.findKey(characters, { 'age': 1 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1917
     * // => 'pebbles'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1918
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1919
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1920
     * _.findKey(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1921
     * // => 'fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1922
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1923
    function findKey(object, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1924
      var result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1925
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1926
      forOwn(object, function(value, key, object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1927
        if (callback(value, key, object)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1928
          result = key;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1929
          return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1930
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1931
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1932
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1933
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1934
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1935
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1936
     * This method is like `_.findKey` except that it iterates over elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1937
     * of a `collection` in the opposite order.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1938
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1939
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1940
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1941
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1942
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1943
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1944
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1945
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1946
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1947
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1948
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1949
     * @param {Object} object The object to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1950
     * @param {Function|Object|string} [callback=identity] The function called per
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1951
     *  iteration. If a property name or object is provided it will be used to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1952
     *  create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1953
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1954
     * @returns {string|undefined} Returns the key of the found element, else `undefined`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1955
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1956
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1957
     * var characters = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1958
     *   'barney': {  'age': 36, 'blocked': true },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1959
     *   'fred': {    'age': 40, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1960
     *   'pebbles': { 'age': 1,  'blocked': true }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1961
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1962
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1963
     * _.findLastKey(characters, function(chr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1964
     *   return chr.age < 40;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1965
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1966
     * // => returns `pebbles`, assuming `_.findKey` returns `barney`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1967
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1968
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1969
     * _.findLastKey(characters, { 'age': 40 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1970
     * // => 'fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1971
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1972
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1973
     * _.findLastKey(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1974
     * // => 'pebbles'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1975
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1976
    function findLastKey(object, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1977
      var result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1978
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1979
      forOwnRight(object, function(value, key, object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1980
        if (callback(value, key, object)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1981
          result = key;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1982
          return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1983
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1984
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1985
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1986
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1987
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1988
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1989
     * Iterates over own and inherited enumerable properties of an object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1990
     * executing the callback for each property. The callback is bound to `thisArg`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1991
     * and invoked with three arguments; (value, key, object). Callbacks may exit
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1992
     * iteration early by explicitly returning `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1993
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1994
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1995
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1996
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1997
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1998
     * @param {Object} object The object to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1999
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2000
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2001
     * @returns {Object} Returns `object`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2002
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2003
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2004
     * function Shape() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2005
     *   this.x = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2006
     *   this.y = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2007
     * }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2008
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2009
     * Shape.prototype.move = function(x, y) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2010
     *   this.x += x;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2011
     *   this.y += y;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2012
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2013
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2014
     * _.forIn(new Shape, function(value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2015
     *   console.log(key);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2016
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2017
     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2018
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2019
    var forIn = function(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2020
      var index, iterable = collection, result = iterable;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2021
      if (!iterable) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2022
      if (!objectTypes[typeof iterable]) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2023
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2024
        for (index in iterable) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2025
          if (callback(iterable[index], index, collection) === false) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2026
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2027
      return result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2028
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2029
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2030
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2031
     * This method is like `_.forIn` except that it iterates over elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2032
     * of a `collection` in the opposite order.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2033
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2034
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2035
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2036
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2037
     * @param {Object} object The object to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2038
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2039
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2040
     * @returns {Object} Returns `object`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2041
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2042
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2043
     * function Shape() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2044
     *   this.x = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2045
     *   this.y = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2046
     * }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2047
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2048
     * Shape.prototype.move = function(x, y) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2049
     *   this.x += x;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2050
     *   this.y += y;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2051
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2052
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2053
     * _.forInRight(new Shape, function(value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2054
     *   console.log(key);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2055
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2056
     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2057
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2058
    function forInRight(object, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2059
      var pairs = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2060
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2061
      forIn(object, function(value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2062
        pairs.push(key, value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2063
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2064
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2065
      var length = pairs.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2066
      callback = baseCreateCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2067
      while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2068
        if (callback(pairs[length--], pairs[length], object) === false) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2069
          break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2070
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2071
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2072
      return object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2073
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2074
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2075
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2076
     * Iterates over own enumerable properties of an object, executing the callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2077
     * for each property. The callback is bound to `thisArg` and invoked with three
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2078
     * arguments; (value, key, object). Callbacks may exit iteration early by
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2079
     * explicitly returning `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2080
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2081
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2082
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2083
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2084
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2085
     * @param {Object} object The object to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2086
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2087
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2088
     * @returns {Object} Returns `object`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2089
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2090
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2091
     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2092
     *   console.log(key);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2093
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2094
     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2095
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2096
    var forOwn = function(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2097
      var index, iterable = collection, result = iterable;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2098
      if (!iterable) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2099
      if (!objectTypes[typeof iterable]) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2100
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2101
        var ownIndex = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2102
            ownProps = objectTypes[typeof iterable] && keys(iterable),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2103
            length = ownProps ? ownProps.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2104
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2105
        while (++ownIndex < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2106
          index = ownProps[ownIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2107
          if (callback(iterable[index], index, collection) === false) return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2108
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2109
      return result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2110
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2111
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2112
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2113
     * This method is like `_.forOwn` except that it iterates over elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2114
     * of a `collection` in the opposite order.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2115
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2116
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2117
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2118
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2119
     * @param {Object} object The object to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2120
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2121
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2122
     * @returns {Object} Returns `object`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2123
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2124
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2125
     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2126
     *   console.log(key);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2127
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2128
     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2129
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2130
    function forOwnRight(object, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2131
      var props = keys(object),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2132
          length = props.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2133
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2134
      callback = baseCreateCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2135
      while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2136
        var key = props[length];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2137
        if (callback(object[key], key, object) === false) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2138
          break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2139
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2140
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2141
      return object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2142
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2143
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2144
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2145
     * Creates a sorted array of property names of all enumerable properties,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2146
     * own and inherited, of `object` that have function values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2147
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2148
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2149
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2150
     * @alias methods
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2151
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2152
     * @param {Object} object The object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2153
     * @returns {Array} Returns an array of property names that have function values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2154
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2155
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2156
     * _.functions(_);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2157
     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2158
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2159
    function functions(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2160
      var result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2161
      forIn(object, function(value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2162
        if (isFunction(value)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2163
          result.push(key);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2164
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2165
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2166
      return result.sort();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2167
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2168
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2169
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2170
     * Checks if the specified property name exists as a direct property of `object`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2171
     * instead of an inherited property.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2172
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2173
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2174
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2175
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2176
     * @param {Object} object The object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2177
     * @param {string} key The name of the property to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2178
     * @returns {boolean} Returns `true` if key is a direct property, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2179
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2180
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2181
     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2182
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2183
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2184
    function has(object, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2185
      return object ? hasOwnProperty.call(object, key) : false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2186
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2187
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2188
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2189
     * Creates an object composed of the inverted keys and values of the given object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2190
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2191
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2192
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2193
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2194
     * @param {Object} object The object to invert.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2195
     * @returns {Object} Returns the created inverted object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2196
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2197
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2198
     * _.invert({ 'first': 'fred', 'second': 'barney' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2199
     * // => { 'fred': 'first', 'barney': 'second' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2200
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2201
    function invert(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2202
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2203
          props = keys(object),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2204
          length = props.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2205
          result = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2206
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2207
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2208
        var key = props[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2209
        result[object[key]] = key;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2210
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2211
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2212
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2213
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2214
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2215
     * Checks if `value` is a boolean value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2216
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2217
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2218
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2219
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2220
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2221
     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2222
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2223
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2224
     * _.isBoolean(null);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2225
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2226
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2227
    function isBoolean(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2228
      return value === true || value === false ||
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2229
        value && typeof value == 'object' && toString.call(value) == boolClass || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2230
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2231
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2232
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2233
     * Checks if `value` is a date.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2234
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2235
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2236
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2237
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2238
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2239
     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2240
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2241
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2242
     * _.isDate(new Date);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2243
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2244
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2245
    function isDate(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2246
      return value && typeof value == 'object' && toString.call(value) == dateClass || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2247
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2248
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2249
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2250
     * Checks if `value` is a DOM element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2251
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2252
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2253
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2254
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2255
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2256
     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2257
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2258
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2259
     * _.isElement(document.body);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2260
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2261
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2262
    function isElement(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2263
      return value && value.nodeType === 1 || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2264
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2265
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2266
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2267
     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2268
     * length of `0` and objects with no own enumerable properties are considered
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2269
     * "empty".
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2270
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2271
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2272
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2273
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2274
     * @param {Array|Object|string} value The value to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2275
     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2276
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2277
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2278
     * _.isEmpty([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2279
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2280
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2281
     * _.isEmpty({});
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2282
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2283
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2284
     * _.isEmpty('');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2285
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2286
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2287
    function isEmpty(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2288
      var result = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2289
      if (!value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2290
        return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2291
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2292
      var className = toString.call(value),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2293
          length = value.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2294
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2295
      if ((className == arrayClass || className == stringClass || className == argsClass ) ||
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2296
          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2297
        return !length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2298
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2299
      forOwn(value, function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2300
        return (result = false);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2301
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2302
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2303
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2304
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2305
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2306
     * Performs a deep comparison between two values to determine if they are
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2307
     * equivalent to each other. If a callback is provided it will be executed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2308
     * to compare values. If the callback returns `undefined` comparisons will
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2309
     * be handled by the method instead. The callback is bound to `thisArg` and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2310
     * invoked with two arguments; (a, b).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2311
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2312
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2313
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2314
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2315
     * @param {*} a The value to compare.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2316
     * @param {*} b The other value to compare.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2317
     * @param {Function} [callback] The function to customize comparing values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2318
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2319
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2320
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2321
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2322
     * var object = { 'name': 'fred' };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2323
     * var copy = { 'name': 'fred' };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2324
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2325
     * object == copy;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2326
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2327
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2328
     * _.isEqual(object, copy);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2329
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2330
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2331
     * var words = ['hello', 'goodbye'];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2332
     * var otherWords = ['hi', 'goodbye'];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2333
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2334
     * _.isEqual(words, otherWords, function(a, b) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2335
     *   var reGreet = /^(?:hello|hi)$/i,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2336
     *       aGreet = _.isString(a) && reGreet.test(a),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2337
     *       bGreet = _.isString(b) && reGreet.test(b);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2338
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2339
     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2340
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2341
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2342
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2343
    function isEqual(a, b, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2344
      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2345
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2346
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2347
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2348
     * Checks if `value` is, or can be coerced to, a finite number.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2349
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2350
     * Note: This is not the same as native `isFinite` which will return true for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2351
     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2352
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2353
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2354
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2355
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2356
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2357
     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2358
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2359
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2360
     * _.isFinite(-101);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2361
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2362
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2363
     * _.isFinite('10');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2364
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2365
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2366
     * _.isFinite(true);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2367
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2368
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2369
     * _.isFinite('');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2370
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2371
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2372
     * _.isFinite(Infinity);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2373
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2374
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2375
    function isFinite(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2376
      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2377
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2378
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2379
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2380
     * Checks if `value` is a function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2381
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2382
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2383
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2384
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2385
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2386
     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2387
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2388
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2389
     * _.isFunction(_);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2390
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2391
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2392
    function isFunction(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2393
      return typeof value == 'function';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2394
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2395
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2396
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2397
     * Checks if `value` is the language type of Object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2398
     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2399
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2400
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2401
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2402
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2403
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2404
     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2405
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2406
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2407
     * _.isObject({});
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2408
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2409
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2410
     * _.isObject([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2411
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2412
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2413
     * _.isObject(1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2414
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2415
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2416
    function isObject(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2417
      // check if the value is the ECMAScript language type of Object
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2418
      // http://es5.github.io/#x8
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2419
      // and avoid a V8 bug
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2420
      // http://code.google.com/p/v8/issues/detail?id=2291
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2421
      return !!(value && objectTypes[typeof value]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2422
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2423
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2424
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2425
     * Checks if `value` is `NaN`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2426
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2427
     * Note: This is not the same as native `isNaN` which will return `true` for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2428
     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2429
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2430
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2431
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2432
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2433
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2434
     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2435
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2436
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2437
     * _.isNaN(NaN);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2438
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2439
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2440
     * _.isNaN(new Number(NaN));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2441
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2442
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2443
     * isNaN(undefined);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2444
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2445
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2446
     * _.isNaN(undefined);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2447
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2448
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2449
    function isNaN(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2450
      // `NaN` as a primitive is the only value that is not equal to itself
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2451
      // (perform the [[Class]] check first to avoid errors with some host objects in IE)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2452
      return isNumber(value) && value != +value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2453
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2454
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2455
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2456
     * Checks if `value` is `null`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2457
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2458
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2459
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2460
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2461
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2462
     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2463
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2464
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2465
     * _.isNull(null);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2466
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2467
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2468
     * _.isNull(undefined);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2469
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2470
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2471
    function isNull(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2472
      return value === null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2473
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2474
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2475
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2476
     * Checks if `value` is a number.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2477
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2478
     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2479
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2480
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2481
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2482
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2483
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2484
     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2485
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2486
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2487
     * _.isNumber(8.4 * 5);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2488
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2489
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2490
    function isNumber(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2491
      return typeof value == 'number' ||
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2492
        value && typeof value == 'object' && toString.call(value) == numberClass || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2493
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2494
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2495
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2496
     * Checks if `value` is an object created by the `Object` constructor.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2497
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2498
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2499
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2500
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2501
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2502
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2503
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2504
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2505
     * function Shape() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2506
     *   this.x = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2507
     *   this.y = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2508
     * }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2509
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2510
     * _.isPlainObject(new Shape);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2511
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2512
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2513
     * _.isPlainObject([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2514
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2515
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2516
     * _.isPlainObject({ 'x': 0, 'y': 0 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2517
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2518
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2519
    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2520
      if (!(value && toString.call(value) == objectClass)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2521
        return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2522
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2523
      var valueOf = value.valueOf,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2524
          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2525
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2526
      return objProto
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2527
        ? (value == objProto || getPrototypeOf(value) == objProto)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2528
        : shimIsPlainObject(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2529
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2530
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2531
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2532
     * Checks if `value` is a regular expression.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2533
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2534
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2535
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2536
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2537
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2538
     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2539
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2540
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2541
     * _.isRegExp(/fred/);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2542
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2543
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2544
    function isRegExp(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2545
      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2546
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2547
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2548
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2549
     * Checks if `value` is a string.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2550
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2551
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2552
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2553
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2554
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2555
     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2556
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2557
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2558
     * _.isString('fred');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2559
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2560
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2561
    function isString(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2562
      return typeof value == 'string' ||
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2563
        value && typeof value == 'object' && toString.call(value) == stringClass || false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2564
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2565
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2566
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2567
     * Checks if `value` is `undefined`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2568
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2569
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2570
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2571
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2572
     * @param {*} value The value to check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2573
     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2574
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2575
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2576
     * _.isUndefined(void 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2577
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2578
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2579
    function isUndefined(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2580
      return typeof value == 'undefined';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2581
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2582
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2583
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2584
     * Creates an object with the same keys as `object` and values generated by
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2585
     * running each own enumerable property of `object` through the callback.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2586
     * The callback is bound to `thisArg` and invoked with three arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2587
     * (value, key, object).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2588
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2589
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2590
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2591
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2592
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2593
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2594
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2595
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2596
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2597
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2598
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2599
     * @param {Object} object The object to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2600
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2601
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2602
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2603
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2604
     * @returns {Array} Returns a new object with values of the results of each `callback` execution.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2605
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2606
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2607
     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2608
     * // => { 'a': 3, 'b': 6, 'c': 9 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2609
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2610
     * var characters = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2611
     *   'fred': { 'name': 'fred', 'age': 40 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2612
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2613
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2614
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2615
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2616
     * _.mapValues(characters, 'age');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2617
     * // => { 'fred': 40, 'pebbles': 1 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2618
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2619
    function mapValues(object, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2620
      var result = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2621
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2622
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2623
      forOwn(object, function(value, key, object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2624
        result[key] = callback(value, key, object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2625
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2626
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2627
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2628
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2629
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2630
     * Recursively merges own enumerable properties of the source object(s), that
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2631
     * don't resolve to `undefined` into the destination object. Subsequent sources
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2632
     * will overwrite property assignments of previous sources. If a callback is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2633
     * provided it will be executed to produce the merged values of the destination
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2634
     * and source properties. If the callback returns `undefined` merging will
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2635
     * be handled by the method instead. The callback is bound to `thisArg` and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2636
     * invoked with two arguments; (objectValue, sourceValue).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2637
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2638
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2639
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2640
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2641
     * @param {Object} object The destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2642
     * @param {...Object} [source] The source objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2643
     * @param {Function} [callback] The function to customize merging properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2644
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2645
     * @returns {Object} Returns the destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2646
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2647
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2648
     * var names = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2649
     *   'characters': [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2650
     *     { 'name': 'barney' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2651
     *     { 'name': 'fred' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2652
     *   ]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2653
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2654
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2655
     * var ages = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2656
     *   'characters': [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2657
     *     { 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2658
     *     { 'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2659
     *   ]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2660
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2661
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2662
     * _.merge(names, ages);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2663
     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2664
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2665
     * var food = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2666
     *   'fruits': ['apple'],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2667
     *   'vegetables': ['beet']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2668
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2669
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2670
     * var otherFood = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2671
     *   'fruits': ['banana'],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2672
     *   'vegetables': ['carrot']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2673
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2674
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2675
     * _.merge(food, otherFood, function(a, b) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2676
     *   return _.isArray(a) ? a.concat(b) : undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2677
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2678
     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2679
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2680
    function merge(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2681
      var args = arguments,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2682
          length = 2;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2683
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2684
      if (!isObject(object)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2685
        return object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2686
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2687
      // allows working with `_.reduce` and `_.reduceRight` without using
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2688
      // their `index` and `collection` arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2689
      if (typeof args[2] != 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2690
        length = args.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2691
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2692
      if (length > 3 && typeof args[length - 2] == 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2693
        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2694
      } else if (length > 2 && typeof args[length - 1] == 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2695
        callback = args[--length];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2696
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2697
      var sources = slice(arguments, 1, length),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2698
          index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2699
          stackA = getArray(),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2700
          stackB = getArray();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2701
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2702
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2703
        baseMerge(object, sources[index], callback, stackA, stackB);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2704
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2705
      releaseArray(stackA);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2706
      releaseArray(stackB);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2707
      return object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2708
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2709
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2710
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2711
     * Creates a shallow clone of `object` excluding the specified properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2712
     * Property names may be specified as individual arguments or as arrays of
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2713
     * property names. If a callback is provided it will be executed for each
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2714
     * property of `object` omitting the properties the callback returns truey
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2715
     * for. The callback is bound to `thisArg` and invoked with three arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2716
     * (value, key, object).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2717
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2718
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2719
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2720
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2721
     * @param {Object} object The source object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2722
     * @param {Function|...string|string[]} [callback] The properties to omit or the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2723
     *  function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2724
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2725
     * @returns {Object} Returns an object without the omitted properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2726
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2727
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2728
     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2729
     * // => { 'name': 'fred' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2730
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2731
     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2732
     *   return typeof value == 'number';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2733
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2734
     * // => { 'name': 'fred' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2735
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2736
    function omit(object, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2737
      var result = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2738
      if (typeof callback != 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2739
        var props = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2740
        forIn(object, function(value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2741
          props.push(key);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2742
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2743
        props = baseDifference(props, baseFlatten(arguments, true, false, 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2744
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2745
        var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2746
            length = props.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2747
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2748
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2749
          var key = props[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2750
          result[key] = object[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2751
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2752
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2753
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2754
        forIn(object, function(value, key, object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2755
          if (!callback(value, key, object)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2756
            result[key] = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2757
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2758
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2759
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2760
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2761
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2762
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2763
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2764
     * Creates a two dimensional array of an object's key-value pairs,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2765
     * i.e. `[[key1, value1], [key2, value2]]`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2766
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2767
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2768
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2769
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2770
     * @param {Object} object The object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2771
     * @returns {Array} Returns new array of key-value pairs.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2772
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2773
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2774
     * _.pairs({ 'barney': 36, 'fred': 40 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2775
     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2776
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2777
    function pairs(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2778
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2779
          props = keys(object),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2780
          length = props.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2781
          result = Array(length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2782
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2783
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2784
        var key = props[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2785
        result[index] = [key, object[key]];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2786
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2787
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2788
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2789
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2790
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2791
     * Creates a shallow clone of `object` composed of the specified properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2792
     * Property names may be specified as individual arguments or as arrays of
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2793
     * property names. If a callback is provided it will be executed for each
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2794
     * property of `object` picking the properties the callback returns truey
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2795
     * for. The callback is bound to `thisArg` and invoked with three arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2796
     * (value, key, object).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2797
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2798
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2799
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2800
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2801
     * @param {Object} object The source object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2802
     * @param {Function|...string|string[]} [callback] The function called per
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2803
     *  iteration or property names to pick, specified as individual property
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2804
     *  names or arrays of property names.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2805
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2806
     * @returns {Object} Returns an object composed of the picked properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2807
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2808
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2809
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2810
     * // => { 'name': 'fred' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2811
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2812
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2813
     *   return key.charAt(0) != '_';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2814
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2815
     * // => { 'name': 'fred' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2816
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2817
    function pick(object, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2818
      var result = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2819
      if (typeof callback != 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2820
        var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2821
            props = baseFlatten(arguments, true, false, 1),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2822
            length = isObject(object) ? props.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2823
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2824
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2825
          var key = props[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2826
          if (key in object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2827
            result[key] = object[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2828
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2829
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2830
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2831
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2832
        forIn(object, function(value, key, object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2833
          if (callback(value, key, object)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2834
            result[key] = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2835
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2836
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2837
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2838
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2839
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2840
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2841
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2842
     * An alternative to `_.reduce` this method transforms `object` to a new
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2843
     * `accumulator` object which is the result of running each of its own
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2844
     * enumerable properties through a callback, with each callback execution
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2845
     * potentially mutating the `accumulator` object. The callback is bound to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2846
     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2847
     * Callbacks may exit iteration early by explicitly returning `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2848
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2849
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2850
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2851
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2852
     * @param {Array|Object} object The object to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2853
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2854
     * @param {*} [accumulator] The custom accumulator value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2855
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2856
     * @returns {*} Returns the accumulated value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2857
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2858
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2859
     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2860
     *   num *= num;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2861
     *   if (num % 2) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2862
     *     return result.push(num) < 3;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2863
     *   }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2864
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2865
     * // => [1, 9, 25]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2866
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2867
     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2868
     *   result[key] = num * 3;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2869
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2870
     * // => { 'a': 3, 'b': 6, 'c': 9 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2871
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2872
    function transform(object, callback, accumulator, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2873
      var isArr = isArray(object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2874
      if (accumulator == null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2875
        if (isArr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2876
          accumulator = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2877
        } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2878
          var ctor = object && object.constructor,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2879
              proto = ctor && ctor.prototype;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2880
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2881
          accumulator = baseCreate(proto);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2882
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2883
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2884
      if (callback) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2885
        callback = lodash.createCallback(callback, thisArg, 4);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2886
        (isArr ? forEach : forOwn)(object, function(value, index, object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2887
          return callback(accumulator, value, index, object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2888
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2889
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2890
      return accumulator;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2891
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2892
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2893
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2894
     * Creates an array composed of the own enumerable property values of `object`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2895
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2896
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2897
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2898
     * @category Objects
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2899
     * @param {Object} object The object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2900
     * @returns {Array} Returns an array of property values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2901
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2902
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2903
     * _.values({ 'one': 1, 'two': 2, 'three': 3 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2904
     * // => [1, 2, 3] (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2905
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2906
    function values(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2907
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2908
          props = keys(object),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2909
          length = props.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2910
          result = Array(length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2911
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2912
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2913
        result[index] = object[props[index]];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2914
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2915
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2916
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2917
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2918
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2919
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2920
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2921
     * Creates an array of elements from the specified indexes, or keys, of the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2922
     * `collection`. Indexes may be specified as individual arguments or as arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2923
     * of indexes.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2924
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2925
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2926
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2927
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2928
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2929
     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2930
     *   to retrieve, specified as individual indexes or arrays of indexes.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2931
     * @returns {Array} Returns a new array of elements corresponding to the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2932
     *  provided indexes.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2933
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2934
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2935
     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2936
     * // => ['a', 'c', 'e']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2937
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2938
     * _.at(['fred', 'barney', 'pebbles'], 0, 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2939
     * // => ['fred', 'pebbles']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2940
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2941
    function at(collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2942
      var args = arguments,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2943
          index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2944
          props = baseFlatten(args, true, false, 1),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2945
          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2946
          result = Array(length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2947
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2948
      while(++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2949
        result[index] = collection[props[index]];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2950
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2951
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2952
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2953
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2954
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2955
     * Checks if a given value is present in a collection using strict equality
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2956
     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2957
     * offset from the end of the collection.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2958
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2959
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2960
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2961
     * @alias include
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2962
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2963
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2964
     * @param {*} target The value to check for.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2965
     * @param {number} [fromIndex=0] The index to search from.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2966
     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2967
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2968
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2969
     * _.contains([1, 2, 3], 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2970
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2971
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2972
     * _.contains([1, 2, 3], 1, 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2973
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2974
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2975
     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2976
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2977
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2978
     * _.contains('pebbles', 'eb');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2979
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2980
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2981
    function contains(collection, target, fromIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2982
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2983
          indexOf = getIndexOf(),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2984
          length = collection ? collection.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2985
          result = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2986
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2987
      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2988
      if (isArray(collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2989
        result = indexOf(collection, target, fromIndex) > -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2990
      } else if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2991
        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2992
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2993
        forOwn(collection, function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2994
          if (++index >= fromIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2995
            return !(result = value === target);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2996
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2997
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2998
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2999
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3000
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3001
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3002
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3003
     * Creates an object composed of keys generated from the results of running
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3004
     * each element of `collection` through the callback. The corresponding value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3005
     * of each key is the number of times the key was returned by the callback.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3006
     * The callback is bound to `thisArg` and invoked with three arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3007
     * (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3008
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3009
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3010
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3011
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3012
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3013
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3014
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3015
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3016
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3017
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3018
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3019
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3020
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3021
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3022
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3023
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3024
     * @returns {Object} Returns the composed aggregate object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3025
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3026
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3027
     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3028
     * // => { '4': 1, '6': 2 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3029
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3030
     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3031
     * // => { '4': 1, '6': 2 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3032
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3033
     * _.countBy(['one', 'two', 'three'], 'length');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3034
     * // => { '3': 2, '5': 1 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3035
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3036
    var countBy = createAggregator(function(result, value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3037
      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3038
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3039
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3040
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3041
     * Checks if the given callback returns truey value for **all** elements of
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3042
     * a collection. The callback is bound to `thisArg` and invoked with three
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3043
     * arguments; (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3044
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3045
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3046
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3047
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3048
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3049
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3050
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3051
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3052
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3053
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3054
     * @alias all
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3055
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3056
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3057
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3058
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3059
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3060
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3061
     * @returns {boolean} Returns `true` if all elements passed the callback check,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3062
     *  else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3063
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3064
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3065
     * _.every([true, 1, null, 'yes']);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3066
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3067
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3068
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3069
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3070
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3071
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3072
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3073
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3074
     * _.every(characters, 'age');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3075
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3076
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3077
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3078
     * _.every(characters, { 'age': 36 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3079
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3080
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3081
    function every(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3082
      var result = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3083
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3084
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3085
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3086
          length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3087
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3088
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3089
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3090
          if (!(result = !!callback(collection[index], index, collection))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3091
            break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3092
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3093
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3094
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3095
        forOwn(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3096
          return (result = !!callback(value, index, collection));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3097
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3098
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3099
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3100
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3101
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3102
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3103
     * Iterates over elements of a collection, returning an array of all elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3104
     * the callback returns truey for. The callback is bound to `thisArg` and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3105
     * invoked with three arguments; (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3106
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3107
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3108
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3109
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3110
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3111
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3112
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3113
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3114
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3115
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3116
     * @alias select
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3117
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3118
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3119
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3120
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3121
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3122
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3123
     * @returns {Array} Returns a new array of elements that passed the callback check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3124
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3125
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3126
     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3127
     * // => [2, 4, 6]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3128
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3129
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3130
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3131
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3132
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3133
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3134
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3135
     * _.filter(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3136
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3137
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3138
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3139
     * _.filter(characters, { 'age': 36 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3140
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3141
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3142
    function filter(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3143
      var result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3144
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3145
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3146
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3147
          length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3148
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3149
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3150
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3151
          var value = collection[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3152
          if (callback(value, index, collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3153
            result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3154
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3155
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3156
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3157
        forOwn(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3158
          if (callback(value, index, collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3159
            result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3160
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3161
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3162
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3163
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3164
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3165
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3166
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3167
     * Iterates over elements of a collection, returning the first element that
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3168
     * the callback returns truey for. The callback is bound to `thisArg` and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3169
     * invoked with three arguments; (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3170
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3171
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3172
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3173
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3174
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3175
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3176
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3177
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3178
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3179
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3180
     * @alias detect, findWhere
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3181
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3182
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3183
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3184
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3185
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3186
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3187
     * @returns {*} Returns the found element, else `undefined`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3188
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3189
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3190
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3191
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3192
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3193
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3194
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3195
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3196
     * _.find(characters, function(chr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3197
     *   return chr.age < 40;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3198
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3199
     * // => { 'name': 'barney', 'age': 36, 'blocked': false }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3200
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3201
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3202
     * _.find(characters, { 'age': 1 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3203
     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3204
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3205
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3206
     * _.find(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3207
     * // => { 'name': 'fred', 'age': 40, 'blocked': true }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3208
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3209
    function find(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3210
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3211
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3212
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3213
          length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3214
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3215
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3216
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3217
          var value = collection[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3218
          if (callback(value, index, collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3219
            return value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3220
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3221
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3222
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3223
        var result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3224
        forOwn(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3225
          if (callback(value, index, collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3226
            result = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3227
            return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3228
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3229
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3230
        return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3231
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3232
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3233
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3234
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3235
     * This method is like `_.find` except that it iterates over elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3236
     * of a `collection` from right to left.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3237
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3238
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3239
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3240
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3241
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3242
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3243
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3244
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3245
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3246
     * @returns {*} Returns the found element, else `undefined`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3247
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3248
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3249
     * _.findLast([1, 2, 3, 4], function(num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3250
     *   return num % 2 == 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3251
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3252
     * // => 3
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3253
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3254
    function findLast(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3255
      var result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3256
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3257
      forEachRight(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3258
        if (callback(value, index, collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3259
          result = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3260
          return false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3261
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3262
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3263
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3264
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3265
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3266
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3267
     * Iterates over elements of a collection, executing the callback for each
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3268
     * element. The callback is bound to `thisArg` and invoked with three arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3269
     * (value, index|key, collection). Callbacks may exit iteration early by
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3270
     * explicitly returning `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3271
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3272
     * Note: As with other "Collections" methods, objects with a `length` property
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3273
     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3274
     * may be used for object iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3275
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3276
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3277
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3278
     * @alias each
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3279
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3280
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3281
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3282
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3283
     * @returns {Array|Object|string} Returns `collection`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3284
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3285
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3286
     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3287
     * // => logs each number and returns '1,2,3'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3288
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3289
     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3290
     * // => logs each number and returns the object (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3291
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3292
    function forEach(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3293
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3294
          length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3295
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3296
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3297
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3298
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3299
          if (callback(collection[index], index, collection) === false) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3300
            break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3301
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3302
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3303
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3304
        forOwn(collection, callback);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3305
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3306
      return collection;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3307
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3308
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3309
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3310
     * This method is like `_.forEach` except that it iterates over elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3311
     * of a `collection` from right to left.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3312
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3313
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3314
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3315
     * @alias eachRight
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3316
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3317
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3318
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3319
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3320
     * @returns {Array|Object|string} Returns `collection`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3321
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3322
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3323
     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3324
     * // => logs each number from right to left and returns '3,2,1'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3325
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3326
    function forEachRight(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3327
      var length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3328
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3329
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3330
        while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3331
          if (callback(collection[length], length, collection) === false) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3332
            break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3333
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3334
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3335
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3336
        var props = keys(collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3337
        length = props.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3338
        forOwn(collection, function(value, key, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3339
          key = props ? props[--length] : --length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3340
          return callback(collection[key], key, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3341
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3342
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3343
      return collection;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3344
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3345
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3346
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3347
     * Creates an object composed of keys generated from the results of running
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3348
     * each element of a collection through the callback. The corresponding value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3349
     * of each key is an array of the elements responsible for generating the key.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3350
     * The callback is bound to `thisArg` and invoked with three arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3351
     * (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3352
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3353
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3354
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3355
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3356
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3357
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3358
     * else `false`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3359
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3360
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3361
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3362
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3363
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3364
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3365
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3366
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3367
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3368
     * @returns {Object} Returns the composed aggregate object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3369
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3370
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3371
     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3372
     * // => { '4': [4.2], '6': [6.1, 6.4] }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3373
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3374
     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3375
     * // => { '4': [4.2], '6': [6.1, 6.4] }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3376
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3377
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3378
     * _.groupBy(['one', 'two', 'three'], 'length');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3379
     * // => { '3': ['one', 'two'], '5': ['three'] }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3380
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3381
    var groupBy = createAggregator(function(result, value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3382
      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3383
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3384
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3385
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3386
     * Creates an object composed of keys generated from the results of running
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3387
     * each element of the collection through the given callback. The corresponding
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3388
     * value of each key is the last element responsible for generating the key.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3389
     * The callback is bound to `thisArg` and invoked with three arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3390
     * (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3391
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3392
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3393
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3394
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3395
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3396
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3397
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3398
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3399
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3400
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3401
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3402
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3403
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3404
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3405
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3406
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3407
     * @returns {Object} Returns the composed aggregate object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3408
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3409
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3410
     * var keys = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3411
     *   { 'dir': 'left', 'code': 97 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3412
     *   { 'dir': 'right', 'code': 100 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3413
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3414
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3415
     * _.indexBy(keys, 'dir');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3416
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3417
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3418
     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3419
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3420
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3421
     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3422
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3423
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3424
    var indexBy = createAggregator(function(result, value, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3425
      result[key] = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3426
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3427
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3428
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3429
     * Invokes the method named by `methodName` on each element in the `collection`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3430
     * returning an array of the results of each invoked method. Additional arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3431
     * will be provided to each invoked method. If `methodName` is a function it
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3432
     * will be invoked for, and `this` bound to, each element in the `collection`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3433
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3434
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3435
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3436
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3437
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3438
     * @param {Function|string} methodName The name of the method to invoke or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3439
     *  the function invoked per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3440
     * @param {...*} [arg] Arguments to invoke the method with.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3441
     * @returns {Array} Returns a new array of the results of each invoked method.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3442
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3443
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3444
     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3445
     * // => [[1, 5, 7], [1, 2, 3]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3446
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3447
     * _.invoke([123, 456], String.prototype.split, '');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3448
     * // => [['1', '2', '3'], ['4', '5', '6']]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3449
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3450
    function invoke(collection, methodName) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3451
      var args = slice(arguments, 2),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3452
          index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3453
          isFunc = typeof methodName == 'function',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3454
          length = collection ? collection.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3455
          result = Array(typeof length == 'number' ? length : 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3456
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3457
      forEach(collection, function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3458
        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3459
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3460
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3461
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3462
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3463
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3464
     * Creates an array of values by running each element in the collection
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3465
     * through the callback. The callback is bound to `thisArg` and invoked with
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3466
     * three arguments; (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3467
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3468
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3469
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3470
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3471
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3472
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3473
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3474
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3475
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3476
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3477
     * @alias collect
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3478
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3479
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3480
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3481
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3482
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3483
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3484
     * @returns {Array} Returns a new array of the results of each `callback` execution.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3485
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3486
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3487
     * _.map([1, 2, 3], function(num) { return num * 3; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3488
     * // => [3, 6, 9]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3489
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3490
     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3491
     * // => [3, 6, 9] (property order is not guaranteed across environments)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3492
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3493
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3494
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3495
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3496
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3497
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3498
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3499
     * _.map(characters, 'name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3500
     * // => ['barney', 'fred']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3501
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3502
    function map(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3503
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3504
          length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3505
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3506
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3507
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3508
        var result = Array(length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3509
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3510
          result[index] = callback(collection[index], index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3511
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3512
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3513
        result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3514
        forOwn(collection, function(value, key, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3515
          result[++index] = callback(value, key, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3516
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3517
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3518
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3519
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3520
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3521
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3522
     * Retrieves the maximum value of a collection. If the collection is empty or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3523
     * falsey `-Infinity` is returned. If a callback is provided it will be executed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3524
     * for each value in the collection to generate the criterion by which the value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3525
     * is ranked. The callback is bound to `thisArg` and invoked with three
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3526
     * arguments; (value, index, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3527
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3528
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3529
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3530
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3531
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3532
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3533
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3534
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3535
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3536
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3537
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3538
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3539
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3540
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3541
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3542
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3543
     * @returns {*} Returns the maximum value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3544
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3545
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3546
     * _.max([4, 2, 8, 6]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3547
     * // => 8
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3548
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3549
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3550
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3551
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3552
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3553
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3554
     * _.max(characters, function(chr) { return chr.age; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3555
     * // => { 'name': 'fred', 'age': 40 };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3556
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3557
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3558
     * _.max(characters, 'age');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3559
     * // => { 'name': 'fred', 'age': 40 };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3560
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3561
    function max(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3562
      var computed = -Infinity,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3563
          result = computed;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3564
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3565
      // allows working with functions like `_.map` without using
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3566
      // their `index` argument as a callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3567
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3568
        callback = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3569
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3570
      if (callback == null && isArray(collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3571
        var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3572
            length = collection.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3573
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3574
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3575
          var value = collection[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3576
          if (value > result) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3577
            result = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3578
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3579
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3580
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3581
        callback = (callback == null && isString(collection))
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3582
          ? charAtCallback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3583
          : lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3584
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3585
        forEach(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3586
          var current = callback(value, index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3587
          if (current > computed) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3588
            computed = current;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3589
            result = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3590
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3591
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3592
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3593
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3594
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3595
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3596
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3597
     * Retrieves the minimum value of a collection. If the collection is empty or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3598
     * falsey `Infinity` is returned. If a callback is provided it will be executed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3599
     * for each value in the collection to generate the criterion by which the value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3600
     * is ranked. The callback is bound to `thisArg` and invoked with three
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3601
     * arguments; (value, index, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3602
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3603
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3604
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3605
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3606
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3607
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3608
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3609
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3610
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3611
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3612
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3613
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3614
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3615
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3616
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3617
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3618
     * @returns {*} Returns the minimum value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3619
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3620
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3621
     * _.min([4, 2, 8, 6]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3622
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3623
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3624
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3625
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3626
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3627
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3628
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3629
     * _.min(characters, function(chr) { return chr.age; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3630
     * // => { 'name': 'barney', 'age': 36 };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3631
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3632
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3633
     * _.min(characters, 'age');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3634
     * // => { 'name': 'barney', 'age': 36 };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3635
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3636
    function min(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3637
      var computed = Infinity,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3638
          result = computed;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3639
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3640
      // allows working with functions like `_.map` without using
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3641
      // their `index` argument as a callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3642
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3643
        callback = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3644
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3645
      if (callback == null && isArray(collection)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3646
        var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3647
            length = collection.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3648
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3649
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3650
          var value = collection[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3651
          if (value < result) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3652
            result = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3653
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3654
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3655
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3656
        callback = (callback == null && isString(collection))
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3657
          ? charAtCallback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3658
          : lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3659
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3660
        forEach(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3661
          var current = callback(value, index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3662
          if (current < computed) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3663
            computed = current;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3664
            result = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3665
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3666
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3667
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3668
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3669
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3670
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3671
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3672
     * Retrieves the value of a specified property from all elements in the collection.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3673
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3674
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3675
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3676
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3677
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3678
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3679
     * @param {string} property The name of the property to pluck.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3680
     * @returns {Array} Returns a new array of property values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3681
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3682
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3683
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3684
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3685
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3686
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3687
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3688
     * _.pluck(characters, 'name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3689
     * // => ['barney', 'fred']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3690
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3691
    var pluck = map;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3692
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3693
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3694
     * Reduces a collection to a value which is the accumulated result of running
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3695
     * each element in the collection through the callback, where each successive
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3696
     * callback execution consumes the return value of the previous execution. If
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3697
     * `accumulator` is not provided the first element of the collection will be
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3698
     * used as the initial `accumulator` value. The callback is bound to `thisArg`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3699
     * and invoked with four arguments; (accumulator, value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3700
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3701
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3702
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3703
     * @alias foldl, inject
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3704
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3705
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3706
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3707
     * @param {*} [accumulator] Initial value of the accumulator.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3708
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3709
     * @returns {*} Returns the accumulated value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3710
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3711
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3712
     * var sum = _.reduce([1, 2, 3], function(sum, num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3713
     *   return sum + num;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3714
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3715
     * // => 6
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3716
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3717
     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3718
     *   result[key] = num * 3;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3719
     *   return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3720
     * }, {});
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3721
     * // => { 'a': 3, 'b': 6, 'c': 9 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3722
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3723
    function reduce(collection, callback, accumulator, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3724
      if (!collection) return accumulator;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3725
      var noaccum = arguments.length < 3;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3726
      callback = lodash.createCallback(callback, thisArg, 4);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3727
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3728
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3729
          length = collection.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3730
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3731
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3732
        if (noaccum) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3733
          accumulator = collection[++index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3734
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3735
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3736
          accumulator = callback(accumulator, collection[index], index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3737
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3738
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3739
        forOwn(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3740
          accumulator = noaccum
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3741
            ? (noaccum = false, value)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3742
            : callback(accumulator, value, index, collection)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3743
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3744
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3745
      return accumulator;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3746
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3747
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3748
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3749
     * This method is like `_.reduce` except that it iterates over elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3750
     * of a `collection` from right to left.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3751
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3752
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3753
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3754
     * @alias foldr
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3755
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3756
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3757
     * @param {Function} [callback=identity] The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3758
     * @param {*} [accumulator] Initial value of the accumulator.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3759
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3760
     * @returns {*} Returns the accumulated value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3761
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3762
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3763
     * var list = [[0, 1], [2, 3], [4, 5]];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3764
     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3765
     * // => [4, 5, 2, 3, 0, 1]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3766
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3767
    function reduceRight(collection, callback, accumulator, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3768
      var noaccum = arguments.length < 3;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3769
      callback = lodash.createCallback(callback, thisArg, 4);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3770
      forEachRight(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3771
        accumulator = noaccum
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3772
          ? (noaccum = false, value)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3773
          : callback(accumulator, value, index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3774
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3775
      return accumulator;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3776
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3777
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3778
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3779
     * The opposite of `_.filter` this method returns the elements of a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3780
     * collection that the callback does **not** return truey for.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3781
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3782
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3783
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3784
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3785
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3786
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3787
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3788
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3789
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3790
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3791
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3792
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3793
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3794
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3795
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3796
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3797
     * @returns {Array} Returns a new array of elements that failed the callback check.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3798
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3799
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3800
     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3801
     * // => [1, 3, 5]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3802
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3803
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3804
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3805
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3806
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3807
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3808
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3809
     * _.reject(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3810
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3811
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3812
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3813
     * _.reject(characters, { 'age': 36 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3814
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3815
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3816
    function reject(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3817
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3818
      return filter(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3819
        return !callback(value, index, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3820
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3821
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3822
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3823
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3824
     * Retrieves a random element or `n` random elements from a collection.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3825
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3826
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3827
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3828
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3829
     * @param {Array|Object|string} collection The collection to sample.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3830
     * @param {number} [n] The number of elements to sample.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3831
     * @param- {Object} [guard] Allows working with functions like `_.map`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3832
     *  without using their `index` arguments as `n`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3833
     * @returns {Array} Returns the random sample(s) of `collection`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3834
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3835
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3836
     * _.sample([1, 2, 3, 4]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3837
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3838
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3839
     * _.sample([1, 2, 3, 4], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3840
     * // => [3, 1]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3841
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3842
    function sample(collection, n, guard) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3843
      if (collection && typeof collection.length != 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3844
        collection = values(collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3845
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3846
      if (n == null || guard) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3847
        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3848
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3849
      var result = shuffle(collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3850
      result.length = nativeMin(nativeMax(0, n), result.length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3851
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3852
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3853
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3854
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3855
     * Creates an array of shuffled values, using a version of the Fisher-Yates
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3856
     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3857
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3858
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3859
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3860
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3861
     * @param {Array|Object|string} collection The collection to shuffle.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3862
     * @returns {Array} Returns a new shuffled collection.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3863
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3864
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3865
     * _.shuffle([1, 2, 3, 4, 5, 6]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3866
     * // => [4, 1, 6, 3, 5, 2]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3867
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3868
    function shuffle(collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3869
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3870
          length = collection ? collection.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3871
          result = Array(typeof length == 'number' ? length : 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3872
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3873
      forEach(collection, function(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3874
        var rand = baseRandom(0, ++index);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3875
        result[index] = result[rand];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3876
        result[rand] = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3877
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3878
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3879
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3880
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3881
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3882
     * Gets the size of the `collection` by returning `collection.length` for arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3883
     * and array-like objects or the number of own enumerable properties for objects.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3884
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3885
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3886
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3887
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3888
     * @param {Array|Object|string} collection The collection to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3889
     * @returns {number} Returns `collection.length` or number of own enumerable properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3890
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3891
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3892
     * _.size([1, 2]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3893
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3894
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3895
     * _.size({ 'one': 1, 'two': 2, 'three': 3 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3896
     * // => 3
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3897
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3898
     * _.size('pebbles');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3899
     * // => 7
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3900
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3901
    function size(collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3902
      var length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3903
      return typeof length == 'number' ? length : keys(collection).length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3904
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3905
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3906
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3907
     * Checks if the callback returns a truey value for **any** element of a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3908
     * collection. The function returns as soon as it finds a passing value and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3909
     * does not iterate over the entire collection. The callback is bound to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3910
     * `thisArg` and invoked with three arguments; (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3911
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3912
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3913
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3914
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3915
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3916
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3917
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3918
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3919
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3920
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3921
     * @alias any
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3922
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3923
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3924
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3925
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3926
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3927
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3928
     * @returns {boolean} Returns `true` if any element passed the callback check,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3929
     *  else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3930
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3931
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3932
     * _.some([null, 0, 'yes', false], Boolean);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3933
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3934
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3935
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3936
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3937
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3938
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3939
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3940
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3941
     * _.some(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3942
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3943
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3944
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3945
     * _.some(characters, { 'age': 1 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3946
     * // => false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3947
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3948
    function some(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3949
      var result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3950
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3951
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3952
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3953
          length = collection ? collection.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3954
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3955
      if (typeof length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3956
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3957
          if ((result = callback(collection[index], index, collection))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3958
            break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3959
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3960
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3961
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3962
        forOwn(collection, function(value, index, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3963
          return !(result = callback(value, index, collection));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3964
        });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3965
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3966
      return !!result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3967
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3968
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3969
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3970
     * Creates an array of elements, sorted in ascending order by the results of
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3971
     * running each element in a collection through the callback. This method
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3972
     * performs a stable sort, that is, it will preserve the original sort order
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3973
     * of equal elements. The callback is bound to `thisArg` and invoked with
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3974
     * three arguments; (value, index|key, collection).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3975
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3976
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3977
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3978
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3979
     * If an array of property names is provided for `callback` the collection
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3980
     * will be sorted by each property value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3981
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3982
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3983
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3984
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3985
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3986
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3987
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3988
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3989
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3990
     * @param {Array|Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3991
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3992
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3993
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3994
     * @returns {Array} Returns a new array of sorted elements.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3995
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3996
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3997
     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3998
     * // => [3, 1, 2]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3999
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4000
     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4001
     * // => [3, 1, 2]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4002
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4003
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4004
     *   { 'name': 'barney',  'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4005
     *   { 'name': 'fred',    'age': 40 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4006
     *   { 'name': 'barney',  'age': 26 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4007
     *   { 'name': 'fred',    'age': 30 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4008
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4009
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4010
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4011
     * _.map(_.sortBy(characters, 'age'), _.values);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4012
     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4013
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4014
     * // sorting by multiple properties
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4015
     * _.map(_.sortBy(characters, ['name', 'age']), _.values);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4016
     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4017
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4018
    function sortBy(collection, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4019
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4020
          isArr = isArray(callback),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4021
          length = collection ? collection.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4022
          result = Array(typeof length == 'number' ? length : 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4023
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4024
      if (!isArr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4025
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4026
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4027
      forEach(collection, function(value, key, collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4028
        var object = result[++index] = getObject();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4029
        if (isArr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4030
          object.criteria = map(callback, function(key) { return value[key]; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4031
        } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4032
          (object.criteria = getArray())[0] = callback(value, key, collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4033
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4034
        object.index = index;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4035
        object.value = value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4036
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4037
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4038
      length = result.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4039
      result.sort(compareAscending);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4040
      while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4041
        var object = result[length];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4042
        result[length] = object.value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4043
        if (!isArr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4044
          releaseArray(object.criteria);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4045
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4046
        releaseObject(object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4047
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4048
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4049
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4050
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4051
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4052
     * Converts the `collection` to an array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4053
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4054
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4055
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4056
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4057
     * @param {Array|Object|string} collection The collection to convert.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4058
     * @returns {Array} Returns the new converted array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4059
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4060
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4061
     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4062
     * // => [2, 3, 4]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4063
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4064
    function toArray(collection) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4065
      if (collection && typeof collection.length == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4066
        return slice(collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4067
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4068
      return values(collection);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4069
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4070
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4071
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4072
     * Performs a deep comparison of each element in a `collection` to the given
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4073
     * `properties` object, returning an array of all elements that have equivalent
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4074
     * property values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4075
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4076
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4077
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4078
     * @type Function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4079
     * @category Collections
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4080
     * @param {Array|Object|string} collection The collection to iterate over.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4081
     * @param {Object} props The object of property values to filter by.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4082
     * @returns {Array} Returns a new array of elements that have the given properties.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4083
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4084
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4085
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4086
     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4087
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4088
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4089
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4090
     * _.where(characters, { 'age': 36 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4091
     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4092
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4093
     * _.where(characters, { 'pets': ['dino'] });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4094
     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4095
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4096
    var where = filter;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4097
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4098
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4099
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4100
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4101
     * Creates an array with all falsey values removed. The values `false`, `null`,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4102
     * `0`, `""`, `undefined`, and `NaN` are all falsey.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4103
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4104
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4105
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4106
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4107
     * @param {Array} array The array to compact.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4108
     * @returns {Array} Returns a new array of filtered values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4109
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4110
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4111
     * _.compact([0, 1, false, 2, '', 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4112
     * // => [1, 2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4113
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4114
    function compact(array) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4115
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4116
          length = array ? array.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4117
          result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4118
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4119
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4120
        var value = array[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4121
        if (value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4122
          result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4123
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4124
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4125
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4126
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4127
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4128
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4129
     * Creates an array excluding all values of the provided arrays using strict
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4130
     * equality for comparisons, i.e. `===`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4131
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4132
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4133
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4134
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4135
     * @param {Array} array The array to process.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4136
     * @param {...Array} [values] The arrays of values to exclude.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4137
     * @returns {Array} Returns a new array of filtered values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4138
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4139
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4140
     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4141
     * // => [1, 3, 4]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4142
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4143
    function difference(array) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4144
      return baseDifference(array, baseFlatten(arguments, true, true, 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4145
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4146
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4147
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4148
     * This method is like `_.find` except that it returns the index of the first
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4149
     * element that passes the callback check, instead of the element itself.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4150
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4151
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4152
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4153
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4154
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4155
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4156
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4157
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4158
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4159
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4160
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4161
     * @param {Array} array The array to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4162
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4163
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4164
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4165
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4166
     * @returns {number} Returns the index of the found element, else `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4167
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4168
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4169
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4170
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4171
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4172
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4173
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4174
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4175
     * _.findIndex(characters, function(chr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4176
     *   return chr.age < 20;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4177
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4178
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4179
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4180
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4181
     * _.findIndex(characters, { 'age': 36 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4182
     * // => 0
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4183
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4184
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4185
     * _.findIndex(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4186
     * // => 1
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4187
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4188
    function findIndex(array, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4189
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4190
          length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4191
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4192
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4193
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4194
        if (callback(array[index], index, array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4195
          return index;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4196
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4197
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4198
      return -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4199
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4200
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4201
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4202
     * This method is like `_.findIndex` except that it iterates over elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4203
     * of a `collection` from right to left.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4204
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4205
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4206
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4207
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4208
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4209
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4210
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4211
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4212
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4213
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4214
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4215
     * @param {Array} array The array to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4216
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4217
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4218
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4219
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4220
     * @returns {number} Returns the index of the found element, else `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4221
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4222
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4223
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4224
     *   { 'name': 'barney',  'age': 36, 'blocked': true },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4225
     *   { 'name': 'fred',    'age': 40, 'blocked': false },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4226
     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4227
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4228
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4229
     * _.findLastIndex(characters, function(chr) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4230
     *   return chr.age > 30;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4231
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4232
     * // => 1
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4233
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4234
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4235
     * _.findLastIndex(characters, { 'age': 36 });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4236
     * // => 0
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4237
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4238
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4239
     * _.findLastIndex(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4240
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4241
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4242
    function findLastIndex(array, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4243
      var length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4244
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4245
      while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4246
        if (callback(array[length], length, array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4247
          return length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4248
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4249
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4250
      return -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4251
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4252
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4253
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4254
     * Gets the first element or first `n` elements of an array. If a callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4255
     * is provided elements at the beginning of the array are returned as long
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4256
     * as the callback returns truey. The callback is bound to `thisArg` and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4257
     * invoked with three arguments; (value, index, array).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4258
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4259
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4260
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4261
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4262
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4263
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4264
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4265
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4266
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4267
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4268
     * @alias head, take
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4269
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4270
     * @param {Array} array The array to query.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4271
     * @param {Function|Object|number|string} [callback] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4272
     *  per element or the number of elements to return. If a property name or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4273
     *  object is provided it will be used to create a "_.pluck" or "_.where"
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4274
     *  style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4275
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4276
     * @returns {*} Returns the first element(s) of `array`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4277
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4278
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4279
     * _.first([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4280
     * // => 1
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4281
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4282
     * _.first([1, 2, 3], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4283
     * // => [1, 2]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4284
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4285
     * _.first([1, 2, 3], function(num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4286
     *   return num < 3;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4287
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4288
     * // => [1, 2]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4289
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4290
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4291
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4292
     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4293
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4294
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4295
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4296
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4297
     * _.first(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4298
     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4299
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4300
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4301
     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4302
     * // => ['barney', 'fred']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4303
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4304
    function first(array, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4305
      var n = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4306
          length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4307
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4308
      if (typeof callback != 'number' && callback != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4309
        var index = -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4310
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4311
        while (++index < length && callback(array[index], index, array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4312
          n++;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4313
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4314
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4315
        n = callback;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4316
        if (n == null || thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4317
          return array ? array[0] : undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4318
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4319
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4320
      return slice(array, 0, nativeMin(nativeMax(0, n), length));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4321
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4322
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4323
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4324
     * Flattens a nested array (the nesting can be to any depth). If `isShallow`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4325
     * is truey, the array will only be flattened a single level. If a callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4326
     * is provided each element of the array is passed through the callback before
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4327
     * flattening. The callback is bound to `thisArg` and invoked with three
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4328
     * arguments; (value, index, array).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4329
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4330
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4331
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4332
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4333
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4334
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4335
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4336
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4337
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4338
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4339
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4340
     * @param {Array} array The array to flatten.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4341
     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4342
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4343
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4344
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4345
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4346
     * @returns {Array} Returns a new flattened array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4347
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4348
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4349
     * _.flatten([1, [2], [3, [[4]]]]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4350
     * // => [1, 2, 3, 4];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4351
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4352
     * _.flatten([1, [2], [3, [[4]]]], true);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4353
     * // => [1, 2, 3, [[4]]];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4354
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4355
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4356
     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4357
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4358
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4359
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4360
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4361
     * _.flatten(characters, 'pets');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4362
     * // => ['hoppy', 'baby puss', 'dino']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4363
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4364
    function flatten(array, isShallow, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4365
      // juggle arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4366
      if (typeof isShallow != 'boolean' && isShallow != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4367
        thisArg = callback;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4368
        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4369
        isShallow = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4370
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4371
      if (callback != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4372
        array = map(array, callback, thisArg);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4373
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4374
      return baseFlatten(array, isShallow);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4375
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4376
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4377
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4378
     * Gets the index at which the first occurrence of `value` is found using
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4379
     * strict equality for comparisons, i.e. `===`. If the array is already sorted
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4380
     * providing `true` for `fromIndex` will run a faster binary search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4381
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4382
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4383
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4384
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4385
     * @param {Array} array The array to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4386
     * @param {*} value The value to search for.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4387
     * @param {boolean|number} [fromIndex=0] The index to search from or `true`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4388
     *  to perform a binary search on a sorted array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4389
     * @returns {number} Returns the index of the matched value or `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4390
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4391
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4392
     * _.indexOf([1, 2, 3, 1, 2, 3], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4393
     * // => 1
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4394
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4395
     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4396
     * // => 4
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4397
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4398
     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4399
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4400
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4401
    function indexOf(array, value, fromIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4402
      if (typeof fromIndex == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4403
        var length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4404
        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4405
      } else if (fromIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4406
        var index = sortedIndex(array, value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4407
        return array[index] === value ? index : -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4408
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4409
      return baseIndexOf(array, value, fromIndex);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4410
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4411
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4412
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4413
     * Gets all but the last element or last `n` elements of an array. If a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4414
     * callback is provided elements at the end of the array are excluded from
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4415
     * the result as long as the callback returns truey. The callback is bound
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4416
     * to `thisArg` and invoked with three arguments; (value, index, array).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4417
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4418
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4419
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4420
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4421
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4422
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4423
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4424
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4425
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4426
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4427
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4428
     * @param {Array} array The array to query.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4429
     * @param {Function|Object|number|string} [callback=1] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4430
     *  per element or the number of elements to exclude. If a property name or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4431
     *  object is provided it will be used to create a "_.pluck" or "_.where"
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4432
     *  style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4433
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4434
     * @returns {Array} Returns a slice of `array`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4435
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4436
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4437
     * _.initial([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4438
     * // => [1, 2]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4439
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4440
     * _.initial([1, 2, 3], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4441
     * // => [1]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4442
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4443
     * _.initial([1, 2, 3], function(num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4444
     *   return num > 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4445
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4446
     * // => [1]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4447
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4448
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4449
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4450
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4451
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4452
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4453
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4454
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4455
     * _.initial(characters, 'blocked');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4456
     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4457
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4458
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4459
     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4460
     * // => ['barney', 'fred']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4461
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4462
    function initial(array, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4463
      var n = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4464
          length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4465
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4466
      if (typeof callback != 'number' && callback != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4467
        var index = length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4468
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4469
        while (index-- && callback(array[index], index, array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4470
          n++;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4471
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4472
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4473
        n = (callback == null || thisArg) ? 1 : callback || n;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4474
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4475
      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4476
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4477
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4478
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4479
     * Creates an array of unique values present in all provided arrays using
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4480
     * strict equality for comparisons, i.e. `===`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4481
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4482
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4483
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4484
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4485
     * @param {...Array} [array] The arrays to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4486
     * @returns {Array} Returns an array of shared values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4487
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4488
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4489
     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4490
     * // => [1, 2]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4491
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4492
    function intersection() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4493
      var args = [],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4494
          argsIndex = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4495
          argsLength = arguments.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4496
          caches = getArray(),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4497
          indexOf = getIndexOf(),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4498
          trustIndexOf = indexOf === baseIndexOf,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4499
          seen = getArray();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4500
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4501
      while (++argsIndex < argsLength) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4502
        var value = arguments[argsIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4503
        if (isArray(value) || isArguments(value)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4504
          args.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4505
          caches.push(trustIndexOf && value.length >= largeArraySize &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4506
            createCache(argsIndex ? args[argsIndex] : seen));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4507
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4508
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4509
      var array = args[0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4510
          index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4511
          length = array ? array.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4512
          result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4513
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4514
      outer:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4515
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4516
        var cache = caches[0];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4517
        value = array[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4518
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4519
        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4520
          argsIndex = argsLength;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4521
          (cache || seen).push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4522
          while (--argsIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4523
            cache = caches[argsIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4524
            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4525
              continue outer;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4526
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4527
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4528
          result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4529
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4530
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4531
      while (argsLength--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4532
        cache = caches[argsLength];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4533
        if (cache) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4534
          releaseObject(cache);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4535
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4536
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4537
      releaseArray(caches);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4538
      releaseArray(seen);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4539
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4540
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4541
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4542
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4543
     * Gets the last element or last `n` elements of an array. If a callback is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4544
     * provided elements at the end of the array are returned as long as the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4545
     * callback returns truey. The callback is bound to `thisArg` and invoked
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4546
     * with three arguments; (value, index, array).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4547
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4548
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4549
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4550
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4551
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4552
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4553
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4554
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4555
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4556
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4557
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4558
     * @param {Array} array The array to query.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4559
     * @param {Function|Object|number|string} [callback] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4560
     *  per element or the number of elements to return. If a property name or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4561
     *  object is provided it will be used to create a "_.pluck" or "_.where"
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4562
     *  style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4563
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4564
     * @returns {*} Returns the last element(s) of `array`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4565
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4566
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4567
     * _.last([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4568
     * // => 3
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4569
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4570
     * _.last([1, 2, 3], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4571
     * // => [2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4572
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4573
     * _.last([1, 2, 3], function(num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4574
     *   return num > 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4575
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4576
     * // => [2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4577
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4578
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4579
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4580
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4581
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4582
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4583
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4584
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4585
     * _.pluck(_.last(characters, 'blocked'), 'name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4586
     * // => ['fred', 'pebbles']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4587
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4588
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4589
     * _.last(characters, { 'employer': 'na' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4590
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4591
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4592
    function last(array, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4593
      var n = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4594
          length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4595
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4596
      if (typeof callback != 'number' && callback != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4597
        var index = length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4598
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4599
        while (index-- && callback(array[index], index, array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4600
          n++;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4601
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4602
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4603
        n = callback;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4604
        if (n == null || thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4605
          return array ? array[length - 1] : undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4606
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4607
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4608
      return slice(array, nativeMax(0, length - n));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4609
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4610
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4611
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4612
     * Gets the index at which the last occurrence of `value` is found using strict
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4613
     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4614
     * as the offset from the end of the collection.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4615
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4616
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4617
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4618
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4619
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4620
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4621
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4622
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4623
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4624
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4625
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4626
     * @param {Array} array The array to search.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4627
     * @param {*} value The value to search for.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4628
     * @param {number} [fromIndex=array.length-1] The index to search from.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4629
     * @returns {number} Returns the index of the matched value or `-1`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4630
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4631
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4632
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4633
     * // => 4
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4634
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4635
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4636
     * // => 1
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4637
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4638
    function lastIndexOf(array, value, fromIndex) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4639
      var index = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4640
      if (typeof fromIndex == 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4641
        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4642
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4643
      while (index--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4644
        if (array[index] === value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4645
          return index;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4646
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4647
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4648
      return -1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4649
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4650
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4651
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4652
     * Removes all provided values from the given array using strict equality for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4653
     * comparisons, i.e. `===`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4654
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4655
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4656
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4657
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4658
     * @param {Array} array The array to modify.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4659
     * @param {...*} [value] The values to remove.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4660
     * @returns {Array} Returns `array`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4661
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4662
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4663
     * var array = [1, 2, 3, 1, 2, 3];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4664
     * _.pull(array, 2, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4665
     * console.log(array);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4666
     * // => [1, 1]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4667
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4668
    function pull(array) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4669
      var args = arguments,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4670
          argsIndex = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4671
          argsLength = args.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4672
          length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4673
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4674
      while (++argsIndex < argsLength) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4675
        var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4676
            value = args[argsIndex];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4677
        while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4678
          if (array[index] === value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4679
            splice.call(array, index--, 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4680
            length--;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4681
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4682
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4683
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4684
      return array;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4685
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4686
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4687
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4688
     * Creates an array of numbers (positive and/or negative) progressing from
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4689
     * `start` up to but not including `end`. If `start` is less than `stop` a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4690
     * zero-length range is created unless a negative `step` is specified.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4691
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4692
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4693
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4694
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4695
     * @param {number} [start=0] The start of the range.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4696
     * @param {number} end The end of the range.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4697
     * @param {number} [step=1] The value to increment or decrement by.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4698
     * @returns {Array} Returns a new range array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4699
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4700
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4701
     * _.range(4);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4702
     * // => [0, 1, 2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4703
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4704
     * _.range(1, 5);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4705
     * // => [1, 2, 3, 4]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4706
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4707
     * _.range(0, 20, 5);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4708
     * // => [0, 5, 10, 15]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4709
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4710
     * _.range(0, -4, -1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4711
     * // => [0, -1, -2, -3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4712
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4713
     * _.range(1, 4, 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4714
     * // => [1, 1, 1]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4715
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4716
     * _.range(0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4717
     * // => []
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4718
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4719
    function range(start, end, step) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4720
      start = +start || 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4721
      step = typeof step == 'number' ? step : (+step || 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4722
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4723
      if (end == null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4724
        end = start;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4725
        start = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4726
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4727
      // use `Array(length)` so engines like Chakra and V8 avoid slower modes
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4728
      // http://youtu.be/XAqIpGU8ZZk#t=17m25s
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4729
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4730
          length = nativeMax(0, ceil((end - start) / (step || 1))),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4731
          result = Array(length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4732
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4733
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4734
        result[index] = start;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4735
        start += step;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4736
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4737
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4738
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4739
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4740
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4741
     * Removes all elements from an array that the callback returns truey for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4742
     * and returns an array of removed elements. The callback is bound to `thisArg`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4743
     * and invoked with three arguments; (value, index, array).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4744
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4745
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4746
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4747
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4748
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4749
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4750
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4751
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4752
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4753
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4754
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4755
     * @param {Array} array The array to modify.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4756
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4757
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4758
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4759
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4760
     * @returns {Array} Returns a new array of removed elements.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4761
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4762
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4763
     * var array = [1, 2, 3, 4, 5, 6];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4764
     * var evens = _.remove(array, function(num) { return num % 2 == 0; });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4765
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4766
     * console.log(array);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4767
     * // => [1, 3, 5]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4768
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4769
     * console.log(evens);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4770
     * // => [2, 4, 6]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4771
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4772
    function remove(array, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4773
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4774
          length = array ? array.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4775
          result = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4776
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4777
      callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4778
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4779
        var value = array[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4780
        if (callback(value, index, array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4781
          result.push(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4782
          splice.call(array, index--, 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4783
          length--;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4784
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4785
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4786
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4787
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4788
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4789
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4790
     * The opposite of `_.initial` this method gets all but the first element or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4791
     * first `n` elements of an array. If a callback function is provided elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4792
     * at the beginning of the array are excluded from the result as long as the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4793
     * callback returns truey. The callback is bound to `thisArg` and invoked
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4794
     * with three arguments; (value, index, array).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4795
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4796
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4797
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4798
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4799
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4800
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4801
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4802
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4803
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4804
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4805
     * @alias drop, tail
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4806
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4807
     * @param {Array} array The array to query.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4808
     * @param {Function|Object|number|string} [callback=1] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4809
     *  per element or the number of elements to exclude. If a property name or
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4810
     *  object is provided it will be used to create a "_.pluck" or "_.where"
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4811
     *  style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4812
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4813
     * @returns {Array} Returns a slice of `array`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4814
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4815
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4816
     * _.rest([1, 2, 3]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4817
     * // => [2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4818
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4819
     * _.rest([1, 2, 3], 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4820
     * // => [3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4821
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4822
     * _.rest([1, 2, 3], function(num) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4823
     *   return num < 3;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4824
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4825
     * // => [3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4826
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4827
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4828
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4829
     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4830
     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4831
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4832
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4833
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4834
     * _.pluck(_.rest(characters, 'blocked'), 'name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4835
     * // => ['fred', 'pebbles']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4836
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4837
     * // using "_.where" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4838
     * _.rest(characters, { 'employer': 'slate' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4839
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4840
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4841
    function rest(array, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4842
      if (typeof callback != 'number' && callback != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4843
        var n = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4844
            index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4845
            length = array ? array.length : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4846
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4847
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4848
        while (++index < length && callback(array[index], index, array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4849
          n++;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4850
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4851
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4852
        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4853
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4854
      return slice(array, n);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4855
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4856
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4857
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4858
     * Uses a binary search to determine the smallest index at which a value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4859
     * should be inserted into a given sorted array in order to maintain the sort
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4860
     * order of the array. If a callback is provided it will be executed for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4861
     * `value` and each element of `array` to compute their sort ranking. The
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4862
     * callback is bound to `thisArg` and invoked with one argument; (value).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4863
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4864
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4865
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4866
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4867
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4868
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4869
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4870
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4871
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4872
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4873
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4874
     * @param {Array} array The array to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4875
     * @param {*} value The value to evaluate.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4876
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4877
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4878
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4879
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4880
     * @returns {number} Returns the index at which `value` should be inserted
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4881
     *  into `array`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4882
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4883
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4884
     * _.sortedIndex([20, 30, 50], 40);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4885
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4886
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4887
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4888
     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4889
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4890
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4891
     * var dict = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4892
     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4893
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4894
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4895
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4896
     *   return dict.wordToNumber[word];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4897
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4898
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4899
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4900
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4901
     *   return this.wordToNumber[word];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4902
     * }, dict);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4903
     * // => 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4904
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4905
    function sortedIndex(array, value, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4906
      var low = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4907
          high = array ? array.length : low;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4908
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4909
      // explicitly reference `identity` for better inlining in Firefox
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4910
      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4911
      value = callback(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4912
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4913
      while (low < high) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4914
        var mid = (low + high) >>> 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4915
        (callback(array[mid]) < value)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4916
          ? low = mid + 1
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4917
          : high = mid;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4918
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4919
      return low;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4920
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4921
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4922
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4923
     * Creates an array of unique values, in order, of the provided arrays using
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4924
     * strict equality for comparisons, i.e. `===`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4925
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4926
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4927
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4928
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4929
     * @param {...Array} [array] The arrays to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4930
     * @returns {Array} Returns an array of combined values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4931
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4932
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4933
     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4934
     * // => [1, 2, 3, 5, 4]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4935
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4936
    function union() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4937
      return baseUniq(baseFlatten(arguments, true, true));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4938
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4939
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4940
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4941
     * Creates a duplicate-value-free version of an array using strict equality
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4942
     * for comparisons, i.e. `===`. If the array is sorted, providing
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4943
     * `true` for `isSorted` will use a faster algorithm. If a callback is provided
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4944
     * each element of `array` is passed through the callback before uniqueness
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4945
     * is computed. The callback is bound to `thisArg` and invoked with three
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4946
     * arguments; (value, index, array).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4947
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4948
     * If a property name is provided for `callback` the created "_.pluck" style
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4949
     * callback will return the property value of the given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4950
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4951
     * If an object is provided for `callback` the created "_.where" style callback
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4952
     * will return `true` for elements that have the properties of the given object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4953
     * else `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4954
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4955
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4956
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4957
     * @alias unique
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4958
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4959
     * @param {Array} array The array to process.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4960
     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4961
     * @param {Function|Object|string} [callback=identity] The function called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4962
     *  per iteration. If a property name or object is provided it will be used
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4963
     *  to create a "_.pluck" or "_.where" style callback, respectively.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4964
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4965
     * @returns {Array} Returns a duplicate-value-free array.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4966
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4967
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4968
     * _.uniq([1, 2, 1, 3, 1]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4969
     * // => [1, 2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4970
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4971
     * _.uniq([1, 1, 2, 2, 3], true);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4972
     * // => [1, 2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4973
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4974
     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4975
     * // => ['A', 'b', 'C']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4976
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4977
     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4978
     * // => [1, 2.5, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4979
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4980
     * // using "_.pluck" callback shorthand
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4981
     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4982
     * // => [{ 'x': 1 }, { 'x': 2 }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4983
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4984
    function uniq(array, isSorted, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4985
      // juggle arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4986
      if (typeof isSorted != 'boolean' && isSorted != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4987
        thisArg = callback;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4988
        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4989
        isSorted = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4990
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4991
      if (callback != null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4992
        callback = lodash.createCallback(callback, thisArg, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4993
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4994
      return baseUniq(array, isSorted, callback);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4995
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4996
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4997
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4998
     * Creates an array excluding all provided values using strict equality for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4999
     * comparisons, i.e. `===`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5000
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5001
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5002
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5003
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5004
     * @param {Array} array The array to filter.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5005
     * @param {...*} [value] The values to exclude.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5006
     * @returns {Array} Returns a new array of filtered values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5007
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5008
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5009
     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5010
     * // => [2, 3, 4]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5011
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5012
    function without(array) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5013
      return baseDifference(array, slice(arguments, 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5014
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5015
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5016
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5017
     * Creates an array that is the symmetric difference of the provided arrays.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5018
     * See http://en.wikipedia.org/wiki/Symmetric_difference.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5019
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5020
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5021
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5022
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5023
     * @param {...Array} [array] The arrays to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5024
     * @returns {Array} Returns an array of values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5025
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5026
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5027
     * _.xor([1, 2, 3], [5, 2, 1, 4]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5028
     * // => [3, 5, 4]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5029
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5030
     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5031
     * // => [1, 4, 5]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5032
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5033
    function xor() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5034
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5035
          length = arguments.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5036
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5037
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5038
        var array = arguments[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5039
        if (isArray(array) || isArguments(array)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5040
          var result = result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5041
            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5042
            : array;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5043
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5044
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5045
      return result || [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5046
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5047
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5048
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5049
     * Creates an array of grouped elements, the first of which contains the first
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5050
     * elements of the given arrays, the second of which contains the second
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5051
     * elements of the given arrays, and so on.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5052
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5053
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5054
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5055
     * @alias unzip
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5056
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5057
     * @param {...Array} [array] Arrays to process.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5058
     * @returns {Array} Returns a new array of grouped elements.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5059
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5060
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5061
     * _.zip(['fred', 'barney'], [30, 40], [true, false]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5062
     * // => [['fred', 30, true], ['barney', 40, false]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5063
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5064
    function zip() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5065
      var array = arguments.length > 1 ? arguments : arguments[0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5066
          index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5067
          length = array ? max(pluck(array, 'length')) : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5068
          result = Array(length < 0 ? 0 : length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5069
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5070
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5071
        result[index] = pluck(array, index);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5072
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5073
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5074
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5075
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5076
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5077
     * Creates an object composed from arrays of `keys` and `values`. Provide
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5078
     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5079
     * or two arrays, one of `keys` and one of corresponding `values`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5080
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5081
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5082
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5083
     * @alias object
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5084
     * @category Arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5085
     * @param {Array} keys The array of keys.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5086
     * @param {Array} [values=[]] The array of values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5087
     * @returns {Object} Returns an object composed of the given keys and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5088
     *  corresponding values.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5089
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5090
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5091
     * _.zipObject(['fred', 'barney'], [30, 40]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5092
     * // => { 'fred': 30, 'barney': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5093
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5094
    function zipObject(keys, values) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5095
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5096
          length = keys ? keys.length : 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5097
          result = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5098
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5099
      if (!values && length && !isArray(keys[0])) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5100
        values = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5101
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5102
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5103
        var key = keys[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5104
        if (values) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5105
          result[key] = values[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5106
        } else if (key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5107
          result[key[0]] = key[1];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5108
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5109
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5110
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5111
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5112
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5113
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5114
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5115
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5116
     * Creates a function that executes `func`, with  the `this` binding and
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5117
     * arguments of the created function, only after being called `n` times.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5118
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5119
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5120
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5121
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5122
     * @param {number} n The number of times the function must be called before
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5123
     *  `func` is executed.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5124
     * @param {Function} func The function to restrict.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5125
     * @returns {Function} Returns the new restricted function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5126
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5127
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5128
     * var saves = ['profile', 'settings'];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5129
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5130
     * var done = _.after(saves.length, function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5131
     *   console.log('Done saving!');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5132
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5133
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5134
     * _.forEach(saves, function(type) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5135
     *   asyncSave({ 'type': type, 'complete': done });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5136
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5137
     * // => logs 'Done saving!', after all saves have completed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5138
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5139
    function after(n, func) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5140
      if (!isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5141
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5142
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5143
      return function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5144
        if (--n < 1) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5145
          return func.apply(this, arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5146
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5147
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5148
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5149
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5150
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5151
     * Creates a function that, when called, invokes `func` with the `this`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5152
     * binding of `thisArg` and prepends any additional `bind` arguments to those
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5153
     * provided to the bound function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5154
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5155
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5156
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5157
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5158
     * @param {Function} func The function to bind.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5159
     * @param {*} [thisArg] The `this` binding of `func`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5160
     * @param {...*} [arg] Arguments to be partially applied.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5161
     * @returns {Function} Returns the new bound function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5162
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5163
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5164
     * var func = function(greeting) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5165
     *   return greeting + ' ' + this.name;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5166
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5167
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5168
     * func = _.bind(func, { 'name': 'fred' }, 'hi');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5169
     * func();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5170
     * // => 'hi fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5171
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5172
    function bind(func, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5173
      return arguments.length > 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5174
        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5175
        : createWrapper(func, 1, null, null, thisArg);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5176
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5177
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5178
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5179
     * Binds methods of an object to the object itself, overwriting the existing
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5180
     * method. Method names may be specified as individual arguments or as arrays
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5181
     * of method names. If no method names are provided all the function properties
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5182
     * of `object` will be bound.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5183
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5184
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5185
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5186
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5187
     * @param {Object} object The object to bind and assign the bound methods to.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5188
     * @param {...string} [methodName] The object method names to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5189
     *  bind, specified as individual method names or arrays of method names.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5190
     * @returns {Object} Returns `object`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5191
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5192
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5193
     * var view = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5194
     *   'label': 'docs',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5195
     *   'onClick': function() { console.log('clicked ' + this.label); }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5196
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5197
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5198
     * _.bindAll(view);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5199
     * jQuery('#docs').on('click', view.onClick);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5200
     * // => logs 'clicked docs', when the button is clicked
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5201
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5202
    function bindAll(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5203
      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5204
          index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5205
          length = funcs.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5206
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5207
      while (++index < length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5208
        var key = funcs[index];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5209
        object[key] = createWrapper(object[key], 1, null, null, object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5210
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5211
      return object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5212
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5213
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5214
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5215
     * Creates a function that, when called, invokes the method at `object[key]`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5216
     * and prepends any additional `bindKey` arguments to those provided to the bound
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5217
     * function. This method differs from `_.bind` by allowing bound functions to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5218
     * reference methods that will be redefined or don't yet exist.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5219
     * See http://michaux.ca/articles/lazy-function-definition-pattern.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5220
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5221
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5222
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5223
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5224
     * @param {Object} object The object the method belongs to.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5225
     * @param {string} key The key of the method.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5226
     * @param {...*} [arg] Arguments to be partially applied.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5227
     * @returns {Function} Returns the new bound function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5228
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5229
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5230
     * var object = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5231
     *   'name': 'fred',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5232
     *   'greet': function(greeting) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5233
     *     return greeting + ' ' + this.name;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5234
     *   }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5235
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5236
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5237
     * var func = _.bindKey(object, 'greet', 'hi');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5238
     * func();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5239
     * // => 'hi fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5240
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5241
     * object.greet = function(greeting) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5242
     *   return greeting + 'ya ' + this.name + '!';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5243
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5244
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5245
     * func();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5246
     * // => 'hiya fred!'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5247
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5248
    function bindKey(object, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5249
      return arguments.length > 2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5250
        ? createWrapper(key, 19, slice(arguments, 2), null, object)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5251
        : createWrapper(key, 3, null, null, object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5252
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5253
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5254
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5255
     * Creates a function that is the composition of the provided functions,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5256
     * where each function consumes the return value of the function that follows.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5257
     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5258
     * Each function is executed with the `this` binding of the composed function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5259
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5260
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5261
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5262
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5263
     * @param {...Function} [func] Functions to compose.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5264
     * @returns {Function} Returns the new composed function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5265
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5266
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5267
     * var realNameMap = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5268
     *   'pebbles': 'penelope'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5269
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5270
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5271
     * var format = function(name) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5272
     *   name = realNameMap[name.toLowerCase()] || name;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5273
     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5274
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5275
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5276
     * var greet = function(formatted) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5277
     *   return 'Hiya ' + formatted + '!';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5278
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5279
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5280
     * var welcome = _.compose(greet, format);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5281
     * welcome('pebbles');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5282
     * // => 'Hiya Penelope!'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5283
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5284
    function compose() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5285
      var funcs = arguments,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5286
          length = funcs.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5287
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5288
      while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5289
        if (!isFunction(funcs[length])) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5290
          throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5291
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5292
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5293
      return function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5294
        var args = arguments,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5295
            length = funcs.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5296
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5297
        while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5298
          args = [funcs[length].apply(this, args)];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5299
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5300
        return args[0];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5301
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5302
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5303
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5304
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5305
     * Creates a function which accepts one or more arguments of `func` that when
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5306
     * invoked either executes `func` returning its result, if all `func` arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5307
     * have been provided, or returns a function that accepts one or more of the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5308
     * remaining `func` arguments, and so on. The arity of `func` can be specified
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5309
     * if `func.length` is not sufficient.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5310
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5311
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5312
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5313
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5314
     * @param {Function} func The function to curry.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5315
     * @param {number} [arity=func.length] The arity of `func`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5316
     * @returns {Function} Returns the new curried function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5317
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5318
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5319
     * var curried = _.curry(function(a, b, c) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5320
     *   console.log(a + b + c);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5321
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5322
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5323
     * curried(1)(2)(3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5324
     * // => 6
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5325
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5326
     * curried(1, 2)(3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5327
     * // => 6
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5328
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5329
     * curried(1, 2, 3);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5330
     * // => 6
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5331
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5332
    function curry(func, arity) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5333
      arity = typeof arity == 'number' ? arity : (+arity || func.length);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5334
      return createWrapper(func, 4, null, null, null, arity);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5335
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5336
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5337
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5338
     * Creates a function that will delay the execution of `func` until after
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5339
     * `wait` milliseconds have elapsed since the last time it was invoked.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5340
     * Provide an options object to indicate that `func` should be invoked on
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5341
     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5342
     * to the debounced function will return the result of the last `func` call.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5343
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5344
     * Note: If `leading` and `trailing` options are `true` `func` will be called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5345
     * on the trailing edge of the timeout only if the the debounced function is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5346
     * invoked more than once during the `wait` timeout.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5347
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5348
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5349
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5350
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5351
     * @param {Function} func The function to debounce.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5352
     * @param {number} wait The number of milliseconds to delay.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5353
     * @param {Object} [options] The options object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5354
     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5355
     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5356
     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5357
     * @returns {Function} Returns the new debounced function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5358
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5359
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5360
     * // avoid costly calculations while the window size is in flux
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5361
     * var lazyLayout = _.debounce(calculateLayout, 150);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5362
     * jQuery(window).on('resize', lazyLayout);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5363
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5364
     * // execute `sendMail` when the click event is fired, debouncing subsequent calls
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5365
     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5366
     *   'leading': true,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5367
     *   'trailing': false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5368
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5369
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5370
     * // ensure `batchLog` is executed once after 1 second of debounced calls
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5371
     * var source = new EventSource('/stream');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5372
     * source.addEventListener('message', _.debounce(batchLog, 250, {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5373
     *   'maxWait': 1000
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5374
     * }, false);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5375
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5376
    function debounce(func, wait, options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5377
      var args,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5378
          maxTimeoutId,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5379
          result,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5380
          stamp,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5381
          thisArg,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5382
          timeoutId,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5383
          trailingCall,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5384
          lastCalled = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5385
          maxWait = false,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5386
          trailing = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5387
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5388
      if (!isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5389
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5390
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5391
      wait = nativeMax(0, wait) || 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5392
      if (options === true) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5393
        var leading = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5394
        trailing = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5395
      } else if (isObject(options)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5396
        leading = options.leading;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5397
        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5398
        trailing = 'trailing' in options ? options.trailing : trailing;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5399
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5400
      var delayed = function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5401
        var remaining = wait - (now() - stamp);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5402
        if (remaining <= 0) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5403
          if (maxTimeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5404
            clearTimeout(maxTimeoutId);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5405
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5406
          var isCalled = trailingCall;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5407
          maxTimeoutId = timeoutId = trailingCall = undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5408
          if (isCalled) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5409
            lastCalled = now();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5410
            result = func.apply(thisArg, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5411
            if (!timeoutId && !maxTimeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5412
              args = thisArg = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5413
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5414
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5415
        } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5416
          timeoutId = setTimeout(delayed, remaining);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5417
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5418
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5419
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5420
      var maxDelayed = function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5421
        if (timeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5422
          clearTimeout(timeoutId);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5423
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5424
        maxTimeoutId = timeoutId = trailingCall = undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5425
        if (trailing || (maxWait !== wait)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5426
          lastCalled = now();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5427
          result = func.apply(thisArg, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5428
          if (!timeoutId && !maxTimeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5429
            args = thisArg = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5430
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5431
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5432
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5433
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5434
      return function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5435
        args = arguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5436
        stamp = now();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5437
        thisArg = this;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5438
        trailingCall = trailing && (timeoutId || !leading);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5439
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5440
        if (maxWait === false) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5441
          var leadingCall = leading && !timeoutId;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5442
        } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5443
          if (!maxTimeoutId && !leading) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5444
            lastCalled = stamp;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5445
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5446
          var remaining = maxWait - (stamp - lastCalled),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5447
              isCalled = remaining <= 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5448
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5449
          if (isCalled) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5450
            if (maxTimeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5451
              maxTimeoutId = clearTimeout(maxTimeoutId);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5452
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5453
            lastCalled = stamp;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5454
            result = func.apply(thisArg, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5455
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5456
          else if (!maxTimeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5457
            maxTimeoutId = setTimeout(maxDelayed, remaining);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5458
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5459
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5460
        if (isCalled && timeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5461
          timeoutId = clearTimeout(timeoutId);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5462
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5463
        else if (!timeoutId && wait !== maxWait) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5464
          timeoutId = setTimeout(delayed, wait);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5465
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5466
        if (leadingCall) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5467
          isCalled = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5468
          result = func.apply(thisArg, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5469
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5470
        if (isCalled && !timeoutId && !maxTimeoutId) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5471
          args = thisArg = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5472
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5473
        return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5474
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5475
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5476
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5477
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5478
     * Defers executing the `func` function until the current call stack has cleared.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5479
     * Additional arguments will be provided to `func` when it is invoked.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5480
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5481
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5482
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5483
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5484
     * @param {Function} func The function to defer.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5485
     * @param {...*} [arg] Arguments to invoke the function with.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5486
     * @returns {number} Returns the timer id.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5487
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5488
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5489
     * _.defer(function(text) { console.log(text); }, 'deferred');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5490
     * // logs 'deferred' after one or more milliseconds
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5491
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5492
    function defer(func) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5493
      if (!isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5494
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5495
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5496
      var args = slice(arguments, 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5497
      return setTimeout(function() { func.apply(undefined, args); }, 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5498
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5499
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5500
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5501
     * Executes the `func` function after `wait` milliseconds. Additional arguments
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5502
     * will be provided to `func` when it is invoked.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5503
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5504
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5505
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5506
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5507
     * @param {Function} func The function to delay.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5508
     * @param {number} wait The number of milliseconds to delay execution.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5509
     * @param {...*} [arg] Arguments to invoke the function with.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5510
     * @returns {number} Returns the timer id.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5511
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5512
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5513
     * _.delay(function(text) { console.log(text); }, 1000, 'later');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5514
     * // => logs 'later' after one second
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5515
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5516
    function delay(func, wait) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5517
      if (!isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5518
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5519
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5520
      var args = slice(arguments, 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5521
      return setTimeout(function() { func.apply(undefined, args); }, wait);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5522
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5523
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5524
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5525
     * Creates a function that memoizes the result of `func`. If `resolver` is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5526
     * provided it will be used to determine the cache key for storing the result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5527
     * based on the arguments provided to the memoized function. By default, the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5528
     * first argument provided to the memoized function is used as the cache key.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5529
     * The `func` is executed with the `this` binding of the memoized function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5530
     * The result cache is exposed as the `cache` property on the memoized function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5531
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5532
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5533
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5534
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5535
     * @param {Function} func The function to have its output memoized.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5536
     * @param {Function} [resolver] A function used to resolve the cache key.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5537
     * @returns {Function} Returns the new memoizing function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5538
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5539
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5540
     * var fibonacci = _.memoize(function(n) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5541
     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5542
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5543
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5544
     * fibonacci(9)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5545
     * // => 34
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5546
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5547
     * var data = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5548
     *   'fred': { 'name': 'fred', 'age': 40 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5549
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5550
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5551
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5552
     * // modifying the result cache
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5553
     * var get = _.memoize(function(name) { return data[name]; }, _.identity);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5554
     * get('pebbles');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5555
     * // => { 'name': 'pebbles', 'age': 1 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5556
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5557
     * get.cache.pebbles.name = 'penelope';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5558
     * get('pebbles');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5559
     * // => { 'name': 'penelope', 'age': 1 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5560
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5561
    function memoize(func, resolver) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5562
      if (!isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5563
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5564
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5565
      var memoized = function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5566
        var cache = memoized.cache,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5567
            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5568
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5569
        return hasOwnProperty.call(cache, key)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5570
          ? cache[key]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5571
          : (cache[key] = func.apply(this, arguments));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5572
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5573
      memoized.cache = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5574
      return memoized;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5575
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5576
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5577
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5578
     * Creates a function that is restricted to execute `func` once. Repeat calls to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5579
     * the function will return the value of the first call. The `func` is executed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5580
     * with the `this` binding of the created function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5581
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5582
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5583
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5584
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5585
     * @param {Function} func The function to restrict.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5586
     * @returns {Function} Returns the new restricted function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5587
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5588
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5589
     * var initialize = _.once(createApplication);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5590
     * initialize();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5591
     * initialize();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5592
     * // `initialize` executes `createApplication` once
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5593
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5594
    function once(func) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5595
      var ran,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5596
          result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5597
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5598
      if (!isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5599
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5600
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5601
      return function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5602
        if (ran) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5603
          return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5604
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5605
        ran = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5606
        result = func.apply(this, arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5607
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5608
        // clear the `func` variable so the function may be garbage collected
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5609
        func = null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5610
        return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5611
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5612
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5613
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5614
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5615
     * Creates a function that, when called, invokes `func` with any additional
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5616
     * `partial` arguments prepended to those provided to the new function. This
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5617
     * method is similar to `_.bind` except it does **not** alter the `this` binding.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5618
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5619
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5620
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5621
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5622
     * @param {Function} func The function to partially apply arguments to.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5623
     * @param {...*} [arg] Arguments to be partially applied.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5624
     * @returns {Function} Returns the new partially applied function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5625
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5626
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5627
     * var greet = function(greeting, name) { return greeting + ' ' + name; };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5628
     * var hi = _.partial(greet, 'hi');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5629
     * hi('fred');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5630
     * // => 'hi fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5631
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5632
    function partial(func) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5633
      return createWrapper(func, 16, slice(arguments, 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5634
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5635
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5636
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5637
     * This method is like `_.partial` except that `partial` arguments are
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5638
     * appended to those provided to the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5639
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5640
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5641
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5642
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5643
     * @param {Function} func The function to partially apply arguments to.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5644
     * @param {...*} [arg] Arguments to be partially applied.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5645
     * @returns {Function} Returns the new partially applied function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5646
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5647
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5648
     * var defaultsDeep = _.partialRight(_.merge, _.defaults);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5649
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5650
     * var options = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5651
     *   'variable': 'data',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5652
     *   'imports': { 'jq': $ }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5653
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5654
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5655
     * defaultsDeep(options, _.templateSettings);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5656
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5657
     * options.variable
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5658
     * // => 'data'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5659
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5660
     * options.imports
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5661
     * // => { '_': _, 'jq': $ }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5662
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5663
    function partialRight(func) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5664
      return createWrapper(func, 32, null, slice(arguments, 1));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5665
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5666
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5667
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5668
     * Creates a function that, when executed, will only call the `func` function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5669
     * at most once per every `wait` milliseconds. Provide an options object to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5670
     * indicate that `func` should be invoked on the leading and/or trailing edge
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5671
     * of the `wait` timeout. Subsequent calls to the throttled function will
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5672
     * return the result of the last `func` call.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5673
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5674
     * Note: If `leading` and `trailing` options are `true` `func` will be called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5675
     * on the trailing edge of the timeout only if the the throttled function is
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5676
     * invoked more than once during the `wait` timeout.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5677
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5678
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5679
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5680
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5681
     * @param {Function} func The function to throttle.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5682
     * @param {number} wait The number of milliseconds to throttle executions to.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5683
     * @param {Object} [options] The options object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5684
     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5685
     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5686
     * @returns {Function} Returns the new throttled function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5687
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5688
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5689
     * // avoid excessively updating the position while scrolling
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5690
     * var throttled = _.throttle(updatePosition, 100);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5691
     * jQuery(window).on('scroll', throttled);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5692
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5693
     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5694
     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5695
     *   'trailing': false
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5696
     * }));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5697
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5698
    function throttle(func, wait, options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5699
      var leading = true,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5700
          trailing = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5701
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5702
      if (!isFunction(func)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5703
        throw new TypeError;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5704
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5705
      if (options === false) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5706
        leading = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5707
      } else if (isObject(options)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5708
        leading = 'leading' in options ? options.leading : leading;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5709
        trailing = 'trailing' in options ? options.trailing : trailing;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5710
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5711
      debounceOptions.leading = leading;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5712
      debounceOptions.maxWait = wait;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5713
      debounceOptions.trailing = trailing;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5714
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5715
      return debounce(func, wait, debounceOptions);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5716
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5717
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5718
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5719
     * Creates a function that provides `value` to the wrapper function as its
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5720
     * first argument. Additional arguments provided to the function are appended
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5721
     * to those provided to the wrapper function. The wrapper is executed with
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5722
     * the `this` binding of the created function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5723
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5724
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5725
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5726
     * @category Functions
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5727
     * @param {*} value The value to wrap.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5728
     * @param {Function} wrapper The wrapper function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5729
     * @returns {Function} Returns the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5730
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5731
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5732
     * var p = _.wrap(_.escape, function(func, text) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5733
     *   return '<p>' + func(text) + '</p>';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5734
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5735
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5736
     * p('Fred, Wilma, & Pebbles');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5737
     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5738
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5739
    function wrap(value, wrapper) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5740
      return createWrapper(wrapper, 16, [value]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5741
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5742
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5743
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5744
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5745
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5746
     * Creates a function that returns `value`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5747
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5748
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5749
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5750
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5751
     * @param {*} value The value to return from the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5752
     * @returns {Function} Returns the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5753
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5754
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5755
     * var object = { 'name': 'fred' };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5756
     * var getter = _.constant(object);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5757
     * getter() === object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5758
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5759
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5760
    function constant(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5761
      return function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5762
        return value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5763
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5764
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5765
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5766
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5767
     * Produces a callback bound to an optional `thisArg`. If `func` is a property
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5768
     * name the created callback will return the property value for a given element.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5769
     * If `func` is an object the created callback will return `true` for elements
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5770
     * that contain the equivalent object properties, otherwise it will return `false`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5771
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5772
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5773
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5774
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5775
     * @param {*} [func=identity] The value to convert to a callback.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5776
     * @param {*} [thisArg] The `this` binding of the created callback.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5777
     * @param {number} [argCount] The number of arguments the callback accepts.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5778
     * @returns {Function} Returns a callback function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5779
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5780
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5781
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5782
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5783
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5784
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5785
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5786
     * // wrap to create custom callback shorthands
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5787
     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5788
     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5789
     *   return !match ? func(callback, thisArg) : function(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5790
     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5791
     *   };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5792
     * });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5793
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5794
     * _.filter(characters, 'age__gt38');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5795
     * // => [{ 'name': 'fred', 'age': 40 }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5796
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5797
    function createCallback(func, thisArg, argCount) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5798
      var type = typeof func;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5799
      if (func == null || type == 'function') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5800
        return baseCreateCallback(func, thisArg, argCount);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5801
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5802
      // handle "_.pluck" style callback shorthands
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5803
      if (type != 'object') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5804
        return property(func);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5805
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5806
      var props = keys(func),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5807
          key = props[0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5808
          a = func[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5809
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5810
      // handle "_.where" style callback shorthands
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5811
      if (props.length == 1 && a === a && !isObject(a)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5812
        // fast path the common case of providing an object with a single
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5813
        // property containing a primitive value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5814
        return function(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5815
          var b = object[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5816
          return a === b && (a !== 0 || (1 / a == 1 / b));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5817
        };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5818
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5819
      return function(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5820
        var length = props.length,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5821
            result = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5822
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5823
        while (length--) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5824
          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5825
            break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5826
          }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5827
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5828
        return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5829
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5830
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5831
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5832
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5833
     * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5834
     * corresponding HTML entities.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5835
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5836
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5837
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5838
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5839
     * @param {string} string The string to escape.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5840
     * @returns {string} Returns the escaped string.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5841
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5842
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5843
     * _.escape('Fred, Wilma, & Pebbles');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5844
     * // => 'Fred, Wilma, &amp; Pebbles'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5845
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5846
    function escape(string) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5847
      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5848
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5849
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5850
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5851
     * This method returns the first argument provided to it.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5852
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5853
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5854
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5855
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5856
     * @param {*} value Any value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5857
     * @returns {*} Returns `value`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5858
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5859
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5860
     * var object = { 'name': 'fred' };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5861
     * _.identity(object) === object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5862
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5863
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5864
    function identity(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5865
      return value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5866
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5867
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5868
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5869
     * Adds function properties of a source object to the destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5870
     * If `object` is a function methods will be added to its prototype as well.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5871
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5872
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5873
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5874
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5875
     * @param {Function|Object} [object=lodash] object The destination object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5876
     * @param {Object} source The object of functions to add.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5877
     * @param {Object} [options] The options object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5878
     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5879
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5880
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5881
     * function capitalize(string) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5882
     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5883
     * }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5884
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5885
     * _.mixin({ 'capitalize': capitalize });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5886
     * _.capitalize('fred');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5887
     * // => 'Fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5888
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5889
     * _('fred').capitalize().value();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5890
     * // => 'Fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5891
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5892
     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5893
     * _('fred').capitalize();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5894
     * // => 'Fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5895
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5896
    function mixin(object, source, options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5897
      var chain = true,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5898
          methodNames = source && functions(source);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5899
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5900
      if (!source || (!options && !methodNames.length)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5901
        if (options == null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5902
          options = source;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5903
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5904
        ctor = lodashWrapper;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5905
        source = object;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5906
        object = lodash;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5907
        methodNames = functions(source);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5908
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5909
      if (options === false) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5910
        chain = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5911
      } else if (isObject(options) && 'chain' in options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5912
        chain = options.chain;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5913
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5914
      var ctor = object,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5915
          isFunc = isFunction(ctor);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5916
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5917
      forEach(methodNames, function(methodName) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5918
        var func = object[methodName] = source[methodName];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5919
        if (isFunc) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5920
          ctor.prototype[methodName] = function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5921
            var chainAll = this.__chain__,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5922
                value = this.__wrapped__,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5923
                args = [value];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5924
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5925
            push.apply(args, arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5926
            var result = func.apply(object, args);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5927
            if (chain || chainAll) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5928
              if (value === result && isObject(result)) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5929
                return this;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5930
              }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5931
              result = new ctor(result);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5932
              result.__chain__ = chainAll;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5933
            }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5934
            return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5935
          };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5936
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5937
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5938
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5939
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5940
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5941
     * Reverts the '_' variable to its previous value and returns a reference to
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5942
     * the `lodash` function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5943
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5944
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5945
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5946
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5947
     * @returns {Function} Returns the `lodash` function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5948
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5949
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5950
     * var lodash = _.noConflict();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5951
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5952
    function noConflict() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5953
      context._ = oldDash;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5954
      return this;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5955
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5956
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5957
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5958
     * A no-operation function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5959
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5960
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5961
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5962
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5963
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5964
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5965
     * var object = { 'name': 'fred' };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5966
     * _.noop(object) === undefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5967
     * // => true
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5968
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5969
    function noop() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5970
      // no operation performed
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5971
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5972
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5973
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5974
     * Gets the number of milliseconds that have elapsed since the Unix epoch
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5975
     * (1 January 1970 00:00:00 UTC).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5976
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5977
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5978
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5979
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5980
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5981
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5982
     * var stamp = _.now();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5983
     * _.defer(function() { console.log(_.now() - stamp); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5984
     * // => logs the number of milliseconds it took for the deferred function to be called
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5985
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5986
    var now = isNative(now = Date.now) && now || function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5987
      return new Date().getTime();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5988
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5989
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5990
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5991
     * Converts the given value into an integer of the specified radix.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5992
     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5993
     * `value` is a hexadecimal, in which case a `radix` of `16` is used.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5994
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5995
     * Note: This method avoids differences in native ES3 and ES5 `parseInt`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5996
     * implementations. See http://es5.github.io/#E.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5997
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5998
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5999
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6000
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6001
     * @param {string} value The value to parse.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6002
     * @param {number} [radix] The radix used to interpret the value to parse.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6003
     * @returns {number} Returns the new integer value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6004
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6005
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6006
     * _.parseInt('08');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6007
     * // => 8
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6008
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6009
    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6010
      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6011
      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6012
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6013
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6014
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6015
     * Creates a "_.pluck" style function, which returns the `key` value of a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6016
     * given object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6017
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6018
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6019
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6020
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6021
     * @param {string} key The name of the property to retrieve.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6022
     * @returns {Function} Returns the new function.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6023
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6024
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6025
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6026
     *   { 'name': 'fred',   'age': 40 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6027
     *   { 'name': 'barney', 'age': 36 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6028
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6029
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6030
     * var getName = _.property('name');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6031
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6032
     * _.map(characters, getName);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6033
     * // => ['barney', 'fred']
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6034
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6035
     * _.sortBy(characters, getName);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6036
     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6037
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6038
    function property(key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6039
      return function(object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6040
        return object[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6041
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6042
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6043
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6044
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6045
     * Produces a random number between `min` and `max` (inclusive). If only one
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6046
     * argument is provided a number between `0` and the given number will be
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6047
     * returned. If `floating` is truey or either `min` or `max` are floats a
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6048
     * floating-point number will be returned instead of an integer.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6049
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6050
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6051
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6052
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6053
     * @param {number} [min=0] The minimum possible value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6054
     * @param {number} [max=1] The maximum possible value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6055
     * @param {boolean} [floating=false] Specify returning a floating-point number.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6056
     * @returns {number} Returns a random number.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6057
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6058
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6059
     * _.random(0, 5);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6060
     * // => an integer between 0 and 5
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6061
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6062
     * _.random(5);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6063
     * // => also an integer between 0 and 5
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6064
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6065
     * _.random(5, true);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6066
     * // => a floating-point number between 0 and 5
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6067
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6068
     * _.random(1.2, 5.2);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6069
     * // => a floating-point number between 1.2 and 5.2
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6070
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6071
    function random(min, max, floating) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6072
      var noMin = min == null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6073
          noMax = max == null;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6074
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6075
      if (floating == null) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6076
        if (typeof min == 'boolean' && noMax) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6077
          floating = min;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6078
          min = 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6079
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6080
        else if (!noMax && typeof max == 'boolean') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6081
          floating = max;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6082
          noMax = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6083
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6084
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6085
      if (noMin && noMax) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6086
        max = 1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6087
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6088
      min = +min || 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6089
      if (noMax) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6090
        max = min;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6091
        min = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6092
      } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6093
        max = +max || 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6094
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6095
      if (floating || min % 1 || max % 1) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6096
        var rand = nativeRandom();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6097
        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6098
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6099
      return baseRandom(min, max);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6100
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6101
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6102
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6103
     * Resolves the value of property `key` on `object`. If `key` is a function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6104
     * it will be invoked with the `this` binding of `object` and its result returned,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6105
     * else the property value is returned. If `object` is falsey then `undefined`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6106
     * is returned.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6107
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6108
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6109
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6110
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6111
     * @param {Object} object The object to inspect.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6112
     * @param {string} key The name of the property to resolve.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6113
     * @returns {*} Returns the resolved value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6114
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6115
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6116
     * var object = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6117
     *   'cheese': 'crumpets',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6118
     *   'stuff': function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6119
     *     return 'nonsense';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6120
     *   }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6121
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6122
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6123
     * _.result(object, 'cheese');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6124
     * // => 'crumpets'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6125
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6126
     * _.result(object, 'stuff');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6127
     * // => 'nonsense'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6128
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6129
    function result(object, key) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6130
      if (object) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6131
        var value = object[key];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6132
        return isFunction(value) ? object[key]() : value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6133
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6134
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6135
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6136
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6137
     * A micro-templating method that handles arbitrary delimiters, preserves
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6138
     * whitespace, and correctly escapes quotes within interpolated code.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6139
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6140
     * Note: In the development build, `_.template` utilizes sourceURLs for easier
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6141
     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6142
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6143
     * For more information on precompiling templates see:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6144
     * http://lodash.com/custom-builds
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6145
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6146
     * For more information on Chrome extension sandboxes see:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6147
     * http://developer.chrome.com/stable/extensions/sandboxingEval.html
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6148
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6149
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6150
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6151
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6152
     * @param {string} text The template text.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6153
     * @param {Object} data The data object used to populate the text.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6154
     * @param {Object} [options] The options object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6155
     * @param {RegExp} [options.escape] The "escape" delimiter.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6156
     * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6157
     * @param {Object} [options.imports] An object to import into the template as local variables.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6158
     * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6159
     * @param {string} [sourceURL] The sourceURL of the template's compiled source.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6160
     * @param {string} [variable] The data object variable name.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6161
     * @returns {Function|string} Returns a compiled function when no `data` object
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6162
     *  is given, else it returns the interpolated text.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6163
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6164
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6165
     * // using the "interpolate" delimiter to create a compiled template
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6166
     * var compiled = _.template('hello <%= name %>');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6167
     * compiled({ 'name': 'fred' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6168
     * // => 'hello fred'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6169
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6170
     * // using the "escape" delimiter to escape HTML in data property values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6171
     * _.template('<b><%- value %></b>', { 'value': '<script>' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6172
     * // => '<b>&lt;script&gt;</b>'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6173
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6174
     * // using the "evaluate" delimiter to generate HTML
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6175
     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6176
     * _.template(list, { 'people': ['fred', 'barney'] });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6177
     * // => '<li>fred</li><li>barney</li>'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6178
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6179
     * // using the ES6 delimiter as an alternative to the default "interpolate" delimiter
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6180
     * _.template('hello ${ name }', { 'name': 'pebbles' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6181
     * // => 'hello pebbles'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6182
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6183
     * // using the internal `print` function in "evaluate" delimiters
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6184
     * _.template('<% print("hello " + name); %>!', { 'name': 'barney' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6185
     * // => 'hello barney!'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6186
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6187
     * // using a custom template delimiters
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6188
     * _.templateSettings = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6189
     *   'interpolate': /{{([\s\S]+?)}}/g
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6190
     * };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6191
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6192
     * _.template('hello {{ name }}!', { 'name': 'mustache' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6193
     * // => 'hello mustache!'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6194
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6195
     * // using the `imports` option to import jQuery
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6196
     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6197
     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6198
     * // => '<li>fred</li><li>barney</li>'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6199
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6200
     * // using the `sourceURL` option to specify a custom sourceURL for the template
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6201
     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6202
     * compiled(data);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6203
     * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6204
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6205
     * // using the `variable` option to ensure a with-statement isn't used in the compiled template
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6206
     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6207
     * compiled.source;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6208
     * // => function(data) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6209
     *   var __t, __p = '', __e = _.escape;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6210
     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6211
     *   return __p;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6212
     * }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6213
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6214
     * // using the `source` property to inline compiled templates for meaningful
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6215
     * // line numbers in error messages and a stack trace
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6216
     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6217
     *   var JST = {\
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6218
     *     "main": ' + _.template(mainText).source + '\
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6219
     *   };\
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6220
     * ');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6221
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6222
    function template(text, data, options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6223
      // based on John Resig's `tmpl` implementation
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6224
      // http://ejohn.org/blog/javascript-micro-templating/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6225
      // and Laura Doktorova's doT.js
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6226
      // https://github.com/olado/doT
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6227
      var settings = lodash.templateSettings;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6228
      text = String(text || '');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6229
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6230
      // avoid missing dependencies when `iteratorTemplate` is not defined
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6231
      options = defaults({}, options, settings);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6232
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6233
      var imports = defaults({}, options.imports, settings.imports),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6234
          importsKeys = keys(imports),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6235
          importsValues = values(imports);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6236
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6237
      var isEvaluating,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6238
          index = 0,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6239
          interpolate = options.interpolate || reNoMatch,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6240
          source = "__p += '";
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6241
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6242
      // compile the regexp to match each delimiter
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6243
      var reDelimiters = RegExp(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6244
        (options.escape || reNoMatch).source + '|' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6245
        interpolate.source + '|' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6246
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6247
        (options.evaluate || reNoMatch).source + '|$'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6248
      , 'g');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6249
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6250
      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6251
        interpolateValue || (interpolateValue = esTemplateValue);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6252
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6253
        // escape characters that cannot be included in string literals
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6254
        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6255
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6256
        // replace delimiters with snippets
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6257
        if (escapeValue) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6258
          source += "' +\n__e(" + escapeValue + ") +\n'";
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6259
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6260
        if (evaluateValue) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6261
          isEvaluating = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6262
          source += "';\n" + evaluateValue + ";\n__p += '";
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6263
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6264
        if (interpolateValue) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6265
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6266
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6267
        index = offset + match.length;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6268
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6269
        // the JS engine embedded in Adobe products requires returning the `match`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6270
        // string in order to produce the correct `offset` value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6271
        return match;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6272
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6273
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6274
      source += "';\n";
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6275
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6276
      // if `variable` is not specified, wrap a with-statement around the generated
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6277
      // code to add the data object to the top of the scope chain
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6278
      var variable = options.variable,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6279
          hasVariable = variable;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6280
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6281
      if (!hasVariable) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6282
        variable = 'obj';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6283
        source = 'with (' + variable + ') {\n' + source + '\n}\n';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6284
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6285
      // cleanup code by stripping empty strings
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6286
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6287
        .replace(reEmptyStringMiddle, '$1')
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6288
        .replace(reEmptyStringTrailing, '$1;');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6289
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6290
      // frame code as the function body
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6291
      source = 'function(' + variable + ') {\n' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6292
        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\n') +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6293
        "var __t, __p = '', __e = _.escape" +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6294
        (isEvaluating
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6295
          ? ', __j = Array.prototype.join;\n' +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6296
            "function print() { __p += __j.call(arguments, '') }\n"
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6297
          : ';\n'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6298
        ) +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6299
        source +
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6300
        'return __p\n}';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6301
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6302
      // Use a sourceURL for easier debugging.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6303
      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6304
      var sourceURL = '\n/*\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\n*/';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6305
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6306
      try {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6307
        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6308
      } catch(e) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6309
        e.source = source;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6310
        throw e;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6311
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6312
      if (data) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6313
        return result(data);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6314
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6315
      // provide the compiled function's source by its `toString` method, in
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6316
      // supported environments, or the `source` property as a convenience for
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6317
      // inlining compiled templates during the build process
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6318
      result.source = source;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6319
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6320
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6321
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6322
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6323
     * Executes the callback `n` times, returning an array of the results
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6324
     * of each callback execution. The callback is bound to `thisArg` and invoked
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6325
     * with one argument; (index).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6326
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6327
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6328
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6329
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6330
     * @param {number} n The number of times to execute the callback.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6331
     * @param {Function} callback The function called per iteration.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6332
     * @param {*} [thisArg] The `this` binding of `callback`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6333
     * @returns {Array} Returns an array of the results of each `callback` execution.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6334
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6335
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6336
     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6337
     * // => [3, 6, 4]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6338
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6339
     * _.times(3, function(n) { mage.castSpell(n); });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6340
     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6341
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6342
     * _.times(3, function(n) { this.cast(n); }, mage);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6343
     * // => also calls `mage.castSpell(n)` three times
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6344
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6345
    function times(n, callback, thisArg) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6346
      n = (n = +n) > -1 ? n : 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6347
      var index = -1,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6348
          result = Array(n);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6349
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6350
      callback = baseCreateCallback(callback, thisArg, 1);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6351
      while (++index < n) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6352
        result[index] = callback(index);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6353
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6354
      return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6355
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6356
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6357
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6358
     * The inverse of `_.escape` this method converts the HTML entities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6359
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6360
     * corresponding characters.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6361
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6362
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6363
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6364
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6365
     * @param {string} string The string to unescape.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6366
     * @returns {string} Returns the unescaped string.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6367
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6368
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6369
     * _.unescape('Fred, Barney &amp; Pebbles');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6370
     * // => 'Fred, Barney & Pebbles'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6371
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6372
    function unescape(string) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6373
      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6374
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6375
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6376
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6377
     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6378
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6379
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6380
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6381
     * @category Utilities
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6382
     * @param {string} [prefix] The value to prefix the ID with.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6383
     * @returns {string} Returns the unique ID.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6384
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6385
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6386
     * _.uniqueId('contact_');
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6387
     * // => 'contact_104'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6388
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6389
     * _.uniqueId();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6390
     * // => '105'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6391
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6392
    function uniqueId(prefix) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6393
      var id = ++idCounter;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6394
      return String(prefix == null ? '' : prefix) + id;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6395
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6396
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6397
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6398
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6399
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6400
     * Creates a `lodash` object that wraps the given value with explicit
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6401
     * method chaining enabled.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6402
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6403
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6404
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6405
     * @category Chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6406
     * @param {*} value The value to wrap.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6407
     * @returns {Object} Returns the wrapper object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6408
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6409
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6410
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6411
     *   { 'name': 'barney',  'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6412
     *   { 'name': 'fred',    'age': 40 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6413
     *   { 'name': 'pebbles', 'age': 1 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6414
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6415
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6416
     * var youngest = _.chain(characters)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6417
     *     .sortBy('age')
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6418
     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6419
     *     .first()
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6420
     *     .value();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6421
     * // => 'pebbles is 1'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6422
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6423
    function chain(value) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6424
      value = new lodashWrapper(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6425
      value.__chain__ = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6426
      return value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6427
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6428
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6429
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6430
     * Invokes `interceptor` with the `value` as the first argument and then
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6431
     * returns `value`. The purpose of this method is to "tap into" a method
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6432
     * chain in order to perform operations on intermediate results within
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6433
     * the chain.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6434
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6435
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6436
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6437
     * @category Chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6438
     * @param {*} value The value to provide to `interceptor`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6439
     * @param {Function} interceptor The function to invoke.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6440
     * @returns {*} Returns `value`.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6441
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6442
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6443
     * _([1, 2, 3, 4])
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6444
     *  .tap(function(array) { array.pop(); })
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6445
     *  .reverse()
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6446
     *  .value();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6447
     * // => [3, 2, 1]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6448
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6449
    function tap(value, interceptor) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6450
      interceptor(value);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6451
      return value;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6452
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6453
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6454
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6455
     * Enables explicit method chaining on the wrapper object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6456
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6457
     * @name chain
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6458
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6459
     * @category Chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6460
     * @returns {*} Returns the wrapper object.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6461
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6462
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6463
     * var characters = [
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6464
     *   { 'name': 'barney', 'age': 36 },
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6465
     *   { 'name': 'fred',   'age': 40 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6466
     * ];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6467
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6468
     * // without explicit chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6469
     * _(characters).first();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6470
     * // => { 'name': 'barney', 'age': 36 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6471
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6472
     * // with explicit chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6473
     * _(characters).chain()
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6474
     *   .first()
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6475
     *   .pick('age')
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6476
     *   .value();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6477
     * // => { 'age': 36 }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6478
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6479
    function wrapperChain() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6480
      this.__chain__ = true;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6481
      return this;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6482
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6483
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6484
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6485
     * Produces the `toString` result of the wrapped value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6486
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6487
     * @name toString
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6488
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6489
     * @category Chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6490
     * @returns {string} Returns the string result.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6491
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6492
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6493
     * _([1, 2, 3]).toString();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6494
     * // => '1,2,3'
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6495
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6496
    function wrapperToString() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6497
      return String(this.__wrapped__);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6498
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6499
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6500
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6501
     * Extracts the wrapped value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6502
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6503
     * @name valueOf
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6504
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6505
     * @alias value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6506
     * @category Chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6507
     * @returns {*} Returns the wrapped value.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6508
     * @example
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6509
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6510
     * _([1, 2, 3]).valueOf();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6511
     * // => [1, 2, 3]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6512
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6513
    function wrapperValueOf() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6514
      return this.__wrapped__;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6515
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6516
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6517
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6518
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6519
    // add functions that return wrapped values when chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6520
    lodash.after = after;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6521
    lodash.assign = assign;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6522
    lodash.at = at;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6523
    lodash.bind = bind;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6524
    lodash.bindAll = bindAll;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6525
    lodash.bindKey = bindKey;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6526
    lodash.chain = chain;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6527
    lodash.compact = compact;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6528
    lodash.compose = compose;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6529
    lodash.constant = constant;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6530
    lodash.countBy = countBy;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6531
    lodash.create = create;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6532
    lodash.createCallback = createCallback;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6533
    lodash.curry = curry;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6534
    lodash.debounce = debounce;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6535
    lodash.defaults = defaults;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6536
    lodash.defer = defer;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6537
    lodash.delay = delay;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6538
    lodash.difference = difference;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6539
    lodash.filter = filter;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6540
    lodash.flatten = flatten;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6541
    lodash.forEach = forEach;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6542
    lodash.forEachRight = forEachRight;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6543
    lodash.forIn = forIn;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6544
    lodash.forInRight = forInRight;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6545
    lodash.forOwn = forOwn;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6546
    lodash.forOwnRight = forOwnRight;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6547
    lodash.functions = functions;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6548
    lodash.groupBy = groupBy;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6549
    lodash.indexBy = indexBy;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6550
    lodash.initial = initial;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6551
    lodash.intersection = intersection;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6552
    lodash.invert = invert;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6553
    lodash.invoke = invoke;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6554
    lodash.keys = keys;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6555
    lodash.map = map;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6556
    lodash.mapValues = mapValues;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6557
    lodash.max = max;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6558
    lodash.memoize = memoize;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6559
    lodash.merge = merge;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6560
    lodash.min = min;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6561
    lodash.omit = omit;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6562
    lodash.once = once;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6563
    lodash.pairs = pairs;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6564
    lodash.partial = partial;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6565
    lodash.partialRight = partialRight;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6566
    lodash.pick = pick;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6567
    lodash.pluck = pluck;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6568
    lodash.property = property;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6569
    lodash.pull = pull;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6570
    lodash.range = range;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6571
    lodash.reject = reject;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6572
    lodash.remove = remove;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6573
    lodash.rest = rest;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6574
    lodash.shuffle = shuffle;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6575
    lodash.sortBy = sortBy;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6576
    lodash.tap = tap;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6577
    lodash.throttle = throttle;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6578
    lodash.times = times;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6579
    lodash.toArray = toArray;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6580
    lodash.transform = transform;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6581
    lodash.union = union;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6582
    lodash.uniq = uniq;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6583
    lodash.values = values;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6584
    lodash.where = where;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6585
    lodash.without = without;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6586
    lodash.wrap = wrap;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6587
    lodash.xor = xor;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6588
    lodash.zip = zip;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6589
    lodash.zipObject = zipObject;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6590
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6591
    // add aliases
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6592
    lodash.collect = map;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6593
    lodash.drop = rest;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6594
    lodash.each = forEach;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6595
    lodash.eachRight = forEachRight;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6596
    lodash.extend = assign;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6597
    lodash.methods = functions;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6598
    lodash.object = zipObject;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6599
    lodash.select = filter;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6600
    lodash.tail = rest;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6601
    lodash.unique = uniq;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6602
    lodash.unzip = zip;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6603
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6604
    // add functions to `lodash.prototype`
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6605
    mixin(lodash);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6606
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6607
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6608
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6609
    // add functions that return unwrapped values when chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6610
    lodash.clone = clone;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6611
    lodash.cloneDeep = cloneDeep;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6612
    lodash.contains = contains;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6613
    lodash.escape = escape;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6614
    lodash.every = every;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6615
    lodash.find = find;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6616
    lodash.findIndex = findIndex;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6617
    lodash.findKey = findKey;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6618
    lodash.findLast = findLast;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6619
    lodash.findLastIndex = findLastIndex;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6620
    lodash.findLastKey = findLastKey;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6621
    lodash.has = has;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6622
    lodash.identity = identity;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6623
    lodash.indexOf = indexOf;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6624
    lodash.isArguments = isArguments;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6625
    lodash.isArray = isArray;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6626
    lodash.isBoolean = isBoolean;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6627
    lodash.isDate = isDate;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6628
    lodash.isElement = isElement;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6629
    lodash.isEmpty = isEmpty;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6630
    lodash.isEqual = isEqual;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6631
    lodash.isFinite = isFinite;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6632
    lodash.isFunction = isFunction;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6633
    lodash.isNaN = isNaN;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6634
    lodash.isNull = isNull;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6635
    lodash.isNumber = isNumber;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6636
    lodash.isObject = isObject;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6637
    lodash.isPlainObject = isPlainObject;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6638
    lodash.isRegExp = isRegExp;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6639
    lodash.isString = isString;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6640
    lodash.isUndefined = isUndefined;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6641
    lodash.lastIndexOf = lastIndexOf;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6642
    lodash.mixin = mixin;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6643
    lodash.noConflict = noConflict;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6644
    lodash.noop = noop;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6645
    lodash.now = now;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6646
    lodash.parseInt = parseInt;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6647
    lodash.random = random;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6648
    lodash.reduce = reduce;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6649
    lodash.reduceRight = reduceRight;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6650
    lodash.result = result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6651
    lodash.runInContext = runInContext;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6652
    lodash.size = size;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6653
    lodash.some = some;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6654
    lodash.sortedIndex = sortedIndex;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6655
    lodash.template = template;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6656
    lodash.unescape = unescape;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6657
    lodash.uniqueId = uniqueId;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6658
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6659
    // add aliases
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6660
    lodash.all = every;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6661
    lodash.any = some;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6662
    lodash.detect = find;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6663
    lodash.findWhere = find;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6664
    lodash.foldl = reduce;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6665
    lodash.foldr = reduceRight;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6666
    lodash.include = contains;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6667
    lodash.inject = reduce;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6668
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6669
    mixin(function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6670
      var source = {}
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6671
      forOwn(lodash, function(func, methodName) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6672
        if (!lodash.prototype[methodName]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6673
          source[methodName] = func;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6674
        }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6675
      });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6676
      return source;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6677
    }(), false);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6678
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6679
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6680
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6681
    // add functions capable of returning wrapped and unwrapped values when chaining
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6682
    lodash.first = first;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6683
    lodash.last = last;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6684
    lodash.sample = sample;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6685
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6686
    // add aliases
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6687
    lodash.take = first;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6688
    lodash.head = first;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6689
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6690
    forOwn(lodash, function(func, methodName) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6691
      var callbackable = methodName !== 'sample';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6692
      if (!lodash.prototype[methodName]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6693
        lodash.prototype[methodName]= function(n, guard) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6694
          var chainAll = this.__chain__,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6695
              result = func(this.__wrapped__, n, guard);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6696
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6697
          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6698
            ? result
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6699
            : new lodashWrapper(result, chainAll);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6700
        };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6701
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6702
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6703
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6704
    /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6705
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6706
    /**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6707
     * The semantic version number.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6708
     *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6709
     * @static
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6710
     * @memberOf _
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6711
     * @type string
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6712
     */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6713
    lodash.VERSION = '2.4.1';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6714
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6715
    // add "Chaining" functions to the wrapper
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6716
    lodash.prototype.chain = wrapperChain;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6717
    lodash.prototype.toString = wrapperToString;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6718
    lodash.prototype.value = wrapperValueOf;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6719
    lodash.prototype.valueOf = wrapperValueOf;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6720
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6721
    // add `Array` functions that return unwrapped values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6722
    forEach(['join', 'pop', 'shift'], function(methodName) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6723
      var func = arrayRef[methodName];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6724
      lodash.prototype[methodName] = function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6725
        var chainAll = this.__chain__,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6726
            result = func.apply(this.__wrapped__, arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6727
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6728
        return chainAll
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6729
          ? new lodashWrapper(result, chainAll)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6730
          : result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6731
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6732
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6733
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6734
    // add `Array` functions that return the existing wrapped value
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6735
    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6736
      var func = arrayRef[methodName];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6737
      lodash.prototype[methodName] = function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6738
        func.apply(this.__wrapped__, arguments);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6739
        return this;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6740
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6741
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6742
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6743
    // add `Array` functions that return new wrapped values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6744
    forEach(['concat', 'slice', 'splice'], function(methodName) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6745
      var func = arrayRef[methodName];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6746
      lodash.prototype[methodName] = function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6747
        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6748
      };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6749
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6750
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6751
    return lodash;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6752
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6753
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6754
  /*--------------------------------------------------------------------------*/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6755
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6756
  // expose Lo-Dash
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6757
  var _ = runInContext();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6758
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6759
  // some AMD build optimizers like r.js check for condition patterns like the following:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6760
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6761
    // Expose Lo-Dash to the global object even when an AMD loader is present in
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6762
    // case Lo-Dash is loaded with a RequireJS shim config.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6763
    // See http://requirejs.org/docs/api.html#config-shim
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6764
    root._ = _;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6765
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6766
    // define as an anonymous module so, through path mapping, it can be
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6767
    // referenced as the "underscore" module
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6768
    define(function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6769
      return _;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6770
    });
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6771
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6772
  // check for `exports` after `define` in case a build optimizer adds an `exports` object
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6773
  else if (freeExports && freeModule) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6774
    // in Node.js or RingoJS
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6775
    if (moduleExports) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6776
      (freeModule.exports = _)._ = _;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6777
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6778
    // in Narwhal or Rhino -require
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6779
    else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6780
      freeExports._ = _;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6781
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6782
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6783
  else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6784
    // in a browser or Rhino
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6785
    root._ = _;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6786
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6787
}.call(this));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6788
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6789
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6790
130
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6791
},{}],"moment":[function(require,module,exports){
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6792
(function (global){
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6793
//! moment.js
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6794
//! version : 2.9.0
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6795
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6796
//! license : MIT
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6797
//! momentjs.com
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6798
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6799
(function (undefined) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6800
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6801
        Constants
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6802
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6803
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6804
    var moment,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6805
        VERSION = '2.9.0',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6806
        // the global-scope this is NOT the global object in Node.js
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6807
        globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6808
        oldGlobalMoment,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6809
        round = Math.round,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6810
        hasOwnProperty = Object.prototype.hasOwnProperty,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6811
        i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6812
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6813
        YEAR = 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6814
        MONTH = 1,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6815
        DATE = 2,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6816
        HOUR = 3,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6817
        MINUTE = 4,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6818
        SECOND = 5,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6819
        MILLISECOND = 6,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6820
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6821
        // internal storage for locale config files
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6822
        locales = {},
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6823
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6824
        // extra moment internal properties (plugins register props here)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6825
        momentProperties = [],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6826
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6827
        // check for nodeJS
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6828
        hasModule = (typeof module !== 'undefined' && module && module.exports),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6829
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6830
        // ASP.NET json date format regex
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6831
        aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6832
        aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6833
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6834
        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6835
        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6836
        isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6837
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6838
        // format tokens
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6839
        formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6840
        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6841
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6842
        // parsing token regexes
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6843
        parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6844
        parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6845
        parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6846
        parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6847
        parseTokenDigits = /\d+/, // nonzero number of digits
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6848
        parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6849
        parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6850
        parseTokenT = /T/i, // T (ISO separator)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6851
        parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6852
        parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6853
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6854
        //strict parsing regexes
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6855
        parseTokenOneDigit = /\d/, // 0 - 9
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6856
        parseTokenTwoDigits = /\d\d/, // 00 - 99
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6857
        parseTokenThreeDigits = /\d{3}/, // 000 - 999
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6858
        parseTokenFourDigits = /\d{4}/, // 0000 - 9999
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6859
        parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6860
        parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6861
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6862
        // iso 8601 regex
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6863
        // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6864
        isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6865
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6866
        isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6867
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6868
        isoDates = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6869
            ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6870
            ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6871
            ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6872
            ['GGGG-[W]WW', /\d{4}-W\d{2}/],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6873
            ['YYYY-DDD', /\d{4}-\d{3}/]
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6874
        ],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6875
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6876
        // iso time formats and regexes
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6877
        isoTimes = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6878
            ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6879
            ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6880
            ['HH:mm', /(T| )\d\d:\d\d/],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6881
            ['HH', /(T| )\d\d/]
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6882
        ],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6883
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6884
        // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6885
        parseTimezoneChunker = /([\+\-]|\d\d)/gi,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6886
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6887
        // getter and setter names
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6888
        proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6889
        unitMillisecondFactors = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6890
            'Milliseconds' : 1,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6891
            'Seconds' : 1e3,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6892
            'Minutes' : 6e4,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6893
            'Hours' : 36e5,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6894
            'Days' : 864e5,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6895
            'Months' : 2592e6,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6896
            'Years' : 31536e6
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6897
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6898
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6899
        unitAliases = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6900
            ms : 'millisecond',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6901
            s : 'second',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6902
            m : 'minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6903
            h : 'hour',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6904
            d : 'day',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6905
            D : 'date',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6906
            w : 'week',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6907
            W : 'isoWeek',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6908
            M : 'month',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6909
            Q : 'quarter',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6910
            y : 'year',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6911
            DDD : 'dayOfYear',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6912
            e : 'weekday',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6913
            E : 'isoWeekday',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6914
            gg: 'weekYear',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6915
            GG: 'isoWeekYear'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6916
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6917
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6918
        camelFunctions = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6919
            dayofyear : 'dayOfYear',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6920
            isoweekday : 'isoWeekday',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6921
            isoweek : 'isoWeek',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6922
            weekyear : 'weekYear',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6923
            isoweekyear : 'isoWeekYear'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6924
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6925
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6926
        // format function strings
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6927
        formatFunctions = {},
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6928
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6929
        // default relative time thresholds
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6930
        relativeTimeThresholds = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6931
            s: 45,  // seconds to minute
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6932
            m: 45,  // minutes to hour
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6933
            h: 22,  // hours to day
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6934
            d: 26,  // days to month
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6935
            M: 11   // months to year
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6936
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6937
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6938
        // tokens to ordinalize and pad
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6939
        ordinalizeTokens = 'DDD w W M D d'.split(' '),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6940
        paddedTokens = 'M D H h m s w W'.split(' '),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6941
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6942
        formatTokenFunctions = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6943
            M    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6944
                return this.month() + 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6945
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6946
            MMM  : function (format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6947
                return this.localeData().monthsShort(this, format);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6948
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6949
            MMMM : function (format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6950
                return this.localeData().months(this, format);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6951
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6952
            D    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6953
                return this.date();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6954
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6955
            DDD  : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6956
                return this.dayOfYear();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6957
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6958
            d    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6959
                return this.day();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6960
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6961
            dd   : function (format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6962
                return this.localeData().weekdaysMin(this, format);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6963
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6964
            ddd  : function (format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6965
                return this.localeData().weekdaysShort(this, format);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6966
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6967
            dddd : function (format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6968
                return this.localeData().weekdays(this, format);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6969
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6970
            w    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6971
                return this.week();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6972
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6973
            W    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6974
                return this.isoWeek();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6975
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6976
            YY   : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6977
                return leftZeroFill(this.year() % 100, 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6978
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6979
            YYYY : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6980
                return leftZeroFill(this.year(), 4);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6981
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6982
            YYYYY : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6983
                return leftZeroFill(this.year(), 5);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6984
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6985
            YYYYYY : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6986
                var y = this.year(), sign = y >= 0 ? '+' : '-';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6987
                return sign + leftZeroFill(Math.abs(y), 6);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6988
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6989
            gg   : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6990
                return leftZeroFill(this.weekYear() % 100, 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6991
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6992
            gggg : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6993
                return leftZeroFill(this.weekYear(), 4);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6994
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6995
            ggggg : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6996
                return leftZeroFill(this.weekYear(), 5);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6997
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6998
            GG   : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  6999
                return leftZeroFill(this.isoWeekYear() % 100, 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7000
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7001
            GGGG : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7002
                return leftZeroFill(this.isoWeekYear(), 4);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7003
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7004
            GGGGG : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7005
                return leftZeroFill(this.isoWeekYear(), 5);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7006
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7007
            e : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7008
                return this.weekday();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7009
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7010
            E : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7011
                return this.isoWeekday();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7012
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7013
            a    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7014
                return this.localeData().meridiem(this.hours(), this.minutes(), true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7015
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7016
            A    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7017
                return this.localeData().meridiem(this.hours(), this.minutes(), false);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7018
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7019
            H    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7020
                return this.hours();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7021
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7022
            h    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7023
                return this.hours() % 12 || 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7024
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7025
            m    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7026
                return this.minutes();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7027
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7028
            s    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7029
                return this.seconds();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7030
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7031
            S    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7032
                return toInt(this.milliseconds() / 100);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7033
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7034
            SS   : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7035
                return leftZeroFill(toInt(this.milliseconds() / 10), 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7036
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7037
            SSS  : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7038
                return leftZeroFill(this.milliseconds(), 3);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7039
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7040
            SSSS : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7041
                return leftZeroFill(this.milliseconds(), 3);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7042
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7043
            Z    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7044
                var a = this.utcOffset(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7045
                    b = '+';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7046
                if (a < 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7047
                    a = -a;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7048
                    b = '-';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7049
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7050
                return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7051
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7052
            ZZ   : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7053
                var a = this.utcOffset(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7054
                    b = '+';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7055
                if (a < 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7056
                    a = -a;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7057
                    b = '-';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7058
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7059
                return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7060
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7061
            z : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7062
                return this.zoneAbbr();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7063
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7064
            zz : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7065
                return this.zoneName();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7066
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7067
            x    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7068
                return this.valueOf();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7069
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7070
            X    : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7071
                return this.unix();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7072
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7073
            Q : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7074
                return this.quarter();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7075
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7076
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7077
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7078
        deprecations = {},
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7079
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7080
        lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7081
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7082
        updateInProgress = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7083
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7084
    // Pick the first defined of two or three arguments. dfl comes from
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7085
    // default.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7086
    function dfl(a, b, c) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7087
        switch (arguments.length) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7088
            case 2: return a != null ? a : b;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7089
            case 3: return a != null ? a : b != null ? b : c;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7090
            default: throw new Error('Implement me');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7091
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7092
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7093
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7094
    function hasOwnProp(a, b) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7095
        return hasOwnProperty.call(a, b);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7096
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7097
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7098
    function defaultParsingFlags() {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7099
        // We need to deep clone this object, and es5 standard is not very
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7100
        // helpful.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7101
        return {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7102
            empty : false,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7103
            unusedTokens : [],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7104
            unusedInput : [],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7105
            overflow : -2,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7106
            charsLeftOver : 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7107
            nullInput : false,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7108
            invalidMonth : null,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7109
            invalidFormat : false,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7110
            userInvalidated : false,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7111
            iso: false
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7112
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7113
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7114
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7115
    function printMsg(msg) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7116
        if (moment.suppressDeprecationWarnings === false &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7117
                typeof console !== 'undefined' && console.warn) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7118
            console.warn('Deprecation warning: ' + msg);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7119
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7120
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7121
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7122
    function deprecate(msg, fn) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7123
        var firstTime = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7124
        return extend(function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7125
            if (firstTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7126
                printMsg(msg);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7127
                firstTime = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7128
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7129
            return fn.apply(this, arguments);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7130
        }, fn);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7131
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7132
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7133
    function deprecateSimple(name, msg) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7134
        if (!deprecations[name]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7135
            printMsg(msg);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7136
            deprecations[name] = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7137
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7138
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7139
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7140
    function padToken(func, count) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7141
        return function (a) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7142
            return leftZeroFill(func.call(this, a), count);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7143
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7144
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7145
    function ordinalizeToken(func, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7146
        return function (a) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7147
            return this.localeData().ordinal(func.call(this, a), period);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7148
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7149
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7150
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7151
    function monthDiff(a, b) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7152
        // difference in months
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7153
        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7154
            // b is in (anchor - 1 month, anchor + 1 month)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7155
            anchor = a.clone().add(wholeMonthDiff, 'months'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7156
            anchor2, adjust;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7157
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7158
        if (b - anchor < 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7159
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7160
            // linear across the month
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7161
            adjust = (b - anchor) / (anchor - anchor2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7162
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7163
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7164
            // linear across the month
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7165
            adjust = (b - anchor) / (anchor2 - anchor);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7166
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7167
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7168
        return -(wholeMonthDiff + adjust);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7169
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7170
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7171
    while (ordinalizeTokens.length) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7172
        i = ordinalizeTokens.pop();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7173
        formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7174
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7175
    while (paddedTokens.length) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7176
        i = paddedTokens.pop();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7177
        formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7178
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7179
    formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7180
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7181
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7182
    function meridiemFixWrap(locale, hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7183
        var isPm;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7184
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7185
        if (meridiem == null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7186
            // nothing to do
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7187
            return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7188
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7189
        if (locale.meridiemHour != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7190
            return locale.meridiemHour(hour, meridiem);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7191
        } else if (locale.isPM != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7192
            // Fallback
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7193
            isPm = locale.isPM(meridiem);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7194
            if (isPm && hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7195
                hour += 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7196
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7197
            if (!isPm && hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7198
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7199
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7200
            return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7201
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7202
            // thie is not supposed to happen
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7203
            return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7204
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7205
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7206
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7207
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7208
        Constructors
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7209
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7210
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7211
    function Locale() {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7212
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7213
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7214
    // Moment prototype object
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7215
    function Moment(config, skipOverflow) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7216
        if (skipOverflow !== false) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7217
            checkOverflow(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7218
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7219
        copyConfig(this, config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7220
        this._d = new Date(+config._d);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7221
        // Prevent infinite loop in case updateOffset creates new moment
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7222
        // objects.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7223
        if (updateInProgress === false) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7224
            updateInProgress = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7225
            moment.updateOffset(this);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7226
            updateInProgress = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7227
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7228
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7229
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7230
    // Duration Constructor
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7231
    function Duration(duration) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7232
        var normalizedInput = normalizeObjectUnits(duration),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7233
            years = normalizedInput.year || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7234
            quarters = normalizedInput.quarter || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7235
            months = normalizedInput.month || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7236
            weeks = normalizedInput.week || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7237
            days = normalizedInput.day || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7238
            hours = normalizedInput.hour || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7239
            minutes = normalizedInput.minute || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7240
            seconds = normalizedInput.second || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7241
            milliseconds = normalizedInput.millisecond || 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7242
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7243
        // representation for dateAddRemove
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7244
        this._milliseconds = +milliseconds +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7245
            seconds * 1e3 + // 1000
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7246
            minutes * 6e4 + // 1000 * 60
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7247
            hours * 36e5; // 1000 * 60 * 60
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7248
        // Because of dateAddRemove treats 24 hours as different from a
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7249
        // day when working around DST, we need to store them separately
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7250
        this._days = +days +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7251
            weeks * 7;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7252
        // It is impossible translate months into days without knowing
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7253
        // which months you are are talking about, so we have to store
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7254
        // it separately.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7255
        this._months = +months +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7256
            quarters * 3 +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7257
            years * 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7258
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7259
        this._data = {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7260
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7261
        this._locale = moment.localeData();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7262
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7263
        this._bubble();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7264
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7265
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7266
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7267
        Helpers
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7268
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7269
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7270
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7271
    function extend(a, b) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7272
        for (var i in b) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7273
            if (hasOwnProp(b, i)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7274
                a[i] = b[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7275
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7276
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7277
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7278
        if (hasOwnProp(b, 'toString')) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7279
            a.toString = b.toString;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7280
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7281
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7282
        if (hasOwnProp(b, 'valueOf')) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7283
            a.valueOf = b.valueOf;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7284
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7285
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7286
        return a;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7287
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7288
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7289
    function copyConfig(to, from) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7290
        var i, prop, val;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7291
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7292
        if (typeof from._isAMomentObject !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7293
            to._isAMomentObject = from._isAMomentObject;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7294
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7295
        if (typeof from._i !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7296
            to._i = from._i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7297
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7298
        if (typeof from._f !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7299
            to._f = from._f;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7300
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7301
        if (typeof from._l !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7302
            to._l = from._l;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7303
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7304
        if (typeof from._strict !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7305
            to._strict = from._strict;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7306
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7307
        if (typeof from._tzm !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7308
            to._tzm = from._tzm;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7309
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7310
        if (typeof from._isUTC !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7311
            to._isUTC = from._isUTC;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7312
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7313
        if (typeof from._offset !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7314
            to._offset = from._offset;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7315
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7316
        if (typeof from._pf !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7317
            to._pf = from._pf;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7318
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7319
        if (typeof from._locale !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7320
            to._locale = from._locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7321
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7322
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7323
        if (momentProperties.length > 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7324
            for (i in momentProperties) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7325
                prop = momentProperties[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7326
                val = from[prop];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7327
                if (typeof val !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7328
                    to[prop] = val;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7329
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7330
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7331
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7332
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7333
        return to;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7334
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7335
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7336
    function absRound(number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7337
        if (number < 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7338
            return Math.ceil(number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7339
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7340
            return Math.floor(number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7341
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7342
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7343
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7344
    // left zero fill a number
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7345
    // see http://jsperf.com/left-zero-filling for performance comparison
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7346
    function leftZeroFill(number, targetLength, forceSign) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7347
        var output = '' + Math.abs(number),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7348
            sign = number >= 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7349
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7350
        while (output.length < targetLength) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7351
            output = '0' + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7352
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7353
        return (sign ? (forceSign ? '+' : '') : '-') + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7354
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7355
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7356
    function positiveMomentsDifference(base, other) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7357
        var res = {milliseconds: 0, months: 0};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7358
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7359
        res.months = other.month() - base.month() +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7360
            (other.year() - base.year()) * 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7361
        if (base.clone().add(res.months, 'M').isAfter(other)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7362
            --res.months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7363
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7364
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7365
        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7366
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7367
        return res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7368
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7369
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7370
    function momentsDifference(base, other) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7371
        var res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7372
        other = makeAs(other, base);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7373
        if (base.isBefore(other)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7374
            res = positiveMomentsDifference(base, other);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7375
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7376
            res = positiveMomentsDifference(other, base);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7377
            res.milliseconds = -res.milliseconds;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7378
            res.months = -res.months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7379
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7380
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7381
        return res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7382
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7383
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7384
    // TODO: remove 'name' arg after deprecation is removed
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7385
    function createAdder(direction, name) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7386
        return function (val, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7387
            var dur, tmp;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7388
            //invert the arguments, but complain about it
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7389
            if (period !== null && !isNaN(+period)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7390
                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7391
                tmp = val; val = period; period = tmp;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7392
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7393
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7394
            val = typeof val === 'string' ? +val : val;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7395
            dur = moment.duration(val, period);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7396
            addOrSubtractDurationFromMoment(this, dur, direction);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7397
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7398
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7399
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7400
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7401
    function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7402
        var milliseconds = duration._milliseconds,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7403
            days = duration._days,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7404
            months = duration._months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7405
        updateOffset = updateOffset == null ? true : updateOffset;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7406
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7407
        if (milliseconds) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7408
            mom._d.setTime(+mom._d + milliseconds * isAdding);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7409
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7410
        if (days) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7411
            rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7412
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7413
        if (months) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7414
            rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7415
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7416
        if (updateOffset) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7417
            moment.updateOffset(mom, days || months);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7418
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7419
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7420
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7421
    // check if is an array
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7422
    function isArray(input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7423
        return Object.prototype.toString.call(input) === '[object Array]';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7424
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7425
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7426
    function isDate(input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7427
        return Object.prototype.toString.call(input) === '[object Date]' ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7428
            input instanceof Date;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7429
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7430
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7431
    // compare two arrays, return the number of differences
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7432
    function compareArrays(array1, array2, dontConvert) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7433
        var len = Math.min(array1.length, array2.length),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7434
            lengthDiff = Math.abs(array1.length - array2.length),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7435
            diffs = 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7436
            i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7437
        for (i = 0; i < len; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7438
            if ((dontConvert && array1[i] !== array2[i]) ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7439
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7440
                diffs++;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7441
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7442
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7443
        return diffs + lengthDiff;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7444
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7445
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7446
    function normalizeUnits(units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7447
        if (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7448
            var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7449
            units = unitAliases[units] || camelFunctions[lowered] || lowered;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7450
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7451
        return units;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7452
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7453
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7454
    function normalizeObjectUnits(inputObject) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7455
        var normalizedInput = {},
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7456
            normalizedProp,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7457
            prop;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7458
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7459
        for (prop in inputObject) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7460
            if (hasOwnProp(inputObject, prop)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7461
                normalizedProp = normalizeUnits(prop);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7462
                if (normalizedProp) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7463
                    normalizedInput[normalizedProp] = inputObject[prop];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7464
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7465
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7466
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7467
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7468
        return normalizedInput;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7469
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7470
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7471
    function makeList(field) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7472
        var count, setter;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7473
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7474
        if (field.indexOf('week') === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7475
            count = 7;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7476
            setter = 'day';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7477
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7478
        else if (field.indexOf('month') === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7479
            count = 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7480
            setter = 'month';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7481
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7482
        else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7483
            return;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7484
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7485
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7486
        moment[field] = function (format, index) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7487
            var i, getter,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7488
                method = moment._locale[field],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7489
                results = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7490
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7491
            if (typeof format === 'number') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7492
                index = format;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7493
                format = undefined;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7494
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7495
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7496
            getter = function (i) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7497
                var m = moment().utc().set(setter, i);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7498
                return method.call(moment._locale, m, format || '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7499
            };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7500
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7501
            if (index != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7502
                return getter(index);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7503
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7504
            else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7505
                for (i = 0; i < count; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7506
                    results.push(getter(i));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7507
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7508
                return results;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7509
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7510
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7511
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7512
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7513
    function toInt(argumentForCoercion) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7514
        var coercedNumber = +argumentForCoercion,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7515
            value = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7516
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7517
        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7518
            if (coercedNumber >= 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7519
                value = Math.floor(coercedNumber);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7520
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7521
                value = Math.ceil(coercedNumber);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7522
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7523
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7524
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7525
        return value;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7526
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7527
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7528
    function daysInMonth(year, month) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7529
        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7530
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7531
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7532
    function weeksInYear(year, dow, doy) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7533
        return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7534
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7535
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7536
    function daysInYear(year) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7537
        return isLeapYear(year) ? 366 : 365;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7538
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7539
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7540
    function isLeapYear(year) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7541
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7542
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7543
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7544
    function checkOverflow(m) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7545
        var overflow;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7546
        if (m._a && m._pf.overflow === -2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7547
            overflow =
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7548
                m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7549
                m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7550
                m._a[HOUR] < 0 || m._a[HOUR] > 24 ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7551
                    (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7552
                                           m._a[SECOND] !== 0 ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7553
                                           m._a[MILLISECOND] !== 0)) ? HOUR :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7554
                m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7555
                m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7556
                m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7557
                -1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7558
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7559
            if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7560
                overflow = DATE;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7561
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7562
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7563
            m._pf.overflow = overflow;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7564
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7565
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7566
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7567
    function isValid(m) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7568
        if (m._isValid == null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7569
            m._isValid = !isNaN(m._d.getTime()) &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7570
                m._pf.overflow < 0 &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7571
                !m._pf.empty &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7572
                !m._pf.invalidMonth &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7573
                !m._pf.nullInput &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7574
                !m._pf.invalidFormat &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7575
                !m._pf.userInvalidated;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7576
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7577
            if (m._strict) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7578
                m._isValid = m._isValid &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7579
                    m._pf.charsLeftOver === 0 &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7580
                    m._pf.unusedTokens.length === 0 &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7581
                    m._pf.bigHour === undefined;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7582
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7583
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7584
        return m._isValid;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7585
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7586
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7587
    function normalizeLocale(key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7588
        return key ? key.toLowerCase().replace('_', '-') : key;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7589
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7590
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7591
    // pick the locale from the array
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7592
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7593
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7594
    function chooseLocale(names) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7595
        var i = 0, j, next, locale, split;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7596
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7597
        while (i < names.length) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7598
            split = normalizeLocale(names[i]).split('-');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7599
            j = split.length;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7600
            next = normalizeLocale(names[i + 1]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7601
            next = next ? next.split('-') : null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7602
            while (j > 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7603
                locale = loadLocale(split.slice(0, j).join('-'));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7604
                if (locale) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7605
                    return locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7606
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7607
                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7608
                    //the next array item is better than a shallower substring of this one
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7609
                    break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7610
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7611
                j--;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7612
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7613
            i++;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7614
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7615
        return null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7616
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7617
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7618
    function loadLocale(name) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7619
        var oldLocale = null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7620
        if (!locales[name] && hasModule) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7621
            try {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7622
                oldLocale = moment.locale();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7623
                require('./locale/' + name);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7624
                // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7625
                moment.locale(oldLocale);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7626
            } catch (e) { }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7627
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7628
        return locales[name];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7629
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7630
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7631
    // Return a moment from input, that is local/utc/utcOffset equivalent to
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7632
    // model.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7633
    function makeAs(input, model) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7634
        var res, diff;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7635
        if (model._isUTC) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7636
            res = model.clone();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7637
            diff = (moment.isMoment(input) || isDate(input) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7638
                    +input : +moment(input)) - (+res);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7639
            // Use low-level api, because this fn is low-level api.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7640
            res._d.setTime(+res._d + diff);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7641
            moment.updateOffset(res, false);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7642
            return res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7643
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7644
            return moment(input).local();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7645
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7646
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7647
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7648
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7649
        Locale
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7650
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7651
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7652
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7653
    extend(Locale.prototype, {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7654
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7655
        set : function (config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7656
            var prop, i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7657
            for (i in config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7658
                prop = config[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7659
                if (typeof prop === 'function') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7660
                    this[i] = prop;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7661
                } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7662
                    this['_' + i] = prop;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7663
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7664
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7665
            // Lenient ordinal parsing accepts just a number in addition to
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7666
            // number + (possibly) stuff coming from _ordinalParseLenient.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7667
            this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7668
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7669
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7670
        _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7671
        months : function (m) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7672
            return this._months[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7673
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7674
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7675
        _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7676
        monthsShort : function (m) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7677
            return this._monthsShort[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7678
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7679
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7680
        monthsParse : function (monthName, format, strict) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7681
            var i, mom, regex;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7682
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7683
            if (!this._monthsParse) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7684
                this._monthsParse = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7685
                this._longMonthsParse = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7686
                this._shortMonthsParse = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7687
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7688
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7689
            for (i = 0; i < 12; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7690
                // make the regex if we don't have it already
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7691
                mom = moment.utc([2000, i]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7692
                if (strict && !this._longMonthsParse[i]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7693
                    this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7694
                    this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7695
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7696
                if (!strict && !this._monthsParse[i]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7697
                    regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7698
                    this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7699
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7700
                // test the regex
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7701
                if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7702
                    return i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7703
                } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7704
                    return i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7705
                } else if (!strict && this._monthsParse[i].test(monthName)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7706
                    return i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7707
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7708
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7709
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7710
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7711
        _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7712
        weekdays : function (m) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7713
            return this._weekdays[m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7714
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7715
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7716
        _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7717
        weekdaysShort : function (m) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7718
            return this._weekdaysShort[m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7719
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7720
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7721
        _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7722
        weekdaysMin : function (m) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7723
            return this._weekdaysMin[m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7724
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7725
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7726
        weekdaysParse : function (weekdayName) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7727
            var i, mom, regex;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7728
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7729
            if (!this._weekdaysParse) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7730
                this._weekdaysParse = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7731
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7732
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7733
            for (i = 0; i < 7; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7734
                // make the regex if we don't have it already
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7735
                if (!this._weekdaysParse[i]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7736
                    mom = moment([2000, 1]).day(i);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7737
                    regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7738
                    this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7739
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7740
                // test the regex
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7741
                if (this._weekdaysParse[i].test(weekdayName)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7742
                    return i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7743
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7744
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7745
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7746
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7747
        _longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7748
            LTS : 'h:mm:ss A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7749
            LT : 'h:mm A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7750
            L : 'MM/DD/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7751
            LL : 'MMMM D, YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7752
            LLL : 'MMMM D, YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7753
            LLLL : 'dddd, MMMM D, YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7754
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7755
        longDateFormat : function (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7756
            var output = this._longDateFormat[key];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7757
            if (!output && this._longDateFormat[key.toUpperCase()]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7758
                output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7759
                    return val.slice(1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7760
                });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7761
                this._longDateFormat[key] = output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7762
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7763
            return output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7764
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7765
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7766
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7767
            // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7768
            // Using charAt should be more compatible.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7769
            return ((input + '').toLowerCase().charAt(0) === 'p');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7770
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7771
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7772
        _meridiemParse : /[ap]\.?m?\.?/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7773
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7774
            if (hours > 11) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7775
                return isLower ? 'pm' : 'PM';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7776
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7777
                return isLower ? 'am' : 'AM';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7778
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7779
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7780
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7781
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7782
        _calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7783
            sameDay : '[Today at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7784
            nextDay : '[Tomorrow at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7785
            nextWeek : 'dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7786
            lastDay : '[Yesterday at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7787
            lastWeek : '[Last] dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7788
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7789
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7790
        calendar : function (key, mom, now) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7791
            var output = this._calendar[key];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7792
            return typeof output === 'function' ? output.apply(mom, [now]) : output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7793
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7794
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7795
        _relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7796
            future : 'in %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7797
            past : '%s ago',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7798
            s : 'a few seconds',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7799
            m : 'a minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7800
            mm : '%d minutes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7801
            h : 'an hour',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7802
            hh : '%d hours',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7803
            d : 'a day',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7804
            dd : '%d days',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7805
            M : 'a month',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7806
            MM : '%d months',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7807
            y : 'a year',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7808
            yy : '%d years'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7809
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7810
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7811
        relativeTime : function (number, withoutSuffix, string, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7812
            var output = this._relativeTime[string];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7813
            return (typeof output === 'function') ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7814
                output(number, withoutSuffix, string, isFuture) :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7815
                output.replace(/%d/i, number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7816
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7817
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7818
        pastFuture : function (diff, output) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7819
            var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7820
            return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7821
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7822
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7823
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7824
            return this._ordinal.replace('%d', number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7825
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7826
        _ordinal : '%d',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7827
        _ordinalParse : /\d{1,2}/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7828
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7829
        preparse : function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7830
            return string;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7831
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7832
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7833
        postformat : function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7834
            return string;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7835
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7836
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7837
        week : function (mom) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7838
            return weekOfYear(mom, this._week.dow, this._week.doy).week;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7839
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7840
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7841
        _week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7842
            dow : 0, // Sunday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7843
            doy : 6  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7844
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7845
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7846
        firstDayOfWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7847
            return this._week.dow;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7848
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7849
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7850
        firstDayOfYear : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7851
            return this._week.doy;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7852
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7853
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7854
        _invalidDate: 'Invalid date',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7855
        invalidDate: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7856
            return this._invalidDate;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7857
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7858
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7859
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7860
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7861
        Formatting
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7862
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7863
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7864
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7865
    function removeFormattingTokens(input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7866
        if (input.match(/\[[\s\S]/)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7867
            return input.replace(/^\[|\]$/g, '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7868
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7869
        return input.replace(/\\/g, '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7870
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7871
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7872
    function makeFormatFunction(format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7873
        var array = format.match(formattingTokens), i, length;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7874
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7875
        for (i = 0, length = array.length; i < length; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7876
            if (formatTokenFunctions[array[i]]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7877
                array[i] = formatTokenFunctions[array[i]];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7878
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7879
                array[i] = removeFormattingTokens(array[i]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7880
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7881
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7882
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7883
        return function (mom) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7884
            var output = '';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7885
            for (i = 0; i < length; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7886
                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7887
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7888
            return output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7889
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7890
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7891
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7892
    // format date using native date object
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7893
    function formatMoment(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7894
        if (!m.isValid()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7895
            return m.localeData().invalidDate();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7896
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7897
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7898
        format = expandFormat(format, m.localeData());
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7899
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7900
        if (!formatFunctions[format]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7901
            formatFunctions[format] = makeFormatFunction(format);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7902
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7903
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7904
        return formatFunctions[format](m);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7905
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7906
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7907
    function expandFormat(format, locale) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7908
        var i = 5;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7909
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7910
        function replaceLongDateFormatTokens(input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7911
            return locale.longDateFormat(input) || input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7912
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7913
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7914
        localFormattingTokens.lastIndex = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7915
        while (i >= 0 && localFormattingTokens.test(format)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7916
            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7917
            localFormattingTokens.lastIndex = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7918
            i -= 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7919
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7920
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7921
        return format;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7922
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7923
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7924
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7925
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7926
        Parsing
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7927
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7928
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7929
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7930
    // get the regex to find the next token
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7931
    function getParseRegexForToken(token, config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7932
        var a, strict = config._strict;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7933
        switch (token) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7934
        case 'Q':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7935
            return parseTokenOneDigit;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7936
        case 'DDDD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7937
            return parseTokenThreeDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7938
        case 'YYYY':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7939
        case 'GGGG':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7940
        case 'gggg':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7941
            return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7942
        case 'Y':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7943
        case 'G':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7944
        case 'g':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7945
            return parseTokenSignedNumber;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7946
        case 'YYYYYY':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7947
        case 'YYYYY':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7948
        case 'GGGGG':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7949
        case 'ggggg':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7950
            return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7951
        case 'S':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7952
            if (strict) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7953
                return parseTokenOneDigit;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7954
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7955
            /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7956
        case 'SS':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7957
            if (strict) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7958
                return parseTokenTwoDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7959
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7960
            /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7961
        case 'SSS':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7962
            if (strict) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7963
                return parseTokenThreeDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7964
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7965
            /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7966
        case 'DDD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7967
            return parseTokenOneToThreeDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7968
        case 'MMM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7969
        case 'MMMM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7970
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7971
        case 'ddd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7972
        case 'dddd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7973
            return parseTokenWord;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7974
        case 'a':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7975
        case 'A':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7976
            return config._locale._meridiemParse;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7977
        case 'x':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7978
            return parseTokenOffsetMs;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7979
        case 'X':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7980
            return parseTokenTimestampMs;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7981
        case 'Z':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7982
        case 'ZZ':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7983
            return parseTokenTimezone;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7984
        case 'T':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7985
            return parseTokenT;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7986
        case 'SSSS':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7987
            return parseTokenDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7988
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7989
        case 'DD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7990
        case 'YY':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7991
        case 'GG':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7992
        case 'gg':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7993
        case 'HH':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7994
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7995
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7996
        case 'ss':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7997
        case 'ww':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7998
        case 'WW':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  7999
            return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8000
        case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8001
        case 'D':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8002
        case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8003
        case 'H':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8004
        case 'h':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8005
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8006
        case 's':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8007
        case 'w':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8008
        case 'W':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8009
        case 'e':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8010
        case 'E':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8011
            return parseTokenOneOrTwoDigits;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8012
        case 'Do':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8013
            return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8014
        default :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8015
            a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8016
            return a;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8017
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8018
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8019
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8020
    function utcOffsetFromString(string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8021
        string = string || '';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8022
        var possibleTzMatches = (string.match(parseTokenTimezone) || []),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8023
            tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8024
            parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8025
            minutes = +(parts[1] * 60) + toInt(parts[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8026
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8027
        return parts[0] === '+' ? minutes : -minutes;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8028
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8029
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8030
    // function to convert string input to date
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8031
    function addTimeToArrayFromToken(token, input, config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8032
        var a, datePartArray = config._a;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8033
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8034
        switch (token) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8035
        // QUARTER
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8036
        case 'Q':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8037
            if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8038
                datePartArray[MONTH] = (toInt(input) - 1) * 3;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8039
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8040
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8041
        // MONTH
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8042
        case 'M' : // fall through to MM
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8043
        case 'MM' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8044
            if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8045
                datePartArray[MONTH] = toInt(input) - 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8046
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8047
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8048
        case 'MMM' : // fall through to MMMM
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8049
        case 'MMMM' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8050
            a = config._locale.monthsParse(input, token, config._strict);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8051
            // if we didn't find a month name, mark the date as invalid.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8052
            if (a != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8053
                datePartArray[MONTH] = a;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8054
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8055
                config._pf.invalidMonth = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8056
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8057
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8058
        // DAY OF MONTH
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8059
        case 'D' : // fall through to DD
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8060
        case 'DD' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8061
            if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8062
                datePartArray[DATE] = toInt(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8063
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8064
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8065
        case 'Do' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8066
            if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8067
                datePartArray[DATE] = toInt(parseInt(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8068
                            input.match(/\d{1,2}/)[0], 10));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8069
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8070
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8071
        // DAY OF YEAR
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8072
        case 'DDD' : // fall through to DDDD
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8073
        case 'DDDD' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8074
            if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8075
                config._dayOfYear = toInt(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8076
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8077
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8078
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8079
        // YEAR
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8080
        case 'YY' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8081
            datePartArray[YEAR] = moment.parseTwoDigitYear(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8082
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8083
        case 'YYYY' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8084
        case 'YYYYY' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8085
        case 'YYYYYY' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8086
            datePartArray[YEAR] = toInt(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8087
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8088
        // AM / PM
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8089
        case 'a' : // fall through to A
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8090
        case 'A' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8091
            config._meridiem = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8092
            // config._isPm = config._locale.isPM(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8093
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8094
        // HOUR
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8095
        case 'h' : // fall through to hh
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8096
        case 'hh' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8097
            config._pf.bigHour = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8098
            /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8099
        case 'H' : // fall through to HH
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8100
        case 'HH' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8101
            datePartArray[HOUR] = toInt(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8102
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8103
        // MINUTE
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8104
        case 'm' : // fall through to mm
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8105
        case 'mm' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8106
            datePartArray[MINUTE] = toInt(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8107
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8108
        // SECOND
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8109
        case 's' : // fall through to ss
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8110
        case 'ss' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8111
            datePartArray[SECOND] = toInt(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8112
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8113
        // MILLISECOND
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8114
        case 'S' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8115
        case 'SS' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8116
        case 'SSS' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8117
        case 'SSSS' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8118
            datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8119
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8120
        // UNIX OFFSET (MILLISECONDS)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8121
        case 'x':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8122
            config._d = new Date(toInt(input));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8123
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8124
        // UNIX TIMESTAMP WITH MS
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8125
        case 'X':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8126
            config._d = new Date(parseFloat(input) * 1000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8127
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8128
        // TIMEZONE
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8129
        case 'Z' : // fall through to ZZ
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8130
        case 'ZZ' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8131
            config._useUTC = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8132
            config._tzm = utcOffsetFromString(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8133
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8134
        // WEEKDAY - human
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8135
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8136
        case 'ddd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8137
        case 'dddd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8138
            a = config._locale.weekdaysParse(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8139
            // if we didn't get a weekday name, mark the date as invalid
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8140
            if (a != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8141
                config._w = config._w || {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8142
                config._w['d'] = a;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8143
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8144
                config._pf.invalidWeekday = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8145
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8146
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8147
        // WEEK, WEEK DAY - numeric
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8148
        case 'w':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8149
        case 'ww':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8150
        case 'W':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8151
        case 'WW':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8152
        case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8153
        case 'e':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8154
        case 'E':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8155
            token = token.substr(0, 1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8156
            /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8157
        case 'gggg':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8158
        case 'GGGG':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8159
        case 'GGGGG':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8160
            token = token.substr(0, 2);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8161
            if (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8162
                config._w = config._w || {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8163
                config._w[token] = toInt(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8164
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8165
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8166
        case 'gg':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8167
        case 'GG':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8168
            config._w = config._w || {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8169
            config._w[token] = moment.parseTwoDigitYear(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8170
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8171
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8172
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8173
    function dayOfYearFromWeekInfo(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8174
        var w, weekYear, week, weekday, dow, doy, temp;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8175
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8176
        w = config._w;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8177
        if (w.GG != null || w.W != null || w.E != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8178
            dow = 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8179
            doy = 4;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8180
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8181
            // TODO: We need to take the current isoWeekYear, but that depends on
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8182
            // how we interpret now (local, utc, fixed offset). So create
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8183
            // a now version of current config (take local/utc/offset flags, and
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8184
            // create now).
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8185
            weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8186
            week = dfl(w.W, 1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8187
            weekday = dfl(w.E, 1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8188
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8189
            dow = config._locale._week.dow;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8190
            doy = config._locale._week.doy;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8191
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8192
            weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8193
            week = dfl(w.w, 1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8194
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8195
            if (w.d != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8196
                // weekday -- low day numbers are considered next week
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8197
                weekday = w.d;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8198
                if (weekday < dow) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8199
                    ++week;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8200
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8201
            } else if (w.e != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8202
                // local weekday -- counting starts from begining of week
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8203
                weekday = w.e + dow;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8204
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8205
                // default to begining of week
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8206
                weekday = dow;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8207
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8208
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8209
        temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8210
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8211
        config._a[YEAR] = temp.year;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8212
        config._dayOfYear = temp.dayOfYear;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8213
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8214
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8215
    // convert an array to a date.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8216
    // the array should mirror the parameters below
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8217
    // note: all values past the year are optional and will default to the lowest possible value.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8218
    // [year, month, day , hour, minute, second, millisecond]
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8219
    function dateFromConfig(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8220
        var i, date, input = [], currentDate, yearToUse;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8221
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8222
        if (config._d) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8223
            return;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8224
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8225
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8226
        currentDate = currentDateArray(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8227
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8228
        //compute day of the year from weeks and weekdays
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8229
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8230
            dayOfYearFromWeekInfo(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8231
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8232
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8233
        //if the day of the year is set, figure out what it is
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8234
        if (config._dayOfYear) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8235
            yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8236
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8237
            if (config._dayOfYear > daysInYear(yearToUse)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8238
                config._pf._overflowDayOfYear = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8239
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8240
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8241
            date = makeUTCDate(yearToUse, 0, config._dayOfYear);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8242
            config._a[MONTH] = date.getUTCMonth();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8243
            config._a[DATE] = date.getUTCDate();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8244
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8245
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8246
        // Default to current date.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8247
        // * if no year, month, day of month are given, default to today
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8248
        // * if day of month is given, default month and year
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8249
        // * if month is given, default only year
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8250
        // * if year is given, don't default anything
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8251
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8252
            config._a[i] = input[i] = currentDate[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8253
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8254
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8255
        // Zero out whatever was not defaulted, including time
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8256
        for (; i < 7; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8257
            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8258
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8259
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8260
        // Check for 24:00:00.000
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8261
        if (config._a[HOUR] === 24 &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8262
                config._a[MINUTE] === 0 &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8263
                config._a[SECOND] === 0 &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8264
                config._a[MILLISECOND] === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8265
            config._nextDay = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8266
            config._a[HOUR] = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8267
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8268
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8269
        config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8270
        // Apply timezone offset from input. The actual utcOffset can be changed
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8271
        // with parseZone.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8272
        if (config._tzm != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8273
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8274
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8275
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8276
        if (config._nextDay) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8277
            config._a[HOUR] = 24;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8278
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8279
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8280
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8281
    function dateFromObject(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8282
        var normalizedInput;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8283
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8284
        if (config._d) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8285
            return;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8286
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8287
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8288
        normalizedInput = normalizeObjectUnits(config._i);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8289
        config._a = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8290
            normalizedInput.year,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8291
            normalizedInput.month,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8292
            normalizedInput.day || normalizedInput.date,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8293
            normalizedInput.hour,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8294
            normalizedInput.minute,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8295
            normalizedInput.second,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8296
            normalizedInput.millisecond
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8297
        ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8298
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8299
        dateFromConfig(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8300
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8301
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8302
    function currentDateArray(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8303
        var now = new Date();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8304
        if (config._useUTC) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8305
            return [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8306
                now.getUTCFullYear(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8307
                now.getUTCMonth(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8308
                now.getUTCDate()
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8309
            ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8310
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8311
            return [now.getFullYear(), now.getMonth(), now.getDate()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8312
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8313
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8314
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8315
    // date from string and format string
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8316
    function makeDateFromStringAndFormat(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8317
        if (config._f === moment.ISO_8601) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8318
            parseISO(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8319
            return;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8320
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8321
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8322
        config._a = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8323
        config._pf.empty = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8324
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8325
        // This array is used to make a Date, either with `new Date` or `Date.UTC`
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8326
        var string = '' + config._i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8327
            i, parsedInput, tokens, token, skipped,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8328
            stringLength = string.length,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8329
            totalParsedInputLength = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8330
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8331
        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8332
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8333
        for (i = 0; i < tokens.length; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8334
            token = tokens[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8335
            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8336
            if (parsedInput) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8337
                skipped = string.substr(0, string.indexOf(parsedInput));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8338
                if (skipped.length > 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8339
                    config._pf.unusedInput.push(skipped);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8340
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8341
                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8342
                totalParsedInputLength += parsedInput.length;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8343
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8344
            // don't parse if it's not a known token
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8345
            if (formatTokenFunctions[token]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8346
                if (parsedInput) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8347
                    config._pf.empty = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8348
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8349
                else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8350
                    config._pf.unusedTokens.push(token);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8351
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8352
                addTimeToArrayFromToken(token, parsedInput, config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8353
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8354
            else if (config._strict && !parsedInput) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8355
                config._pf.unusedTokens.push(token);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8356
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8357
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8358
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8359
        // add remaining unparsed input length to the string
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8360
        config._pf.charsLeftOver = stringLength - totalParsedInputLength;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8361
        if (string.length > 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8362
            config._pf.unusedInput.push(string);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8363
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8364
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8365
        // clear _12h flag if hour is <= 12
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8366
        if (config._pf.bigHour === true && config._a[HOUR] <= 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8367
            config._pf.bigHour = undefined;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8368
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8369
        // handle meridiem
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8370
        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8371
                config._meridiem);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8372
        dateFromConfig(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8373
        checkOverflow(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8374
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8375
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8376
    function unescapeFormat(s) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8377
        return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8378
            return p1 || p2 || p3 || p4;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8379
        });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8380
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8381
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8382
    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8383
    function regexpEscape(s) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8384
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8385
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8386
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8387
    // date from string and array of format strings
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8388
    function makeDateFromStringAndArray(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8389
        var tempConfig,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8390
            bestMoment,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8391
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8392
            scoreToBeat,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8393
            i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8394
            currentScore;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8395
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8396
        if (config._f.length === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8397
            config._pf.invalidFormat = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8398
            config._d = new Date(NaN);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8399
            return;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8400
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8401
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8402
        for (i = 0; i < config._f.length; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8403
            currentScore = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8404
            tempConfig = copyConfig({}, config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8405
            if (config._useUTC != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8406
                tempConfig._useUTC = config._useUTC;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8407
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8408
            tempConfig._pf = defaultParsingFlags();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8409
            tempConfig._f = config._f[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8410
            makeDateFromStringAndFormat(tempConfig);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8411
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8412
            if (!isValid(tempConfig)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8413
                continue;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8414
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8415
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8416
            // if there is any input that was not parsed add a penalty for that format
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8417
            currentScore += tempConfig._pf.charsLeftOver;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8418
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8419
            //or tokens
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8420
            currentScore += tempConfig._pf.unusedTokens.length * 10;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8421
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8422
            tempConfig._pf.score = currentScore;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8423
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8424
            if (scoreToBeat == null || currentScore < scoreToBeat) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8425
                scoreToBeat = currentScore;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8426
                bestMoment = tempConfig;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8427
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8428
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8429
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8430
        extend(config, bestMoment || tempConfig);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8431
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8432
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8433
    // date from iso format
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8434
    function parseISO(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8435
        var i, l,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8436
            string = config._i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8437
            match = isoRegex.exec(string);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8438
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8439
        if (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8440
            config._pf.iso = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8441
            for (i = 0, l = isoDates.length; i < l; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8442
                if (isoDates[i][1].exec(string)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8443
                    // match[5] should be 'T' or undefined
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8444
                    config._f = isoDates[i][0] + (match[6] || ' ');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8445
                    break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8446
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8447
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8448
            for (i = 0, l = isoTimes.length; i < l; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8449
                if (isoTimes[i][1].exec(string)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8450
                    config._f += isoTimes[i][0];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8451
                    break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8452
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8453
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8454
            if (string.match(parseTokenTimezone)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8455
                config._f += 'Z';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8456
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8457
            makeDateFromStringAndFormat(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8458
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8459
            config._isValid = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8460
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8461
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8462
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8463
    // date from iso format or fallback
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8464
    function makeDateFromString(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8465
        parseISO(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8466
        if (config._isValid === false) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8467
            delete config._isValid;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8468
            moment.createFromInputFallback(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8469
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8470
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8471
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8472
    function map(arr, fn) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8473
        var res = [], i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8474
        for (i = 0; i < arr.length; ++i) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8475
            res.push(fn(arr[i], i));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8476
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8477
        return res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8478
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8479
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8480
    function makeDateFromInput(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8481
        var input = config._i, matched;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8482
        if (input === undefined) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8483
            config._d = new Date();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8484
        } else if (isDate(input)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8485
            config._d = new Date(+input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8486
        } else if ((matched = aspNetJsonRegex.exec(input)) !== null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8487
            config._d = new Date(+matched[1]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8488
        } else if (typeof input === 'string') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8489
            makeDateFromString(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8490
        } else if (isArray(input)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8491
            config._a = map(input.slice(0), function (obj) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8492
                return parseInt(obj, 10);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8493
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8494
            dateFromConfig(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8495
        } else if (typeof(input) === 'object') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8496
            dateFromObject(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8497
        } else if (typeof(input) === 'number') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8498
            // from milliseconds
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8499
            config._d = new Date(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8500
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8501
            moment.createFromInputFallback(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8502
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8503
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8504
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8505
    function makeDate(y, m, d, h, M, s, ms) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8506
        //can't just apply() to create a date:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8507
        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8508
        var date = new Date(y, m, d, h, M, s, ms);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8509
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8510
        //the date constructor doesn't accept years < 1970
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8511
        if (y < 1970) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8512
            date.setFullYear(y);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8513
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8514
        return date;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8515
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8516
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8517
    function makeUTCDate(y) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8518
        var date = new Date(Date.UTC.apply(null, arguments));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8519
        if (y < 1970) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8520
            date.setUTCFullYear(y);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8521
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8522
        return date;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8523
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8524
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8525
    function parseWeekday(input, locale) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8526
        if (typeof input === 'string') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8527
            if (!isNaN(input)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8528
                input = parseInt(input, 10);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8529
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8530
            else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8531
                input = locale.weekdaysParse(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8532
                if (typeof input !== 'number') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8533
                    return null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8534
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8535
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8536
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8537
        return input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8538
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8539
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8540
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8541
        Relative Time
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8542
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8543
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8544
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8545
    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8546
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8547
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8548
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8549
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8550
    function relativeTime(posNegDuration, withoutSuffix, locale) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8551
        var duration = moment.duration(posNegDuration).abs(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8552
            seconds = round(duration.as('s')),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8553
            minutes = round(duration.as('m')),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8554
            hours = round(duration.as('h')),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8555
            days = round(duration.as('d')),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8556
            months = round(duration.as('M')),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8557
            years = round(duration.as('y')),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8558
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8559
            args = seconds < relativeTimeThresholds.s && ['s', seconds] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8560
                minutes === 1 && ['m'] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8561
                minutes < relativeTimeThresholds.m && ['mm', minutes] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8562
                hours === 1 && ['h'] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8563
                hours < relativeTimeThresholds.h && ['hh', hours] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8564
                days === 1 && ['d'] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8565
                days < relativeTimeThresholds.d && ['dd', days] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8566
                months === 1 && ['M'] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8567
                months < relativeTimeThresholds.M && ['MM', months] ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8568
                years === 1 && ['y'] || ['yy', years];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8569
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8570
        args[2] = withoutSuffix;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8571
        args[3] = +posNegDuration > 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8572
        args[4] = locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8573
        return substituteTimeAgo.apply({}, args);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8574
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8575
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8576
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8577
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8578
        Week of Year
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8579
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8580
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8581
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8582
    // firstDayOfWeek       0 = sun, 6 = sat
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8583
    //                      the day of the week that starts the week
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8584
    //                      (usually sunday or monday)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8585
    // firstDayOfWeekOfYear 0 = sun, 6 = sat
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8586
    //                      the first week is the week that contains the first
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8587
    //                      of this day of the week
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8588
    //                      (eg. ISO weeks use thursday (4))
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8589
    function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8590
        var end = firstDayOfWeekOfYear - firstDayOfWeek,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8591
            daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8592
            adjustedMoment;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8593
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8594
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8595
        if (daysToDayOfWeek > end) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8596
            daysToDayOfWeek -= 7;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8597
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8598
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8599
        if (daysToDayOfWeek < end - 7) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8600
            daysToDayOfWeek += 7;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8601
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8602
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8603
        adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8604
        return {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8605
            week: Math.ceil(adjustedMoment.dayOfYear() / 7),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8606
            year: adjustedMoment.year()
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8607
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8608
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8609
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8610
    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8611
    function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8612
        var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8613
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8614
        d = d === 0 ? 7 : d;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8615
        weekday = weekday != null ? weekday : firstDayOfWeek;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8616
        daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8617
        dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8618
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8619
        return {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8620
            year: dayOfYear > 0 ? year : year - 1,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8621
            dayOfYear: dayOfYear > 0 ?  dayOfYear : daysInYear(year - 1) + dayOfYear
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8622
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8623
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8624
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8625
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8626
        Top Level Functions
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8627
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8628
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8629
    function makeMoment(config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8630
        var input = config._i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8631
            format = config._f,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8632
            res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8633
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8634
        config._locale = config._locale || moment.localeData(config._l);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8635
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8636
        if (input === null || (format === undefined && input === '')) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8637
            return moment.invalid({nullInput: true});
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8638
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8639
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8640
        if (typeof input === 'string') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8641
            config._i = input = config._locale.preparse(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8642
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8643
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8644
        if (moment.isMoment(input)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8645
            return new Moment(input, true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8646
        } else if (format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8647
            if (isArray(format)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8648
                makeDateFromStringAndArray(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8649
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8650
                makeDateFromStringAndFormat(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8651
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8652
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8653
            makeDateFromInput(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8654
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8655
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8656
        res = new Moment(config);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8657
        if (res._nextDay) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8658
            // Adding is smart enough around DST
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8659
            res.add(1, 'd');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8660
            res._nextDay = undefined;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8661
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8662
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8663
        return res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8664
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8665
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8666
    moment = function (input, format, locale, strict) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8667
        var c;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8668
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8669
        if (typeof(locale) === 'boolean') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8670
            strict = locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8671
            locale = undefined;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8672
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8673
        // object construction must be done this way.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8674
        // https://github.com/moment/moment/issues/1423
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8675
        c = {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8676
        c._isAMomentObject = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8677
        c._i = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8678
        c._f = format;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8679
        c._l = locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8680
        c._strict = strict;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8681
        c._isUTC = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8682
        c._pf = defaultParsingFlags();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8683
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8684
        return makeMoment(c);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8685
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8686
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8687
    moment.suppressDeprecationWarnings = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8688
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8689
    moment.createFromInputFallback = deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8690
        'moment construction falls back to js Date. This is ' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8691
        'discouraged and will be removed in upcoming major ' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8692
        'release. Please refer to ' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8693
        'https://github.com/moment/moment/issues/1407 for more info.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8694
        function (config) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8695
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8696
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8697
    );
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8698
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8699
    // Pick a moment m from moments so that m[fn](other) is true for all
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8700
    // other. This relies on the function fn to be transitive.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8701
    //
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8702
    // moments should either be an array of moment objects or an array, whose
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8703
    // first element is an array of moment objects.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8704
    function pickBy(fn, moments) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8705
        var res, i;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8706
        if (moments.length === 1 && isArray(moments[0])) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8707
            moments = moments[0];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8708
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8709
        if (!moments.length) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8710
            return moment();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8711
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8712
        res = moments[0];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8713
        for (i = 1; i < moments.length; ++i) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8714
            if (moments[i][fn](res)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8715
                res = moments[i];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8716
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8717
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8718
        return res;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8719
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8720
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8721
    moment.min = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8722
        var args = [].slice.call(arguments, 0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8723
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8724
        return pickBy('isBefore', args);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8725
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8726
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8727
    moment.max = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8728
        var args = [].slice.call(arguments, 0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8729
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8730
        return pickBy('isAfter', args);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8731
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8732
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8733
    // creating with utc
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8734
    moment.utc = function (input, format, locale, strict) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8735
        var c;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8736
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8737
        if (typeof(locale) === 'boolean') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8738
            strict = locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8739
            locale = undefined;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8740
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8741
        // object construction must be done this way.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8742
        // https://github.com/moment/moment/issues/1423
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8743
        c = {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8744
        c._isAMomentObject = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8745
        c._useUTC = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8746
        c._isUTC = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8747
        c._l = locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8748
        c._i = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8749
        c._f = format;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8750
        c._strict = strict;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8751
        c._pf = defaultParsingFlags();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8752
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8753
        return makeMoment(c).utc();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8754
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8755
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8756
    // creating with unix timestamp (in seconds)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8757
    moment.unix = function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8758
        return moment(input * 1000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8759
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8760
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8761
    // duration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8762
    moment.duration = function (input, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8763
        var duration = input,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8764
            // matching against regexp is expensive, do it on demand
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8765
            match = null,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8766
            sign,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8767
            ret,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8768
            parseIso,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8769
            diffRes;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8770
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8771
        if (moment.isDuration(input)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8772
            duration = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8773
                ms: input._milliseconds,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8774
                d: input._days,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8775
                M: input._months
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8776
            };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8777
        } else if (typeof input === 'number') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8778
            duration = {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8779
            if (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8780
                duration[key] = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8781
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8782
                duration.milliseconds = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8783
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8784
        } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8785
            sign = (match[1] === '-') ? -1 : 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8786
            duration = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8787
                y: 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8788
                d: toInt(match[DATE]) * sign,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8789
                h: toInt(match[HOUR]) * sign,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8790
                m: toInt(match[MINUTE]) * sign,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8791
                s: toInt(match[SECOND]) * sign,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8792
                ms: toInt(match[MILLISECOND]) * sign
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8793
            };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8794
        } else if (!!(match = isoDurationRegex.exec(input))) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8795
            sign = (match[1] === '-') ? -1 : 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8796
            parseIso = function (inp) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8797
                // We'd normally use ~~inp for this, but unfortunately it also
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8798
                // converts floats to ints.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8799
                // inp may be undefined, so careful calling replace on it.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8800
                var res = inp && parseFloat(inp.replace(',', '.'));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8801
                // apply sign while we're at it
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8802
                return (isNaN(res) ? 0 : res) * sign;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8803
            };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8804
            duration = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8805
                y: parseIso(match[2]),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8806
                M: parseIso(match[3]),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8807
                d: parseIso(match[4]),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8808
                h: parseIso(match[5]),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8809
                m: parseIso(match[6]),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8810
                s: parseIso(match[7]),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8811
                w: parseIso(match[8])
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8812
            };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8813
        } else if (duration == null) {// checks for null or undefined
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8814
            duration = {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8815
        } else if (typeof duration === 'object' &&
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8816
                ('from' in duration || 'to' in duration)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8817
            diffRes = momentsDifference(moment(duration.from), moment(duration.to));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8818
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8819
            duration = {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8820
            duration.ms = diffRes.milliseconds;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8821
            duration.M = diffRes.months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8822
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8823
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8824
        ret = new Duration(duration);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8825
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8826
        if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8827
            ret._locale = input._locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8828
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8829
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8830
        return ret;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8831
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8832
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8833
    // version number
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8834
    moment.version = VERSION;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8835
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8836
    // default format
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8837
    moment.defaultFormat = isoFormat;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8838
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8839
    // constant that refers to the ISO standard
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8840
    moment.ISO_8601 = function () {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8841
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8842
    // Plugins that add properties should also add the key here (null value),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8843
    // so we can properly clone ourselves.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8844
    moment.momentProperties = momentProperties;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8845
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8846
    // This function will be called whenever a moment is mutated.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8847
    // It is intended to keep the offset in sync with the timezone.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8848
    moment.updateOffset = function () {};
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8849
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8850
    // This function allows you to set a threshold for relative time strings
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8851
    moment.relativeTimeThreshold = function (threshold, limit) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8852
        if (relativeTimeThresholds[threshold] === undefined) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8853
            return false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8854
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8855
        if (limit === undefined) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8856
            return relativeTimeThresholds[threshold];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8857
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8858
        relativeTimeThresholds[threshold] = limit;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8859
        return true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8860
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8861
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8862
    moment.lang = deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8863
        'moment.lang is deprecated. Use moment.locale instead.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8864
        function (key, value) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8865
            return moment.locale(key, value);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8866
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8867
    );
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8868
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8869
    // This function will load locale and then set the global locale.  If
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8870
    // no arguments are passed in, it will simply return the current global
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8871
    // locale key.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8872
    moment.locale = function (key, values) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8873
        var data;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8874
        if (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8875
            if (typeof(values) !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8876
                data = moment.defineLocale(key, values);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8877
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8878
            else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8879
                data = moment.localeData(key);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8880
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8881
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8882
            if (data) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8883
                moment.duration._locale = moment._locale = data;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8884
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8885
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8886
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8887
        return moment._locale._abbr;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8888
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8889
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8890
    moment.defineLocale = function (name, values) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8891
        if (values !== null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8892
            values.abbr = name;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8893
            if (!locales[name]) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8894
                locales[name] = new Locale();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8895
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8896
            locales[name].set(values);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8897
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8898
            // backwards compat for now: also set the locale
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8899
            moment.locale(name);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8900
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8901
            return locales[name];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8902
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8903
            // useful for testing
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8904
            delete locales[name];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8905
            return null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8906
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8907
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8908
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8909
    moment.langData = deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8910
        'moment.langData is deprecated. Use moment.localeData instead.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8911
        function (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8912
            return moment.localeData(key);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8913
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8914
    );
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8915
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8916
    // returns locale data
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8917
    moment.localeData = function (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8918
        var locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8919
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8920
        if (key && key._locale && key._locale._abbr) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8921
            key = key._locale._abbr;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8922
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8923
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8924
        if (!key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8925
            return moment._locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8926
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8927
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8928
        if (!isArray(key)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8929
            //short-circuit everything else
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8930
            locale = loadLocale(key);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8931
            if (locale) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8932
                return locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8933
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8934
            key = [key];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8935
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8936
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8937
        return chooseLocale(key);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8938
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8939
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8940
    // compare moment object
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8941
    moment.isMoment = function (obj) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8942
        return obj instanceof Moment ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8943
            (obj != null && hasOwnProp(obj, '_isAMomentObject'));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8944
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8945
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8946
    // for typechecking Duration objects
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8947
    moment.isDuration = function (obj) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8948
        return obj instanceof Duration;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8949
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8950
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8951
    for (i = lists.length - 1; i >= 0; --i) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8952
        makeList(lists[i]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8953
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8954
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8955
    moment.normalizeUnits = function (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8956
        return normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8957
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8958
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8959
    moment.invalid = function (flags) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8960
        var m = moment.utc(NaN);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8961
        if (flags != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8962
            extend(m._pf, flags);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8963
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8964
        else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8965
            m._pf.userInvalidated = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8966
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8967
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8968
        return m;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8969
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8970
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8971
    moment.parseZone = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8972
        return moment.apply(null, arguments).parseZone();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8973
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8974
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8975
    moment.parseTwoDigitYear = function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8976
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8977
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8978
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8979
    moment.isDate = isDate;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8980
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8981
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8982
        Moment Prototype
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8983
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8984
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8985
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8986
    extend(moment.fn = Moment.prototype, {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8987
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8988
        clone : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8989
            return moment(this);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8990
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8991
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8992
        valueOf : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8993
            return +this._d - ((this._offset || 0) * 60000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8994
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8995
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8996
        unix : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8997
            return Math.floor(+this / 1000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8998
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  8999
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9000
        toString : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9001
            return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9002
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9003
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9004
        toDate : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9005
            return this._offset ? new Date(+this) : this._d;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9006
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9007
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9008
        toISOString : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9009
            var m = moment(this).utc();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9010
            if (0 < m.year() && m.year() <= 9999) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9011
                if ('function' === typeof Date.prototype.toISOString) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9012
                    // native implementation is ~50x faster, use it when we can
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9013
                    return this.toDate().toISOString();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9014
                } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9015
                    return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9016
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9017
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9018
                return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9019
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9020
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9021
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9022
        toArray : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9023
            var m = this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9024
            return [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9025
                m.year(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9026
                m.month(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9027
                m.date(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9028
                m.hours(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9029
                m.minutes(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9030
                m.seconds(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9031
                m.milliseconds()
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9032
            ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9033
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9034
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9035
        isValid : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9036
            return isValid(this);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9037
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9038
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9039
        isDSTShifted : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9040
            if (this._a) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9041
                return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9042
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9043
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9044
            return false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9045
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9046
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9047
        parsingFlags : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9048
            return extend({}, this._pf);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9049
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9050
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9051
        invalidAt: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9052
            return this._pf.overflow;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9053
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9054
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9055
        utc : function (keepLocalTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9056
            return this.utcOffset(0, keepLocalTime);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9057
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9058
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9059
        local : function (keepLocalTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9060
            if (this._isUTC) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9061
                this.utcOffset(0, keepLocalTime);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9062
                this._isUTC = false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9063
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9064
                if (keepLocalTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9065
                    this.subtract(this._dateUtcOffset(), 'm');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9066
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9067
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9068
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9069
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9070
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9071
        format : function (inputString) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9072
            var output = formatMoment(this, inputString || moment.defaultFormat);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9073
            return this.localeData().postformat(output);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9074
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9075
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9076
        add : createAdder(1, 'add'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9077
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9078
        subtract : createAdder(-1, 'subtract'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9079
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9080
        diff : function (input, units, asFloat) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9081
            var that = makeAs(input, this),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9082
                zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9083
                anchor, diff, output, daysAdjust;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9084
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9085
            units = normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9086
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9087
            if (units === 'year' || units === 'month' || units === 'quarter') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9088
                output = monthDiff(this, that);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9089
                if (units === 'quarter') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9090
                    output = output / 3;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9091
                } else if (units === 'year') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9092
                    output = output / 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9093
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9094
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9095
                diff = this - that;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9096
                output = units === 'second' ? diff / 1e3 : // 1000
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9097
                    units === 'minute' ? diff / 6e4 : // 1000 * 60
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9098
                    units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9099
                    units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9100
                    units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9101
                    diff;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9102
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9103
            return asFloat ? output : absRound(output);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9104
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9105
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9106
        from : function (time, withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9107
            return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9108
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9109
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9110
        fromNow : function (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9111
            return this.from(moment(), withoutSuffix);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9112
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9113
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9114
        calendar : function (time) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9115
            // We want to compare the start of today, vs this.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9116
            // Getting start-of-today depends on whether we're locat/utc/offset
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9117
            // or not.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9118
            var now = time || moment(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9119
                sod = makeAs(now, this).startOf('day'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9120
                diff = this.diff(sod, 'days', true),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9121
                format = diff < -6 ? 'sameElse' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9122
                    diff < -1 ? 'lastWeek' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9123
                    diff < 0 ? 'lastDay' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9124
                    diff < 1 ? 'sameDay' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9125
                    diff < 2 ? 'nextDay' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9126
                    diff < 7 ? 'nextWeek' : 'sameElse';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9127
            return this.format(this.localeData().calendar(format, this, moment(now)));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9128
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9129
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9130
        isLeapYear : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9131
            return isLeapYear(this.year());
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9132
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9133
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9134
        isDST : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9135
            return (this.utcOffset() > this.clone().month(0).utcOffset() ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9136
                this.utcOffset() > this.clone().month(5).utcOffset());
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9137
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9138
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9139
        day : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9140
            var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9141
            if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9142
                input = parseWeekday(input, this.localeData());
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9143
                return this.add(input - day, 'd');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9144
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9145
                return day;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9146
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9147
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9148
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9149
        month : makeAccessor('Month', true),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9150
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9151
        startOf : function (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9152
            units = normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9153
            // the following switch intentionally omits break keywords
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9154
            // to utilize falling through the cases.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9155
            switch (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9156
            case 'year':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9157
                this.month(0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9158
                /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9159
            case 'quarter':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9160
            case 'month':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9161
                this.date(1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9162
                /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9163
            case 'week':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9164
            case 'isoWeek':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9165
            case 'day':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9166
                this.hours(0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9167
                /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9168
            case 'hour':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9169
                this.minutes(0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9170
                /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9171
            case 'minute':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9172
                this.seconds(0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9173
                /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9174
            case 'second':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9175
                this.milliseconds(0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9176
                /* falls through */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9177
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9178
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9179
            // weeks are a special case
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9180
            if (units === 'week') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9181
                this.weekday(0);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9182
            } else if (units === 'isoWeek') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9183
                this.isoWeekday(1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9184
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9185
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9186
            // quarters are also special
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9187
            if (units === 'quarter') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9188
                this.month(Math.floor(this.month() / 3) * 3);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9189
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9190
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9191
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9192
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9193
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9194
        endOf: function (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9195
            units = normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9196
            if (units === undefined || units === 'millisecond') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9197
                return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9198
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9199
            return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9200
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9201
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9202
        isAfter: function (input, units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9203
            var inputMs;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9204
            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9205
            if (units === 'millisecond') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9206
                input = moment.isMoment(input) ? input : moment(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9207
                return +this > +input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9208
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9209
                inputMs = moment.isMoment(input) ? +input : +moment(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9210
                return inputMs < +this.clone().startOf(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9211
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9212
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9213
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9214
        isBefore: function (input, units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9215
            var inputMs;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9216
            units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9217
            if (units === 'millisecond') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9218
                input = moment.isMoment(input) ? input : moment(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9219
                return +this < +input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9220
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9221
                inputMs = moment.isMoment(input) ? +input : +moment(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9222
                return +this.clone().endOf(units) < inputMs;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9223
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9224
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9225
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9226
        isBetween: function (from, to, units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9227
            return this.isAfter(from, units) && this.isBefore(to, units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9228
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9229
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9230
        isSame: function (input, units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9231
            var inputMs;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9232
            units = normalizeUnits(units || 'millisecond');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9233
            if (units === 'millisecond') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9234
                input = moment.isMoment(input) ? input : moment(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9235
                return +this === +input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9236
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9237
                inputMs = +moment(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9238
                return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9239
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9240
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9241
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9242
        min: deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9243
                 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9244
                 function (other) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9245
                     other = moment.apply(null, arguments);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9246
                     return other < this ? this : other;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9247
                 }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9248
         ),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9249
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9250
        max: deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9251
                'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9252
                function (other) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9253
                    other = moment.apply(null, arguments);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9254
                    return other > this ? this : other;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9255
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9256
        ),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9257
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9258
        zone : deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9259
                'moment().zone is deprecated, use moment().utcOffset instead. ' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9260
                'https://github.com/moment/moment/issues/1779',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9261
                function (input, keepLocalTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9262
                    if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9263
                        if (typeof input !== 'string') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9264
                            input = -input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9265
                        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9266
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9267
                        this.utcOffset(input, keepLocalTime);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9268
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9269
                        return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9270
                    } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9271
                        return -this.utcOffset();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9272
                    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9273
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9274
        ),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9275
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9276
        // keepLocalTime = true means only change the timezone, without
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9277
        // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9278
        // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9279
        // +0200, so we adjust the time as needed, to be valid.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9280
        //
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9281
        // Keeping the time actually adds/subtracts (one hour)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9282
        // from the actual represented time. That is why we call updateOffset
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9283
        // a second time. In case it wants us to change the offset again
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9284
        // _changeInProgress == true case, then we have to adjust, because
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9285
        // there is no such time in the given timezone.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9286
        utcOffset : function (input, keepLocalTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9287
            var offset = this._offset || 0,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9288
                localAdjust;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9289
            if (input != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9290
                if (typeof input === 'string') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9291
                    input = utcOffsetFromString(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9292
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9293
                if (Math.abs(input) < 16) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9294
                    input = input * 60;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9295
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9296
                if (!this._isUTC && keepLocalTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9297
                    localAdjust = this._dateUtcOffset();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9298
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9299
                this._offset = input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9300
                this._isUTC = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9301
                if (localAdjust != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9302
                    this.add(localAdjust, 'm');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9303
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9304
                if (offset !== input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9305
                    if (!keepLocalTime || this._changeInProgress) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9306
                        addOrSubtractDurationFromMoment(this,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9307
                                moment.duration(input - offset, 'm'), 1, false);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9308
                    } else if (!this._changeInProgress) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9309
                        this._changeInProgress = true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9310
                        moment.updateOffset(this, true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9311
                        this._changeInProgress = null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9312
                    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9313
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9314
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9315
                return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9316
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9317
                return this._isUTC ? offset : this._dateUtcOffset();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9318
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9319
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9320
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9321
        isLocal : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9322
            return !this._isUTC;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9323
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9324
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9325
        isUtcOffset : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9326
            return this._isUTC;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9327
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9328
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9329
        isUtc : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9330
            return this._isUTC && this._offset === 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9331
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9332
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9333
        zoneAbbr : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9334
            return this._isUTC ? 'UTC' : '';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9335
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9336
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9337
        zoneName : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9338
            return this._isUTC ? 'Coordinated Universal Time' : '';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9339
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9340
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9341
        parseZone : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9342
            if (this._tzm) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9343
                this.utcOffset(this._tzm);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9344
            } else if (typeof this._i === 'string') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9345
                this.utcOffset(utcOffsetFromString(this._i));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9346
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9347
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9348
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9349
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9350
        hasAlignedHourOffset : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9351
            if (!input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9352
                input = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9353
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9354
            else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9355
                input = moment(input).utcOffset();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9356
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9357
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9358
            return (this.utcOffset() - input) % 60 === 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9359
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9360
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9361
        daysInMonth : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9362
            return daysInMonth(this.year(), this.month());
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9363
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9364
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9365
        dayOfYear : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9366
            var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9367
            return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9368
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9369
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9370
        quarter : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9371
            return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9372
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9373
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9374
        weekYear : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9375
            var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9376
            return input == null ? year : this.add((input - year), 'y');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9377
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9378
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9379
        isoWeekYear : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9380
            var year = weekOfYear(this, 1, 4).year;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9381
            return input == null ? year : this.add((input - year), 'y');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9382
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9383
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9384
        week : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9385
            var week = this.localeData().week(this);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9386
            return input == null ? week : this.add((input - week) * 7, 'd');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9387
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9388
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9389
        isoWeek : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9390
            var week = weekOfYear(this, 1, 4).week;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9391
            return input == null ? week : this.add((input - week) * 7, 'd');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9392
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9393
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9394
        weekday : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9395
            var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9396
            return input == null ? weekday : this.add(input - weekday, 'd');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9397
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9398
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9399
        isoWeekday : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9400
            // behaves the same as moment#day except
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9401
            // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9402
            // as a setter, sunday should belong to the previous week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9403
            return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9404
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9405
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9406
        isoWeeksInYear : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9407
            return weeksInYear(this.year(), 1, 4);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9408
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9409
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9410
        weeksInYear : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9411
            var weekInfo = this.localeData()._week;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9412
            return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9413
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9414
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9415
        get : function (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9416
            units = normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9417
            return this[units]();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9418
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9419
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9420
        set : function (units, value) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9421
            var unit;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9422
            if (typeof units === 'object') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9423
                for (unit in units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9424
                    this.set(unit, units[unit]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9425
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9426
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9427
            else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9428
                units = normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9429
                if (typeof this[units] === 'function') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9430
                    this[units](value);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9431
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9432
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9433
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9434
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9435
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9436
        // If passed a locale key, it will set the locale for this
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9437
        // instance.  Otherwise, it will return the locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9438
        // variables for this instance.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9439
        locale : function (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9440
            var newLocaleData;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9441
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9442
            if (key === undefined) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9443
                return this._locale._abbr;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9444
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9445
                newLocaleData = moment.localeData(key);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9446
                if (newLocaleData != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9447
                    this._locale = newLocaleData;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9448
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9449
                return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9450
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9451
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9452
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9453
        lang : deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9454
            'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9455
            function (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9456
                if (key === undefined) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9457
                    return this.localeData();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9458
                } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9459
                    return this.locale(key);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9460
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9461
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9462
        ),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9463
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9464
        localeData : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9465
            return this._locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9466
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9467
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9468
        _dateUtcOffset : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9469
            // On Firefox.24 Date#getTimezoneOffset returns a floating point.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9470
            // https://github.com/moment/moment/pull/1871
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9471
            return -Math.round(this._d.getTimezoneOffset() / 15) * 15;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9472
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9473
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9474
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9475
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9476
    function rawMonthSetter(mom, value) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9477
        var dayOfMonth;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9478
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9479
        // TODO: Move this out of here!
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9480
        if (typeof value === 'string') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9481
            value = mom.localeData().monthsParse(value);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9482
            // TODO: Another silent failure?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9483
            if (typeof value !== 'number') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9484
                return mom;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9485
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9486
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9487
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9488
        dayOfMonth = Math.min(mom.date(),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9489
                daysInMonth(mom.year(), value));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9490
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9491
        return mom;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9492
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9493
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9494
    function rawGetter(mom, unit) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9495
        return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9496
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9497
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9498
    function rawSetter(mom, unit, value) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9499
        if (unit === 'Month') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9500
            return rawMonthSetter(mom, value);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9501
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9502
            return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9503
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9504
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9505
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9506
    function makeAccessor(unit, keepTime) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9507
        return function (value) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9508
            if (value != null) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9509
                rawSetter(this, unit, value);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9510
                moment.updateOffset(this, keepTime);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9511
                return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9512
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9513
                return rawGetter(this, unit);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9514
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9515
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9516
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9517
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9518
    moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9519
    moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9520
    moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9521
    // Setting the hour should keep the time, because the user explicitly
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9522
    // specified which hour he wants. So trying to maintain the same hour (in
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9523
    // a new timezone) makes sense. Adding/subtracting hours does not follow
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9524
    // this rule.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9525
    moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9526
    // moment.fn.month is defined separately
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9527
    moment.fn.date = makeAccessor('Date', true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9528
    moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9529
    moment.fn.year = makeAccessor('FullYear', true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9530
    moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9531
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9532
    // add plural methods
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9533
    moment.fn.days = moment.fn.day;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9534
    moment.fn.months = moment.fn.month;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9535
    moment.fn.weeks = moment.fn.week;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9536
    moment.fn.isoWeeks = moment.fn.isoWeek;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9537
    moment.fn.quarters = moment.fn.quarter;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9538
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9539
    // add aliased format methods
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9540
    moment.fn.toJSON = moment.fn.toISOString;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9541
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9542
    // alias isUtc for dev-friendliness
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9543
    moment.fn.isUTC = moment.fn.isUtc;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9544
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9545
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9546
        Duration Prototype
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9547
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9548
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9549
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9550
    function daysToYears (days) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9551
        // 400 years have 146097 days (taking into account leap year rules)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9552
        return days * 400 / 146097;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9553
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9554
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9555
    function yearsToDays (years) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9556
        // years * 365 + absRound(years / 4) -
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9557
        //     absRound(years / 100) + absRound(years / 400);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9558
        return years * 146097 / 400;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9559
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9560
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9561
    extend(moment.duration.fn = Duration.prototype, {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9562
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9563
        _bubble : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9564
            var milliseconds = this._milliseconds,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9565
                days = this._days,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9566
                months = this._months,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9567
                data = this._data,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9568
                seconds, minutes, hours, years = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9569
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9570
            // The following code bubbles up values, see the tests for
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9571
            // examples of what that means.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9572
            data.milliseconds = milliseconds % 1000;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9573
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9574
            seconds = absRound(milliseconds / 1000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9575
            data.seconds = seconds % 60;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9576
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9577
            minutes = absRound(seconds / 60);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9578
            data.minutes = minutes % 60;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9579
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9580
            hours = absRound(minutes / 60);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9581
            data.hours = hours % 24;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9582
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9583
            days += absRound(hours / 24);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9584
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9585
            // Accurately convert days to years, assume start from year 0.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9586
            years = absRound(daysToYears(days));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9587
            days -= absRound(yearsToDays(years));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9588
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9589
            // 30 days to a month
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9590
            // TODO (iskren): Use anchor date (like 1st Jan) to compute this.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9591
            months += absRound(days / 30);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9592
            days %= 30;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9593
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9594
            // 12 months -> 1 year
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9595
            years += absRound(months / 12);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9596
            months %= 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9597
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9598
            data.days = days;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9599
            data.months = months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9600
            data.years = years;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9601
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9602
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9603
        abs : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9604
            this._milliseconds = Math.abs(this._milliseconds);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9605
            this._days = Math.abs(this._days);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9606
            this._months = Math.abs(this._months);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9607
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9608
            this._data.milliseconds = Math.abs(this._data.milliseconds);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9609
            this._data.seconds = Math.abs(this._data.seconds);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9610
            this._data.minutes = Math.abs(this._data.minutes);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9611
            this._data.hours = Math.abs(this._data.hours);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9612
            this._data.months = Math.abs(this._data.months);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9613
            this._data.years = Math.abs(this._data.years);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9614
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9615
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9616
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9617
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9618
        weeks : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9619
            return absRound(this.days() / 7);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9620
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9621
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9622
        valueOf : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9623
            return this._milliseconds +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9624
              this._days * 864e5 +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9625
              (this._months % 12) * 2592e6 +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9626
              toInt(this._months / 12) * 31536e6;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9627
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9628
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9629
        humanize : function (withSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9630
            var output = relativeTime(this, !withSuffix, this.localeData());
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9631
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9632
            if (withSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9633
                output = this.localeData().pastFuture(+this, output);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9634
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9635
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9636
            return this.localeData().postformat(output);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9637
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9638
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9639
        add : function (input, val) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9640
            // supports only 2.0-style add(1, 's') or add(moment)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9641
            var dur = moment.duration(input, val);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9642
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9643
            this._milliseconds += dur._milliseconds;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9644
            this._days += dur._days;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9645
            this._months += dur._months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9646
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9647
            this._bubble();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9648
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9649
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9650
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9651
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9652
        subtract : function (input, val) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9653
            var dur = moment.duration(input, val);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9654
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9655
            this._milliseconds -= dur._milliseconds;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9656
            this._days -= dur._days;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9657
            this._months -= dur._months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9658
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9659
            this._bubble();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9660
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9661
            return this;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9662
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9663
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9664
        get : function (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9665
            units = normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9666
            return this[units.toLowerCase() + 's']();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9667
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9668
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9669
        as : function (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9670
            var days, months;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9671
            units = normalizeUnits(units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9672
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9673
            if (units === 'month' || units === 'year') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9674
                days = this._days + this._milliseconds / 864e5;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9675
                months = this._months + daysToYears(days) * 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9676
                return units === 'month' ? months : months / 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9677
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9678
                // handle milliseconds separately because of floating point math errors (issue #1867)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9679
                days = this._days + Math.round(yearsToDays(this._months / 12));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9680
                switch (units) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9681
                    case 'week': return days / 7 + this._milliseconds / 6048e5;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9682
                    case 'day': return days + this._milliseconds / 864e5;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9683
                    case 'hour': return days * 24 + this._milliseconds / 36e5;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9684
                    case 'minute': return days * 24 * 60 + this._milliseconds / 6e4;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9685
                    case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9686
                    // Math.floor prevents floating point math errors here
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9687
                    case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9688
                    default: throw new Error('Unknown unit ' + units);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9689
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9690
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9691
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9692
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9693
        lang : moment.fn.lang,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9694
        locale : moment.fn.locale,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9695
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9696
        toIsoString : deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9697
            'toIsoString() is deprecated. Please use toISOString() instead ' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9698
            '(notice the capitals)',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9699
            function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9700
                return this.toISOString();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9701
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9702
        ),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9703
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9704
        toISOString : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9705
            // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9706
            var years = Math.abs(this.years()),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9707
                months = Math.abs(this.months()),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9708
                days = Math.abs(this.days()),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9709
                hours = Math.abs(this.hours()),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9710
                minutes = Math.abs(this.minutes()),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9711
                seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9712
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9713
            if (!this.asSeconds()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9714
                // this is the same as C#'s (Noda) and python (isodate)...
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9715
                // but not other JS (goog.date)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9716
                return 'P0D';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9717
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9718
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9719
            return (this.asSeconds() < 0 ? '-' : '') +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9720
                'P' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9721
                (years ? years + 'Y' : '') +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9722
                (months ? months + 'M' : '') +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9723
                (days ? days + 'D' : '') +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9724
                ((hours || minutes || seconds) ? 'T' : '') +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9725
                (hours ? hours + 'H' : '') +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9726
                (minutes ? minutes + 'M' : '') +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9727
                (seconds ? seconds + 'S' : '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9728
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9729
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9730
        localeData : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9731
            return this._locale;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9732
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9733
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9734
        toJSON : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9735
            return this.toISOString();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9736
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9737
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9738
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9739
    moment.duration.fn.toString = moment.duration.fn.toISOString;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9740
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9741
    function makeDurationGetter(name) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9742
        moment.duration.fn[name] = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9743
            return this._data[name];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9744
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9745
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9746
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9747
    for (i in unitMillisecondFactors) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9748
        if (hasOwnProp(unitMillisecondFactors, i)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9749
            makeDurationGetter(i.toLowerCase());
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9750
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9751
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9752
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9753
    moment.duration.fn.asMilliseconds = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9754
        return this.as('ms');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9755
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9756
    moment.duration.fn.asSeconds = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9757
        return this.as('s');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9758
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9759
    moment.duration.fn.asMinutes = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9760
        return this.as('m');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9761
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9762
    moment.duration.fn.asHours = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9763
        return this.as('h');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9764
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9765
    moment.duration.fn.asDays = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9766
        return this.as('d');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9767
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9768
    moment.duration.fn.asWeeks = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9769
        return this.as('weeks');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9770
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9771
    moment.duration.fn.asMonths = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9772
        return this.as('M');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9773
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9774
    moment.duration.fn.asYears = function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9775
        return this.as('y');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9776
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9777
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9778
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9779
        Default Locale
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9780
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9781
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9782
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9783
    // Set default locale, other locale will inherit from English.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9784
    moment.locale('en', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9785
        ordinalParse: /\d{1,2}(th|st|nd|rd)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9786
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9787
            var b = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9788
                output = (toInt(number % 100 / 10) === 1) ? 'th' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9789
                (b === 1) ? 'st' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9790
                (b === 2) ? 'nd' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9791
                (b === 3) ? 'rd' : 'th';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9792
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9793
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9794
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9795
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9796
    // moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9797
// locale : afrikaans (af)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9798
// author : Werner Mollentze : https://github.com/wernerm
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9799
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9800
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9801
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9802
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9803
    return moment.defineLocale('af', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9804
        months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9805
        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9806
        weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9807
        weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9808
        weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9809
        meridiemParse: /vm|nm/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9810
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9811
            return /^nm$/i.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9812
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9813
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9814
            if (hours < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9815
                return isLower ? 'vm' : 'VM';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9816
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9817
                return isLower ? 'nm' : 'NM';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9818
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9819
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9820
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9821
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9822
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9823
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9824
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9825
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9826
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9827
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9828
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9829
            sameDay : '[Vandag om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9830
            nextDay : '[Môre om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9831
            nextWeek : 'dddd [om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9832
            lastDay : '[Gister om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9833
            lastWeek : '[Laas] dddd [om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9834
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9835
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9836
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9837
            future : 'oor %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9838
            past : '%s gelede',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9839
            s : '\'n paar sekondes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9840
            m : '\'n minuut',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9841
            mm : '%d minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9842
            h : '\'n uur',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9843
            hh : '%d ure',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9844
            d : '\'n dag',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9845
            dd : '%d dae',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9846
            M : '\'n maand',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9847
            MM : '%d maande',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9848
            y : '\'n jaar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9849
            yy : '%d jaar'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9850
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9851
        ordinalParse: /\d{1,2}(ste|de)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9852
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9853
            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9854
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9855
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9856
            dow : 1, // Maandag is die eerste dag van die week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9857
            doy : 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9858
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9859
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9860
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9861
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9862
// locale : Moroccan Arabic (ar-ma)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9863
// author : ElFadili Yassine : https://github.com/ElFadiliY
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9864
// author : Abdel Said : https://github.com/abdelsaid
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9865
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9866
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9867
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9868
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9869
    return moment.defineLocale('ar-ma', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9870
        months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9871
        monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9872
        weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9873
        weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9874
        weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9875
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9876
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9877
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9878
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9879
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9880
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9881
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9882
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9883
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9884
            sameDay: '[اليوم على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9885
            nextDay: '[غدا على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9886
            nextWeek: 'dddd [على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9887
            lastDay: '[أمس على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9888
            lastWeek: 'dddd [على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9889
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9890
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9891
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9892
            future : 'في %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9893
            past : 'منذ %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9894
            s : 'ثوان',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9895
            m : 'دقيقة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9896
            mm : '%d دقائق',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9897
            h : 'ساعة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9898
            hh : '%d ساعات',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9899
            d : 'يوم',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9900
            dd : '%d أيام',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9901
            M : 'شهر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9902
            MM : '%d أشهر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9903
            y : 'سنة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9904
            yy : '%d سنوات'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9905
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9906
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9907
            dow : 6, // Saturday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9908
            doy : 12  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9909
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9910
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9911
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9912
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9913
// locale : Arabic Saudi Arabia (ar-sa)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9914
// author : Suhail Alkowaileet : https://github.com/xsoh
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9915
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9916
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9917
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9918
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9919
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9920
        '1': '١',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9921
        '2': '٢',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9922
        '3': '٣',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9923
        '4': '٤',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9924
        '5': '٥',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9925
        '6': '٦',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9926
        '7': '٧',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9927
        '8': '٨',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9928
        '9': '٩',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9929
        '0': '٠'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9930
    }, numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9931
        '١': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9932
        '٢': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9933
        '٣': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9934
        '٤': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9935
        '٥': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9936
        '٦': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9937
        '٧': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9938
        '٨': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9939
        '٩': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9940
        '٠': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9941
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9942
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9943
    return moment.defineLocale('ar-sa', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9944
        months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9945
        monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9946
        weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9947
        weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9948
        weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9949
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9950
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9951
            LTS : 'HH:mm:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9952
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9953
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9954
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9955
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9956
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9957
        meridiemParse: /ص|م/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9958
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9959
            return 'م' === input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9960
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9961
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9962
            if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9963
                return 'ص';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9964
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9965
                return 'م';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9966
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9967
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9968
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9969
            sameDay: '[اليوم على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9970
            nextDay: '[غدا على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9971
            nextWeek: 'dddd [على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9972
            lastDay: '[أمس على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9973
            lastWeek: 'dddd [على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9974
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9975
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9976
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9977
            future : 'في %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9978
            past : 'منذ %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9979
            s : 'ثوان',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9980
            m : 'دقيقة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9981
            mm : '%d دقائق',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9982
            h : 'ساعة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9983
            hh : '%d ساعات',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9984
            d : 'يوم',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9985
            dd : '%d أيام',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9986
            M : 'شهر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9987
            MM : '%d أشهر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9988
            y : 'سنة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9989
            yy : '%d سنوات'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9990
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9991
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9992
            return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9993
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9994
            }).replace(/،/g, ',');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9995
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9996
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9997
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9998
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
  9999
            }).replace(/,/g, '،');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10000
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10001
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10002
            dow : 6, // Saturday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10003
            doy : 12  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10004
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10005
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10006
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10007
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10008
// locale  : Tunisian Arabic (ar-tn)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10009
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10010
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10011
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10012
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10013
    return moment.defineLocale('ar-tn', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10014
        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10015
        monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10016
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10017
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10018
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10019
        longDateFormat: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10020
            LT: 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10021
            LTS: 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10022
            L: 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10023
            LL: 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10024
            LLL: 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10025
            LLLL: 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10026
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10027
        calendar: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10028
            sameDay: '[اليوم على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10029
            nextDay: '[غدا على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10030
            nextWeek: 'dddd [على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10031
            lastDay: '[أمس على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10032
            lastWeek: 'dddd [على الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10033
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10034
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10035
        relativeTime: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10036
            future: 'في %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10037
            past: 'منذ %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10038
            s: 'ثوان',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10039
            m: 'دقيقة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10040
            mm: '%d دقائق',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10041
            h: 'ساعة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10042
            hh: '%d ساعات',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10043
            d: 'يوم',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10044
            dd: '%d أيام',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10045
            M: 'شهر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10046
            MM: '%d أشهر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10047
            y: 'سنة',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10048
            yy: '%d سنوات'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10049
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10050
        week: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10051
            dow: 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10052
            doy: 4 // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10053
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10054
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10055
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10056
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10057
// Locale: Arabic (ar)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10058
// Author: Abdel Said: https://github.com/abdelsaid
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10059
// Changes in months, weekdays: Ahmed Elkhatib
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10060
// Native plural forms: forabi https://github.com/forabi
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10061
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10062
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10063
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10064
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10065
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10066
        '1': '١',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10067
        '2': '٢',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10068
        '3': '٣',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10069
        '4': '٤',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10070
        '5': '٥',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10071
        '6': '٦',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10072
        '7': '٧',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10073
        '8': '٨',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10074
        '9': '٩',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10075
        '0': '٠'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10076
    }, numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10077
        '١': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10078
        '٢': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10079
        '٣': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10080
        '٤': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10081
        '٥': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10082
        '٦': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10083
        '٧': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10084
        '٨': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10085
        '٩': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10086
        '٠': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10087
    }, pluralForm = function (n) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10088
        return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10089
    }, plurals = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10090
        s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10091
        m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10092
        h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10093
        d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10094
        M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10095
        y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10096
    }, pluralize = function (u) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10097
        return function (number, withoutSuffix, string, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10098
            var f = pluralForm(number),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10099
                str = plurals[u][pluralForm(number)];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10100
            if (f === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10101
                str = str[withoutSuffix ? 0 : 1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10102
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10103
            return str.replace(/%d/i, number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10104
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10105
    }, months = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10106
        'كانون الثاني يناير',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10107
        'شباط فبراير',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10108
        'آذار مارس',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10109
        'نيسان أبريل',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10110
        'أيار مايو',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10111
        'حزيران يونيو',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10112
        'تموز يوليو',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10113
        'آب أغسطس',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10114
        'أيلول سبتمبر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10115
        'تشرين الأول أكتوبر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10116
        'تشرين الثاني نوفمبر',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10117
        'كانون الأول ديسمبر'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10118
    ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10119
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10120
    return moment.defineLocale('ar', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10121
        months : months,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10122
        monthsShort : months,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10123
        weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10124
        weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10125
        weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10126
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10127
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10128
            LTS : 'HH:mm:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10129
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10130
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10131
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10132
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10133
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10134
        meridiemParse: /ص|م/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10135
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10136
            return 'م' === input;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10137
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10138
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10139
            if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10140
                return 'ص';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10141
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10142
                return 'م';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10143
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10144
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10145
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10146
            sameDay: '[اليوم عند الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10147
            nextDay: '[غدًا عند الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10148
            nextWeek: 'dddd [عند الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10149
            lastDay: '[أمس عند الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10150
            lastWeek: 'dddd [عند الساعة] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10151
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10152
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10153
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10154
            future : 'بعد %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10155
            past : 'منذ %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10156
            s : pluralize('s'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10157
            m : pluralize('m'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10158
            mm : pluralize('m'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10159
            h : pluralize('h'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10160
            hh : pluralize('h'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10161
            d : pluralize('d'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10162
            dd : pluralize('d'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10163
            M : pluralize('M'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10164
            MM : pluralize('M'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10165
            y : pluralize('y'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10166
            yy : pluralize('y')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10167
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10168
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10169
            return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10170
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10171
            }).replace(/،/g, ',');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10172
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10173
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10174
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10175
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10176
            }).replace(/,/g, '،');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10177
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10178
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10179
            dow : 6, // Saturday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10180
            doy : 12  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10181
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10182
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10183
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10184
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10185
// locale : azerbaijani (az)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10186
// author : topchiyev : https://github.com/topchiyev
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10187
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10188
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10189
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10190
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10191
    var suffixes = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10192
        1: '-inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10193
        5: '-inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10194
        8: '-inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10195
        70: '-inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10196
        80: '-inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10197
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10198
        2: '-nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10199
        7: '-nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10200
        20: '-nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10201
        50: '-nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10202
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10203
        3: '-üncü',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10204
        4: '-üncü',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10205
        100: '-üncü',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10206
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10207
        6: '-ncı',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10208
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10209
        9: '-uncu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10210
        10: '-uncu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10211
        30: '-uncu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10212
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10213
        60: '-ıncı',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10214
        90: '-ıncı'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10215
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10216
    return moment.defineLocale('az', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10217
        months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10218
        monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10219
        weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10220
        weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10221
        weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10222
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10223
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10224
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10225
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10226
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10227
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10228
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10229
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10230
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10231
            sameDay : '[bugün saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10232
            nextDay : '[sabah saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10233
            nextWeek : '[gələn həftə] dddd [saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10234
            lastDay : '[dünən] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10235
            lastWeek : '[keçən həftə] dddd [saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10236
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10237
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10238
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10239
            future : '%s sonra',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10240
            past : '%s əvvəl',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10241
            s : 'birneçə saniyyə',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10242
            m : 'bir dəqiqə',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10243
            mm : '%d dəqiqə',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10244
            h : 'bir saat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10245
            hh : '%d saat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10246
            d : 'bir gün',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10247
            dd : '%d gün',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10248
            M : 'bir ay',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10249
            MM : '%d ay',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10250
            y : 'bir il',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10251
            yy : '%d il'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10252
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10253
        meridiemParse: /gecə|səhər|gündüz|axşam/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10254
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10255
            return /^(gündüz|axşam)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10256
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10257
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10258
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10259
                return 'gecə';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10260
            } else if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10261
                return 'səhər';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10262
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10263
                return 'gündüz';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10264
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10265
                return 'axşam';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10266
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10267
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10268
        ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10269
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10270
            if (number === 0) {  // special case for zero
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10271
                return number + '-ıncı';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10272
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10273
            var a = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10274
                b = number % 100 - a,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10275
                c = number >= 100 ? 100 : null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10276
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10277
            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10278
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10279
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10280
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10281
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10282
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10283
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10284
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10285
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10286
// locale : belarusian (be)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10287
// author : Dmitry Demidov : https://github.com/demidov91
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10288
// author: Praleska: http://praleska.pro/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10289
// Author : Menelion Elensúle : https://github.com/Oire
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10290
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10291
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10292
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10293
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10294
    function plural(word, num) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10295
        var forms = word.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10296
        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10297
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10298
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10299
    function relativeTimeWithPlural(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10300
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10301
            'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10302
            'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10303
            'dd': 'дзень_дні_дзён',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10304
            'MM': 'месяц_месяцы_месяцаў',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10305
            'yy': 'год_гады_гадоў'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10306
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10307
        if (key === 'm') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10308
            return withoutSuffix ? 'хвіліна' : 'хвіліну';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10309
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10310
        else if (key === 'h') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10311
            return withoutSuffix ? 'гадзіна' : 'гадзіну';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10312
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10313
        else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10314
            return number + ' ' + plural(format[key], +number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10315
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10316
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10317
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10318
    function monthsCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10319
        var months = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10320
            'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10321
            'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10322
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10323
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10324
        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10325
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10326
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10327
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10328
        return months[nounCase][m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10329
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10330
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10331
    function weekdaysCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10332
        var weekdays = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10333
            'nominative': 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10334
            'accusative': 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10335
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10336
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10337
        nounCase = (/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10338
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10339
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10340
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10341
        return weekdays[nounCase][m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10342
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10343
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10344
    return moment.defineLocale('be', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10345
        months : monthsCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10346
        monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10347
        weekdays : weekdaysCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10348
        weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10349
        weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10350
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10351
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10352
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10353
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10354
            LL : 'D MMMM YYYY г.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10355
            LLL : 'D MMMM YYYY г., LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10356
            LLLL : 'dddd, D MMMM YYYY г., LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10357
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10358
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10359
            sameDay: '[Сёння ў] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10360
            nextDay: '[Заўтра ў] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10361
            lastDay: '[Учора ў] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10362
            nextWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10363
                return '[У] dddd [ў] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10364
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10365
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10366
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10367
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10368
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10369
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10370
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10371
                    return '[У мінулую] dddd [ў] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10372
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10373
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10374
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10375
                    return '[У мінулы] dddd [ў] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10376
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10377
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10378
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10379
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10380
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10381
            future : 'праз %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10382
            past : '%s таму',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10383
            s : 'некалькі секунд',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10384
            m : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10385
            mm : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10386
            h : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10387
            hh : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10388
            d : 'дзень',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10389
            dd : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10390
            M : 'месяц',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10391
            MM : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10392
            y : 'год',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10393
            yy : relativeTimeWithPlural
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10394
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10395
        meridiemParse: /ночы|раніцы|дня|вечара/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10396
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10397
            return /^(дня|вечара)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10398
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10399
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10400
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10401
                return 'ночы';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10402
            } else if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10403
                return 'раніцы';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10404
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10405
                return 'дня';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10406
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10407
                return 'вечара';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10408
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10409
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10410
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10411
        ordinalParse: /\d{1,2}-(і|ы|га)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10412
        ordinal: function (number, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10413
            switch (period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10414
            case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10415
            case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10416
            case 'DDD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10417
            case 'w':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10418
            case 'W':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10419
                return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10420
            case 'D':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10421
                return number + '-га';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10422
            default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10423
                return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10424
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10425
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10426
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10427
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10428
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10429
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10430
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10431
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10432
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10433
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10434
// locale : bulgarian (bg)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10435
// author : Krasen Borisov : https://github.com/kraz
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10436
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10437
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10438
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10439
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10440
    return moment.defineLocale('bg', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10441
        months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10442
        monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10443
        weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10444
        weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10445
        weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10446
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10447
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10448
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10449
            L : 'D.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10450
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10451
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10452
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10453
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10454
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10455
            sameDay : '[Днес в] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10456
            nextDay : '[Утре в] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10457
            nextWeek : 'dddd [в] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10458
            lastDay : '[Вчера в] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10459
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10460
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10461
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10462
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10463
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10464
                    return '[В изминалата] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10465
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10466
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10467
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10468
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10469
                    return '[В изминалия] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10470
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10471
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10472
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10473
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10474
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10475
            future : 'след %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10476
            past : 'преди %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10477
            s : 'няколко секунди',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10478
            m : 'минута',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10479
            mm : '%d минути',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10480
            h : 'час',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10481
            hh : '%d часа',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10482
            d : 'ден',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10483
            dd : '%d дни',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10484
            M : 'месец',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10485
            MM : '%d месеца',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10486
            y : 'година',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10487
            yy : '%d години'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10488
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10489
        ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10490
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10491
            var lastDigit = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10492
                last2Digits = number % 100;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10493
            if (number === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10494
                return number + '-ев';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10495
            } else if (last2Digits === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10496
                return number + '-ен';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10497
            } else if (last2Digits > 10 && last2Digits < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10498
                return number + '-ти';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10499
            } else if (lastDigit === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10500
                return number + '-ви';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10501
            } else if (lastDigit === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10502
                return number + '-ри';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10503
            } else if (lastDigit === 7 || lastDigit === 8) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10504
                return number + '-ми';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10505
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10506
                return number + '-ти';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10507
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10508
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10509
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10510
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10511
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10512
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10513
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10514
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10515
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10516
// locale : Bengali (bn)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10517
// author : Kaushik Gandhi : https://github.com/kaushikgandhi
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10518
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10519
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10520
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10521
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10522
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10523
        '1': '১',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10524
        '2': '২',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10525
        '3': '৩',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10526
        '4': '৪',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10527
        '5': '৫',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10528
        '6': '৬',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10529
        '7': '৭',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10530
        '8': '৮',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10531
        '9': '৯',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10532
        '0': '০'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10533
    },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10534
    numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10535
        '১': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10536
        '২': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10537
        '৩': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10538
        '৪': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10539
        '৫': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10540
        '৬': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10541
        '৭': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10542
        '৮': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10543
        '৯': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10544
        '০': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10545
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10546
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10547
    return moment.defineLocale('bn', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10548
        months : 'জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10549
        monthsShort : 'জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10550
        weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রুবার_শনিবার'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10551
        weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্রু_শনি'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10552
        weekdaysMin : 'রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10553
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10554
            LT : 'A h:mm সময়',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10555
            LTS : 'A h:mm:ss সময়',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10556
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10557
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10558
            LLL : 'D MMMM YYYY, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10559
            LLLL : 'dddd, D MMMM YYYY, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10560
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10561
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10562
            sameDay : '[আজ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10563
            nextDay : '[আগামীকাল] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10564
            nextWeek : 'dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10565
            lastDay : '[গতকাল] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10566
            lastWeek : '[গত] dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10567
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10568
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10569
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10570
            future : '%s পরে',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10571
            past : '%s আগে',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10572
            s : 'কএক সেকেন্ড',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10573
            m : 'এক মিনিট',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10574
            mm : '%d মিনিট',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10575
            h : 'এক ঘন্টা',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10576
            hh : '%d ঘন্টা',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10577
            d : 'এক দিন',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10578
            dd : '%d দিন',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10579
            M : 'এক মাস',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10580
            MM : '%d মাস',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10581
            y : 'এক বছর',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10582
            yy : '%d বছর'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10583
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10584
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10585
            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10586
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10587
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10588
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10589
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10590
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10591
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10592
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10593
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10594
        meridiemParse: /রাত|শকাল|দুপুর|বিকেল|রাত/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10595
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10596
            return /^(দুপুর|বিকেল|রাত)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10597
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10598
        //Bengali is a vast language its spoken
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10599
        //in different forms in various parts of the world.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10600
        //I have just generalized with most common one used
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10601
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10602
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10603
                return 'রাত';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10604
            } else if (hour < 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10605
                return 'শকাল';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10606
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10607
                return 'দুপুর';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10608
            } else if (hour < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10609
                return 'বিকেল';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10610
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10611
                return 'রাত';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10612
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10613
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10614
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10615
            dow : 0, // Sunday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10616
            doy : 6  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10617
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10618
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10619
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10620
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10621
// locale : tibetan (bo)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10622
// author : Thupten N. Chakrishar : https://github.com/vajradog
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10623
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10624
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10625
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10626
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10627
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10628
        '1': '༡',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10629
        '2': '༢',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10630
        '3': '༣',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10631
        '4': '༤',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10632
        '5': '༥',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10633
        '6': '༦',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10634
        '7': '༧',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10635
        '8': '༨',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10636
        '9': '༩',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10637
        '0': '༠'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10638
    },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10639
    numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10640
        '༡': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10641
        '༢': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10642
        '༣': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10643
        '༤': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10644
        '༥': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10645
        '༦': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10646
        '༧': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10647
        '༨': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10648
        '༩': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10649
        '༠': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10650
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10651
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10652
    return moment.defineLocale('bo', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10653
        months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10654
        monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10655
        weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10656
        weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10657
        weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10658
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10659
            LT : 'A h:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10660
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10661
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10662
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10663
            LLL : 'D MMMM YYYY, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10664
            LLLL : 'dddd, D MMMM YYYY, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10665
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10666
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10667
            sameDay : '[དི་རིང] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10668
            nextDay : '[སང་ཉིན] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10669
            nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10670
            lastDay : '[ཁ་སང] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10671
            lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10672
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10673
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10674
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10675
            future : '%s ལ་',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10676
            past : '%s སྔན་ལ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10677
            s : 'ལམ་སང',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10678
            m : 'སྐར་མ་གཅིག',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10679
            mm : '%d སྐར་མ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10680
            h : 'ཆུ་ཚོད་གཅིག',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10681
            hh : '%d ཆུ་ཚོད',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10682
            d : 'ཉིན་གཅིག',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10683
            dd : '%d ཉིན་',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10684
            M : 'ཟླ་བ་གཅིག',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10685
            MM : '%d ཟླ་བ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10686
            y : 'ལོ་གཅིག',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10687
            yy : '%d ལོ'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10688
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10689
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10690
            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10691
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10692
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10693
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10694
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10695
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10696
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10697
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10698
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10699
        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10700
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10701
            return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10702
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10703
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10704
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10705
                return 'མཚན་མོ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10706
            } else if (hour < 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10707
                return 'ཞོགས་ཀས';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10708
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10709
                return 'ཉིན་གུང';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10710
            } else if (hour < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10711
                return 'དགོང་དག';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10712
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10713
                return 'མཚན་མོ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10714
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10715
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10716
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10717
            dow : 0, // Sunday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10718
            doy : 6  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10719
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10720
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10721
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10722
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10723
// locale : breton (br)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10724
// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10725
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10726
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10727
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10728
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10729
    function relativeTimeWithMutation(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10730
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10731
            'mm': 'munutenn',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10732
            'MM': 'miz',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10733
            'dd': 'devezh'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10734
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10735
        return number + ' ' + mutation(format[key], number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10736
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10737
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10738
    function specialMutationForYears(number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10739
        switch (lastNumber(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10740
        case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10741
        case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10742
        case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10743
        case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10744
        case 9:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10745
            return number + ' bloaz';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10746
        default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10747
            return number + ' vloaz';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10748
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10749
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10750
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10751
    function lastNumber(number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10752
        if (number > 9) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10753
            return lastNumber(number % 10);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10754
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10755
        return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10756
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10757
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10758
    function mutation(text, number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10759
        if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10760
            return softMutation(text);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10761
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10762
        return text;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10763
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10764
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10765
    function softMutation(text) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10766
        var mutationTable = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10767
            'm': 'v',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10768
            'b': 'v',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10769
            'd': 'z'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10770
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10771
        if (mutationTable[text.charAt(0)] === undefined) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10772
            return text;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10773
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10774
        return mutationTable[text.charAt(0)] + text.substring(1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10775
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10776
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10777
    return moment.defineLocale('br', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10778
        months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10779
        monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10780
        weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10781
        weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10782
        weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10783
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10784
            LT : 'h[e]mm A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10785
            LTS : 'h[e]mm:ss A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10786
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10787
            LL : 'D [a viz] MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10788
            LLL : 'D [a viz] MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10789
            LLLL : 'dddd, D [a viz] MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10790
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10791
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10792
            sameDay : '[Hiziv da] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10793
            nextDay : '[Warc\'hoazh da] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10794
            nextWeek : 'dddd [da] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10795
            lastDay : '[Dec\'h da] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10796
            lastWeek : 'dddd [paset da] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10797
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10798
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10799
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10800
            future : 'a-benn %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10801
            past : '%s \'zo',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10802
            s : 'un nebeud segondennoù',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10803
            m : 'ur vunutenn',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10804
            mm : relativeTimeWithMutation,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10805
            h : 'un eur',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10806
            hh : '%d eur',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10807
            d : 'un devezh',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10808
            dd : relativeTimeWithMutation,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10809
            M : 'ur miz',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10810
            MM : relativeTimeWithMutation,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10811
            y : 'ur bloaz',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10812
            yy : specialMutationForYears
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10813
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10814
        ordinalParse: /\d{1,2}(añ|vet)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10815
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10816
            var output = (number === 1) ? 'añ' : 'vet';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10817
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10818
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10819
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10820
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10821
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10822
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10823
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10824
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10825
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10826
// locale : bosnian (bs)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10827
// author : Nedim Cholich : https://github.com/frontyard
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10828
// based on (hr) translation by Bojan Marković
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10829
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10830
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10831
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10832
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10833
    function translate(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10834
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10835
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10836
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10837
            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10838
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10839
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10840
                result += 'minuta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10841
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10842
                result += 'minute';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10843
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10844
                result += 'minuta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10845
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10846
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10847
        case 'h':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10848
            return withoutSuffix ? 'jedan sat' : 'jednog sata';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10849
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10850
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10851
                result += 'sat';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10852
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10853
                result += 'sata';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10854
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10855
                result += 'sati';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10856
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10857
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10858
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10859
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10860
                result += 'dan';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10861
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10862
                result += 'dana';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10863
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10864
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10865
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10866
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10867
                result += 'mjesec';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10868
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10869
                result += 'mjeseca';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10870
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10871
                result += 'mjeseci';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10872
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10873
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10874
        case 'yy':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10875
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10876
                result += 'godina';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10877
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10878
                result += 'godine';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10879
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10880
                result += 'godina';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10881
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10882
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10883
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10884
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10885
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10886
    return moment.defineLocale('bs', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10887
        months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10888
        monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10889
        weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10890
        weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10891
        weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10892
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10893
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10894
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10895
            L : 'DD. MM. YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10896
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10897
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10898
            LLLL : 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10899
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10900
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10901
            sameDay  : '[danas u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10902
            nextDay  : '[sutra u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10903
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10904
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10905
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10906
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10907
                    return '[u] [nedjelju] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10908
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10909
                    return '[u] [srijedu] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10910
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10911
                    return '[u] [subotu] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10912
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10913
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10914
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10915
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10916
                    return '[u] dddd [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10917
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10918
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10919
            lastDay  : '[jučer u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10920
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10921
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10922
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10923
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10924
                    return '[prošlu] dddd [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10925
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10926
                    return '[prošle] [subote] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10927
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10928
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10929
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10930
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10931
                    return '[prošli] dddd [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10932
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10933
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10934
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10935
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10936
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10937
            future : 'za %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10938
            past   : 'prije %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10939
            s      : 'par sekundi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10940
            m      : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10941
            mm     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10942
            h      : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10943
            hh     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10944
            d      : 'dan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10945
            dd     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10946
            M      : 'mjesec',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10947
            MM     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10948
            y      : 'godinu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10949
            yy     : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10950
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10951
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10952
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10953
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10954
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10955
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10956
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10957
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10958
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10959
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10960
// locale : catalan (ca)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10961
// author : Juan G. Hurtado : https://github.com/juanghurtado
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10962
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10963
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10964
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10965
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10966
    return moment.defineLocale('ca', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10967
        months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10968
        monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10969
        weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10970
        weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10971
        weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10972
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10973
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10974
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10975
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10976
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10977
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10978
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10979
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10980
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10981
            sameDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10982
                return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10983
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10984
            nextDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10985
                return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10986
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10987
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10988
                return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10989
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10990
            lastDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10991
                return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10992
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10993
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10994
                return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10995
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10996
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10997
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10998
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 10999
            future : 'en %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11000
            past : 'fa %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11001
            s : 'uns segons',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11002
            m : 'un minut',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11003
            mm : '%d minuts',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11004
            h : 'una hora',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11005
            hh : '%d hores',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11006
            d : 'un dia',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11007
            dd : '%d dies',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11008
            M : 'un mes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11009
            MM : '%d mesos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11010
            y : 'un any',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11011
            yy : '%d anys'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11012
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11013
        ordinalParse: /\d{1,2}(r|n|t|è|a)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11014
        ordinal : function (number, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11015
            var output = (number === 1) ? 'r' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11016
                (number === 2) ? 'n' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11017
                (number === 3) ? 'r' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11018
                (number === 4) ? 't' : 'è';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11019
            if (period === 'w' || period === 'W') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11020
                output = 'a';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11021
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11022
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11023
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11024
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11025
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11026
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11027
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11028
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11029
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11030
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11031
// locale : czech (cs)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11032
// author : petrbela : https://github.com/petrbela
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11033
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11034
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11035
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11036
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11037
    var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11038
        monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11039
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11040
    function plural(n) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11041
        return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11042
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11043
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11044
    function translate(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11045
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11046
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11047
        case 's':  // a few seconds / in a few seconds / a few seconds ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11048
            return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11049
        case 'm':  // a minute / in a minute / a minute ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11050
            return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11051
        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11052
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11053
                return result + (plural(number) ? 'minuty' : 'minut');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11054
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11055
                return result + 'minutami';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11056
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11057
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11058
        case 'h':  // an hour / in an hour / an hour ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11059
            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11060
        case 'hh': // 9 hours / in 9 hours / 9 hours ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11061
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11062
                return result + (plural(number) ? 'hodiny' : 'hodin');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11063
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11064
                return result + 'hodinami';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11065
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11066
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11067
        case 'd':  // a day / in a day / a day ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11068
            return (withoutSuffix || isFuture) ? 'den' : 'dnem';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11069
        case 'dd': // 9 days / in 9 days / 9 days ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11070
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11071
                return result + (plural(number) ? 'dny' : 'dní');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11072
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11073
                return result + 'dny';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11074
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11075
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11076
        case 'M':  // a month / in a month / a month ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11077
            return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11078
        case 'MM': // 9 months / in 9 months / 9 months ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11079
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11080
                return result + (plural(number) ? 'měsíce' : 'měsíců');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11081
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11082
                return result + 'měsíci';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11083
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11084
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11085
        case 'y':  // a year / in a year / a year ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11086
            return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11087
        case 'yy': // 9 years / in 9 years / 9 years ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11088
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11089
                return result + (plural(number) ? 'roky' : 'let');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11090
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11091
                return result + 'lety';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11092
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11093
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11094
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11095
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11096
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11097
    return moment.defineLocale('cs', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11098
        months : months,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11099
        monthsShort : monthsShort,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11100
        monthsParse : (function (months, monthsShort) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11101
            var i, _monthsParse = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11102
            for (i = 0; i < 12; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11103
                // use custom parser to solve problem with July (červenec)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11104
                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11105
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11106
            return _monthsParse;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11107
        }(months, monthsShort)),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11108
        weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11109
        weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11110
        weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11111
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11112
            LT: 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11113
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11114
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11115
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11116
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11117
            LLLL : 'dddd D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11118
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11119
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11120
            sameDay: '[dnes v] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11121
            nextDay: '[zítra v] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11122
            nextWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11123
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11124
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11125
                    return '[v neděli v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11126
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11127
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11128
                    return '[v] dddd [v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11129
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11130
                    return '[ve středu v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11131
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11132
                    return '[ve čtvrtek v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11133
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11134
                    return '[v pátek v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11135
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11136
                    return '[v sobotu v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11137
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11138
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11139
            lastDay: '[včera v] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11140
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11141
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11142
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11143
                    return '[minulou neděli v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11144
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11145
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11146
                    return '[minulé] dddd [v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11147
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11148
                    return '[minulou středu v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11149
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11150
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11151
                    return '[minulý] dddd [v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11152
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11153
                    return '[minulou sobotu v] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11154
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11155
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11156
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11157
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11158
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11159
            future : 'za %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11160
            past : 'před %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11161
            s : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11162
            m : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11163
            mm : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11164
            h : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11165
            hh : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11166
            d : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11167
            dd : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11168
            M : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11169
            MM : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11170
            y : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11171
            yy : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11172
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11173
        ordinalParse : /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11174
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11175
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11176
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11177
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11178
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11179
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11180
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11181
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11182
// locale : chuvash (cv)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11183
// author : Anatoly Mironov : https://github.com/mirontoli
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11184
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11185
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11186
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11187
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11188
    return moment.defineLocale('cv', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11189
        months : 'кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11190
        monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11191
        weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11192
        weekdaysShort : 'выр_тун_ытл_юн_кĕç_эрн_шăм'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11193
        weekdaysMin : 'вр_тн_ыт_юн_кç_эр_шм'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11194
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11195
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11196
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11197
            L : 'DD-MM-YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11198
            LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11199
            LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11200
            LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11201
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11202
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11203
            sameDay: '[Паян] LT [сехетре]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11204
            nextDay: '[Ыран] LT [сехетре]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11205
            lastDay: '[Ĕнер] LT [сехетре]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11206
            nextWeek: '[Çитес] dddd LT [сехетре]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11207
            lastWeek: '[Иртнĕ] dddd LT [сехетре]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11208
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11209
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11210
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11211
            future : function (output) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11212
                var affix = /сехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11213
                return output + affix;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11214
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11215
            past : '%s каялла',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11216
            s : 'пĕр-ик çеккунт',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11217
            m : 'пĕр минут',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11218
            mm : '%d минут',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11219
            h : 'пĕр сехет',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11220
            hh : '%d сехет',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11221
            d : 'пĕр кун',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11222
            dd : '%d кун',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11223
            M : 'пĕр уйăх',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11224
            MM : '%d уйăх',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11225
            y : 'пĕр çул',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11226
            yy : '%d çул'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11227
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11228
        ordinalParse: /\d{1,2}-мĕш/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11229
        ordinal : '%d-мĕш',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11230
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11231
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11232
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11233
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11234
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11235
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11236
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11237
// locale : Welsh (cy)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11238
// author : Robert Allen
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11239
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11240
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11241
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11242
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11243
    return moment.defineLocale('cy', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11244
        months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11245
        monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11246
        weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11247
        weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11248
        weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11249
        // time formats are the same as en-gb
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11250
        longDateFormat: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11251
            LT: 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11252
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11253
            L: 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11254
            LL: 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11255
            LLL: 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11256
            LLLL: 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11257
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11258
        calendar: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11259
            sameDay: '[Heddiw am] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11260
            nextDay: '[Yfory am] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11261
            nextWeek: 'dddd [am] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11262
            lastDay: '[Ddoe am] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11263
            lastWeek: 'dddd [diwethaf am] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11264
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11265
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11266
        relativeTime: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11267
            future: 'mewn %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11268
            past: '%s yn ôl',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11269
            s: 'ychydig eiliadau',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11270
            m: 'munud',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11271
            mm: '%d munud',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11272
            h: 'awr',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11273
            hh: '%d awr',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11274
            d: 'diwrnod',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11275
            dd: '%d diwrnod',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11276
            M: 'mis',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11277
            MM: '%d mis',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11278
            y: 'blwyddyn',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11279
            yy: '%d flynedd'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11280
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11281
        ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11282
        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11283
        ordinal: function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11284
            var b = number,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11285
                output = '',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11286
                lookup = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11287
                    '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11288
                    'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11289
                ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11290
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11291
            if (b > 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11292
                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11293
                    output = 'fed'; // not 30ain, 70ain or 90ain
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11294
                } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11295
                    output = 'ain';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11296
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11297
            } else if (b > 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11298
                output = lookup[b];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11299
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11300
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11301
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11302
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11303
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11304
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11305
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11306
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11307
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11308
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11309
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11310
// locale : danish (da)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11311
// author : Ulrik Nielsen : https://github.com/mrbase
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11312
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11313
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11314
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11315
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11316
    return moment.defineLocale('da', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11317
        months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11318
        monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11319
        weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11320
        weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11321
        weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11322
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11323
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11324
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11325
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11326
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11327
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11328
            LLLL : 'dddd [d.] D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11329
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11330
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11331
            sameDay : '[I dag kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11332
            nextDay : '[I morgen kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11333
            nextWeek : 'dddd [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11334
            lastDay : '[I går kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11335
            lastWeek : '[sidste] dddd [kl] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11336
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11337
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11338
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11339
            future : 'om %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11340
            past : '%s siden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11341
            s : 'få sekunder',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11342
            m : 'et minut',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11343
            mm : '%d minutter',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11344
            h : 'en time',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11345
            hh : '%d timer',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11346
            d : 'en dag',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11347
            dd : '%d dage',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11348
            M : 'en måned',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11349
            MM : '%d måneder',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11350
            y : 'et år',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11351
            yy : '%d år'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11352
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11353
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11354
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11355
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11356
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11357
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11358
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11359
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11360
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11361
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11362
// locale : austrian german (de-at)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11363
// author : lluchs : https://github.com/lluchs
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11364
// author: Menelion Elensúle: https://github.com/Oire
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11365
// author : Martin Groller : https://github.com/MadMG
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11366
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11367
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11368
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11369
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11370
    function processRelativeTime(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11371
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11372
            'm': ['eine Minute', 'einer Minute'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11373
            'h': ['eine Stunde', 'einer Stunde'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11374
            'd': ['ein Tag', 'einem Tag'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11375
            'dd': [number + ' Tage', number + ' Tagen'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11376
            'M': ['ein Monat', 'einem Monat'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11377
            'MM': [number + ' Monate', number + ' Monaten'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11378
            'y': ['ein Jahr', 'einem Jahr'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11379
            'yy': [number + ' Jahre', number + ' Jahren']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11380
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11381
        return withoutSuffix ? format[key][0] : format[key][1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11382
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11383
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11384
    return moment.defineLocale('de-at', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11385
        months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11386
        monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11387
        weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11388
        weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11389
        weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11390
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11391
            LT: 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11392
            LTS: 'HH:mm:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11393
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11394
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11395
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11396
            LLLL : 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11397
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11398
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11399
            sameDay: '[Heute um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11400
            sameElse: 'L',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11401
            nextDay: '[Morgen um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11402
            nextWeek: 'dddd [um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11403
            lastDay: '[Gestern um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11404
            lastWeek: '[letzten] dddd [um] LT [Uhr]'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11405
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11406
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11407
            future : 'in %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11408
            past : 'vor %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11409
            s : 'ein paar Sekunden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11410
            m : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11411
            mm : '%d Minuten',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11412
            h : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11413
            hh : '%d Stunden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11414
            d : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11415
            dd : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11416
            M : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11417
            MM : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11418
            y : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11419
            yy : processRelativeTime
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11420
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11421
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11422
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11423
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11424
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11425
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11426
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11427
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11428
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11429
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11430
// locale : german (de)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11431
// author : lluchs : https://github.com/lluchs
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11432
// author: Menelion Elensúle: https://github.com/Oire
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11433
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11434
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11435
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11436
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11437
    function processRelativeTime(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11438
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11439
            'm': ['eine Minute', 'einer Minute'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11440
            'h': ['eine Stunde', 'einer Stunde'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11441
            'd': ['ein Tag', 'einem Tag'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11442
            'dd': [number + ' Tage', number + ' Tagen'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11443
            'M': ['ein Monat', 'einem Monat'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11444
            'MM': [number + ' Monate', number + ' Monaten'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11445
            'y': ['ein Jahr', 'einem Jahr'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11446
            'yy': [number + ' Jahre', number + ' Jahren']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11447
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11448
        return withoutSuffix ? format[key][0] : format[key][1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11449
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11450
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11451
    return moment.defineLocale('de', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11452
        months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11453
        monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11454
        weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11455
        weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11456
        weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11457
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11458
            LT: 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11459
            LTS: 'HH:mm:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11460
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11461
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11462
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11463
            LLLL : 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11464
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11465
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11466
            sameDay: '[Heute um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11467
            sameElse: 'L',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11468
            nextDay: '[Morgen um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11469
            nextWeek: 'dddd [um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11470
            lastDay: '[Gestern um] LT [Uhr]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11471
            lastWeek: '[letzten] dddd [um] LT [Uhr]'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11472
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11473
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11474
            future : 'in %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11475
            past : 'vor %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11476
            s : 'ein paar Sekunden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11477
            m : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11478
            mm : '%d Minuten',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11479
            h : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11480
            hh : '%d Stunden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11481
            d : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11482
            dd : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11483
            M : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11484
            MM : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11485
            y : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11486
            yy : processRelativeTime
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11487
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11488
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11489
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11490
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11491
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11492
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11493
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11494
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11495
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11496
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11497
// locale : modern greek (el)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11498
// author : Aggelos Karalias : https://github.com/mehiel
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11499
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11500
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11501
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11502
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11503
    return moment.defineLocale('el', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11504
        monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11505
        monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11506
        months : function (momentToFormat, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11507
            if (/D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11508
                return this._monthsGenitiveEl[momentToFormat.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11509
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11510
                return this._monthsNominativeEl[momentToFormat.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11511
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11512
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11513
        monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11514
        weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11515
        weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11516
        weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11517
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11518
            if (hours > 11) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11519
                return isLower ? 'μμ' : 'ΜΜ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11520
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11521
                return isLower ? 'πμ' : 'ΠΜ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11522
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11523
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11524
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11525
            return ((input + '').toLowerCase()[0] === 'μ');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11526
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11527
        meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11528
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11529
            LT : 'h:mm A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11530
            LTS : 'h:mm:ss A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11531
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11532
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11533
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11534
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11535
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11536
        calendarEl : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11537
            sameDay : '[Σήμερα {}] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11538
            nextDay : '[Αύριο {}] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11539
            nextWeek : 'dddd [{}] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11540
            lastDay : '[Χθες {}] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11541
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11542
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11543
                    case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11544
                        return '[το προηγούμενο] dddd [{}] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11545
                    default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11546
                        return '[την προηγούμενη] dddd [{}] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11547
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11548
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11549
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11550
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11551
        calendar : function (key, mom) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11552
            var output = this._calendarEl[key],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11553
                hours = mom && mom.hours();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11554
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11555
            if (typeof output === 'function') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11556
                output = output.apply(mom);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11557
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11558
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11559
            return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11560
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11561
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11562
            future : 'σε %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11563
            past : '%s πριν',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11564
            s : 'λίγα δευτερόλεπτα',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11565
            m : 'ένα λεπτό',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11566
            mm : '%d λεπτά',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11567
            h : 'μία ώρα',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11568
            hh : '%d ώρες',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11569
            d : 'μία μέρα',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11570
            dd : '%d μέρες',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11571
            M : 'ένας μήνας',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11572
            MM : '%d μήνες',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11573
            y : 'ένας χρόνος',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11574
            yy : '%d χρόνια'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11575
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11576
        ordinalParse: /\d{1,2}η/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11577
        ordinal: '%dη',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11578
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11579
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11580
            doy : 4  // The week that contains Jan 4st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11581
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11582
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11583
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11584
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11585
// locale : australian english (en-au)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11586
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11587
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11588
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11589
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11590
    return moment.defineLocale('en-au', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11591
        months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11592
        monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11593
        weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11594
        weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11595
        weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11596
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11597
            LT : 'h:mm A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11598
            LTS : 'h:mm:ss A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11599
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11600
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11601
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11602
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11603
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11604
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11605
            sameDay : '[Today at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11606
            nextDay : '[Tomorrow at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11607
            nextWeek : 'dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11608
            lastDay : '[Yesterday at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11609
            lastWeek : '[Last] dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11610
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11611
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11612
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11613
            future : 'in %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11614
            past : '%s ago',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11615
            s : 'a few seconds',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11616
            m : 'a minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11617
            mm : '%d minutes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11618
            h : 'an hour',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11619
            hh : '%d hours',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11620
            d : 'a day',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11621
            dd : '%d days',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11622
            M : 'a month',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11623
            MM : '%d months',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11624
            y : 'a year',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11625
            yy : '%d years'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11626
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11627
        ordinalParse: /\d{1,2}(st|nd|rd|th)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11628
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11629
            var b = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11630
                output = (~~(number % 100 / 10) === 1) ? 'th' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11631
                (b === 1) ? 'st' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11632
                (b === 2) ? 'nd' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11633
                (b === 3) ? 'rd' : 'th';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11634
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11635
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11636
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11637
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11638
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11639
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11640
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11641
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11642
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11643
// locale : canadian english (en-ca)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11644
// author : Jonathan Abourbih : https://github.com/jonbca
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11645
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11646
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11647
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11648
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11649
    return moment.defineLocale('en-ca', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11650
        months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11651
        monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11652
        weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11653
        weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11654
        weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11655
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11656
            LT : 'h:mm A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11657
            LTS : 'h:mm:ss A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11658
            L : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11659
            LL : 'D MMMM, YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11660
            LLL : 'D MMMM, YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11661
            LLLL : 'dddd, D MMMM, YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11662
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11663
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11664
            sameDay : '[Today at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11665
            nextDay : '[Tomorrow at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11666
            nextWeek : 'dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11667
            lastDay : '[Yesterday at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11668
            lastWeek : '[Last] dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11669
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11670
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11671
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11672
            future : 'in %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11673
            past : '%s ago',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11674
            s : 'a few seconds',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11675
            m : 'a minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11676
            mm : '%d minutes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11677
            h : 'an hour',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11678
            hh : '%d hours',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11679
            d : 'a day',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11680
            dd : '%d days',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11681
            M : 'a month',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11682
            MM : '%d months',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11683
            y : 'a year',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11684
            yy : '%d years'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11685
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11686
        ordinalParse: /\d{1,2}(st|nd|rd|th)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11687
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11688
            var b = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11689
                output = (~~(number % 100 / 10) === 1) ? 'th' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11690
                (b === 1) ? 'st' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11691
                (b === 2) ? 'nd' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11692
                (b === 3) ? 'rd' : 'th';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11693
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11694
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11695
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11696
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11697
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11698
// locale : great britain english (en-gb)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11699
// author : Chris Gedrim : https://github.com/chrisgedrim
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11700
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11701
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11702
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11703
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11704
    return moment.defineLocale('en-gb', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11705
        months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11706
        monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11707
        weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11708
        weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11709
        weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11710
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11711
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11712
            LTS : 'HH:mm:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11713
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11714
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11715
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11716
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11717
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11718
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11719
            sameDay : '[Today at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11720
            nextDay : '[Tomorrow at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11721
            nextWeek : 'dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11722
            lastDay : '[Yesterday at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11723
            lastWeek : '[Last] dddd [at] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11724
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11725
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11726
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11727
            future : 'in %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11728
            past : '%s ago',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11729
            s : 'a few seconds',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11730
            m : 'a minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11731
            mm : '%d minutes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11732
            h : 'an hour',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11733
            hh : '%d hours',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11734
            d : 'a day',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11735
            dd : '%d days',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11736
            M : 'a month',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11737
            MM : '%d months',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11738
            y : 'a year',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11739
            yy : '%d years'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11740
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11741
        ordinalParse: /\d{1,2}(st|nd|rd|th)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11742
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11743
            var b = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11744
                output = (~~(number % 100 / 10) === 1) ? 'th' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11745
                (b === 1) ? 'st' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11746
                (b === 2) ? 'nd' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11747
                (b === 3) ? 'rd' : 'th';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11748
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11749
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11750
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11751
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11752
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11753
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11754
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11755
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11756
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11757
// locale : esperanto (eo)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11758
// author : Colin Dean : https://github.com/colindean
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11759
// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11760
//          Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11761
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11762
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11763
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11764
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11765
    return moment.defineLocale('eo', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11766
        months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11767
        monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11768
        weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11769
        weekdaysShort : 'Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11770
        weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11771
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11772
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11773
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11774
            L : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11775
            LL : 'D[-an de] MMMM, YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11776
            LLL : 'D[-an de] MMMM, YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11777
            LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11778
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11779
        meridiemParse: /[ap]\.t\.m/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11780
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11781
            return input.charAt(0).toLowerCase() === 'p';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11782
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11783
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11784
            if (hours > 11) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11785
                return isLower ? 'p.t.m.' : 'P.T.M.';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11786
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11787
                return isLower ? 'a.t.m.' : 'A.T.M.';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11788
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11789
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11790
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11791
            sameDay : '[Hodiaŭ je] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11792
            nextDay : '[Morgaŭ je] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11793
            nextWeek : 'dddd [je] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11794
            lastDay : '[Hieraŭ je] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11795
            lastWeek : '[pasinta] dddd [je] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11796
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11797
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11798
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11799
            future : 'je %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11800
            past : 'antaŭ %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11801
            s : 'sekundoj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11802
            m : 'minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11803
            mm : '%d minutoj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11804
            h : 'horo',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11805
            hh : '%d horoj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11806
            d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11807
            dd : '%d tagoj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11808
            M : 'monato',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11809
            MM : '%d monatoj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11810
            y : 'jaro',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11811
            yy : '%d jaroj'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11812
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11813
        ordinalParse: /\d{1,2}a/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11814
        ordinal : '%da',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11815
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11816
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11817
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11818
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11819
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11820
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11821
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11822
// locale : spanish (es)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11823
// author : Julio Napurí : https://github.com/julionc
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11824
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11825
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11826
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11827
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11828
    var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11829
        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11830
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11831
    return moment.defineLocale('es', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11832
        months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11833
        monthsShort : function (m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11834
            if (/-MMM-/.test(format)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11835
                return monthsShort[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11836
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11837
                return monthsShortDot[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11838
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11839
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11840
        weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11841
        weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11842
        weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11843
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11844
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11845
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11846
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11847
            LL : 'D [de] MMMM [de] YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11848
            LLL : 'D [de] MMMM [de] YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11849
            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11850
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11851
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11852
            sameDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11853
                return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11854
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11855
            nextDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11856
                return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11857
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11858
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11859
                return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11860
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11861
            lastDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11862
                return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11863
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11864
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11865
                return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11866
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11867
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11868
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11869
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11870
            future : 'en %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11871
            past : 'hace %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11872
            s : 'unos segundos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11873
            m : 'un minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11874
            mm : '%d minutos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11875
            h : 'una hora',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11876
            hh : '%d horas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11877
            d : 'un día',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11878
            dd : '%d días',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11879
            M : 'un mes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11880
            MM : '%d meses',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11881
            y : 'un año',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11882
            yy : '%d años'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11883
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11884
        ordinalParse : /\d{1,2}º/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11885
        ordinal : '%dº',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11886
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11887
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11888
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11889
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11890
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11891
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11892
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11893
// locale : estonian (et)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11894
// author : Henry Kehlmann : https://github.com/madhenry
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11895
// improvements : Illimar Tambek : https://github.com/ragulka
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11896
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11897
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11898
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11899
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11900
    function processRelativeTime(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11901
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11902
            's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11903
            'm' : ['ühe minuti', 'üks minut'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11904
            'mm': [number + ' minuti', number + ' minutit'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11905
            'h' : ['ühe tunni', 'tund aega', 'üks tund'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11906
            'hh': [number + ' tunni', number + ' tundi'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11907
            'd' : ['ühe päeva', 'üks päev'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11908
            'M' : ['kuu aja', 'kuu aega', 'üks kuu'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11909
            'MM': [number + ' kuu', number + ' kuud'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11910
            'y' : ['ühe aasta', 'aasta', 'üks aasta'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11911
            'yy': [number + ' aasta', number + ' aastat']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11912
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11913
        if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11914
            return format[key][2] ? format[key][2] : format[key][1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11915
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11916
        return isFuture ? format[key][0] : format[key][1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11917
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11918
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11919
    return moment.defineLocale('et', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11920
        months        : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11921
        monthsShort   : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11922
        weekdays      : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11923
        weekdaysShort : 'P_E_T_K_N_R_L'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11924
        weekdaysMin   : 'P_E_T_K_N_R_L'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11925
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11926
            LT   : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11927
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11928
            L    : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11929
            LL   : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11930
            LLL  : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11931
            LLLL : 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11932
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11933
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11934
            sameDay  : '[Täna,] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11935
            nextDay  : '[Homme,] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11936
            nextWeek : '[Järgmine] dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11937
            lastDay  : '[Eile,] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11938
            lastWeek : '[Eelmine] dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11939
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11940
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11941
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11942
            future : '%s pärast',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11943
            past   : '%s tagasi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11944
            s      : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11945
            m      : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11946
            mm     : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11947
            h      : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11948
            hh     : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11949
            d      : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11950
            dd     : '%d päeva',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11951
            M      : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11952
            MM     : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11953
            y      : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11954
            yy     : processRelativeTime
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11955
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11956
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11957
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11958
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11959
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11960
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11961
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11962
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11963
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11964
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11965
// locale : euskara (eu)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11966
// author : Eneko Illarramendi : https://github.com/eillarra
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11967
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11968
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11969
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11970
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11971
    return moment.defineLocale('eu', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11972
        months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11973
        monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11974
        weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11975
        weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11976
        weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11977
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11978
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11979
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11980
            L : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11981
            LL : 'YYYY[ko] MMMM[ren] D[a]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11982
            LLL : 'YYYY[ko] MMMM[ren] D[a] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11983
            LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11984
            l : 'YYYY-M-D',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11985
            ll : 'YYYY[ko] MMM D[a]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11986
            lll : 'YYYY[ko] MMM D[a] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11987
            llll : 'ddd, YYYY[ko] MMM D[a] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11988
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11989
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11990
            sameDay : '[gaur] LT[etan]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11991
            nextDay : '[bihar] LT[etan]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11992
            nextWeek : 'dddd LT[etan]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11993
            lastDay : '[atzo] LT[etan]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11994
            lastWeek : '[aurreko] dddd LT[etan]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11995
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11996
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11997
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11998
            future : '%s barru',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 11999
            past : 'duela %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12000
            s : 'segundo batzuk',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12001
            m : 'minutu bat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12002
            mm : '%d minutu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12003
            h : 'ordu bat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12004
            hh : '%d ordu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12005
            d : 'egun bat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12006
            dd : '%d egun',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12007
            M : 'hilabete bat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12008
            MM : '%d hilabete',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12009
            y : 'urte bat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12010
            yy : '%d urte'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12011
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12012
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12013
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12014
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12015
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12016
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12017
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12018
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12019
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12020
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12021
// locale : Persian (fa)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12022
// author : Ebrahim Byagowi : https://github.com/ebraminio
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12023
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12024
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12025
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12026
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12027
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12028
        '1': '۱',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12029
        '2': '۲',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12030
        '3': '۳',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12031
        '4': '۴',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12032
        '5': '۵',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12033
        '6': '۶',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12034
        '7': '۷',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12035
        '8': '۸',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12036
        '9': '۹',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12037
        '0': '۰'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12038
    }, numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12039
        '۱': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12040
        '۲': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12041
        '۳': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12042
        '۴': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12043
        '۵': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12044
        '۶': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12045
        '۷': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12046
        '۸': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12047
        '۹': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12048
        '۰': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12049
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12050
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12051
    return moment.defineLocale('fa', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12052
        months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12053
        monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12054
        weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12055
        weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12056
        weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12057
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12058
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12059
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12060
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12061
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12062
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12063
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12064
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12065
        meridiemParse: /قبل از ظهر|بعد از ظهر/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12066
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12067
            return /بعد از ظهر/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12068
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12069
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12070
            if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12071
                return 'قبل از ظهر';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12072
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12073
                return 'بعد از ظهر';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12074
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12075
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12076
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12077
            sameDay : '[امروز ساعت] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12078
            nextDay : '[فردا ساعت] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12079
            nextWeek : 'dddd [ساعت] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12080
            lastDay : '[دیروز ساعت] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12081
            lastWeek : 'dddd [پیش] [ساعت] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12082
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12083
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12084
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12085
            future : 'در %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12086
            past : '%s پیش',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12087
            s : 'چندین ثانیه',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12088
            m : 'یک دقیقه',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12089
            mm : '%d دقیقه',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12090
            h : 'یک ساعت',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12091
            hh : '%d ساعت',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12092
            d : 'یک روز',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12093
            dd : '%d روز',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12094
            M : 'یک ماه',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12095
            MM : '%d ماه',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12096
            y : 'یک سال',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12097
            yy : '%d سال'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12098
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12099
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12100
            return string.replace(/[۰-۹]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12101
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12102
            }).replace(/،/g, ',');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12103
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12104
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12105
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12106
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12107
            }).replace(/,/g, '،');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12108
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12109
        ordinalParse: /\d{1,2}م/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12110
        ordinal : '%dم',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12111
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12112
            dow : 6, // Saturday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12113
            doy : 12 // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12114
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12115
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12116
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12117
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12118
// locale : finnish (fi)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12119
// author : Tarmo Aidantausta : https://github.com/bleadof
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12120
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12121
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12122
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12123
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12124
    var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12125
        numbersFuture = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12126
            'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12127
            numbersPast[7], numbersPast[8], numbersPast[9]
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12128
        ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12129
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12130
    function translate(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12131
        var result = '';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12132
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12133
        case 's':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12134
            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12135
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12136
            return isFuture ? 'minuutin' : 'minuutti';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12137
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12138
            result = isFuture ? 'minuutin' : 'minuuttia';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12139
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12140
        case 'h':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12141
            return isFuture ? 'tunnin' : 'tunti';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12142
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12143
            result = isFuture ? 'tunnin' : 'tuntia';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12144
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12145
        case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12146
            return isFuture ? 'päivän' : 'päivä';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12147
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12148
            result = isFuture ? 'päivän' : 'päivää';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12149
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12150
        case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12151
            return isFuture ? 'kuukauden' : 'kuukausi';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12152
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12153
            result = isFuture ? 'kuukauden' : 'kuukautta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12154
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12155
        case 'y':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12156
            return isFuture ? 'vuoden' : 'vuosi';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12157
        case 'yy':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12158
            result = isFuture ? 'vuoden' : 'vuotta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12159
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12160
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12161
        result = verbalNumber(number, isFuture) + ' ' + result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12162
        return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12163
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12164
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12165
    function verbalNumber(number, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12166
        return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12167
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12168
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12169
    return moment.defineLocale('fi', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12170
        months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12171
        monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12172
        weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12173
        weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12174
        weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12175
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12176
            LT : 'HH.mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12177
            LTS : 'HH.mm.ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12178
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12179
            LL : 'Do MMMM[ta] YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12180
            LLL : 'Do MMMM[ta] YYYY, [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12181
            LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12182
            l : 'D.M.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12183
            ll : 'Do MMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12184
            lll : 'Do MMM YYYY, [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12185
            llll : 'ddd, Do MMM YYYY, [klo] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12186
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12187
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12188
            sameDay : '[tänään] [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12189
            nextDay : '[huomenna] [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12190
            nextWeek : 'dddd [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12191
            lastDay : '[eilen] [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12192
            lastWeek : '[viime] dddd[na] [klo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12193
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12194
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12195
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12196
            future : '%s päästä',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12197
            past : '%s sitten',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12198
            s : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12199
            m : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12200
            mm : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12201
            h : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12202
            hh : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12203
            d : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12204
            dd : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12205
            M : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12206
            MM : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12207
            y : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12208
            yy : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12209
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12210
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12211
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12212
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12213
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12214
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12215
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12216
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12217
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12218
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12219
// locale : faroese (fo)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12220
// author : Ragnar Johannesen : https://github.com/ragnar123
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12221
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12222
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12223
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12224
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12225
    return moment.defineLocale('fo', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12226
        months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12227
        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12228
        weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12229
        weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12230
        weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12231
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12232
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12233
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12234
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12235
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12236
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12237
            LLLL : 'dddd D. MMMM, YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12238
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12239
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12240
            sameDay : '[Í dag kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12241
            nextDay : '[Í morgin kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12242
            nextWeek : 'dddd [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12243
            lastDay : '[Í gjár kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12244
            lastWeek : '[síðstu] dddd [kl] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12245
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12246
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12247
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12248
            future : 'um %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12249
            past : '%s síðani',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12250
            s : 'fá sekund',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12251
            m : 'ein minutt',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12252
            mm : '%d minuttir',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12253
            h : 'ein tími',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12254
            hh : '%d tímar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12255
            d : 'ein dagur',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12256
            dd : '%d dagar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12257
            M : 'ein mánaði',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12258
            MM : '%d mánaðir',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12259
            y : 'eitt ár',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12260
            yy : '%d ár'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12261
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12262
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12263
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12264
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12265
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12266
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12267
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12268
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12269
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12270
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12271
// locale : canadian french (fr-ca)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12272
// author : Jonathan Abourbih : https://github.com/jonbca
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12273
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12274
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12275
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12276
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12277
    return moment.defineLocale('fr-ca', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12278
        months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12279
        monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12280
        weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12281
        weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12282
        weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12283
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12284
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12285
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12286
            L : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12287
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12288
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12289
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12290
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12291
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12292
            sameDay: '[Aujourd\'hui à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12293
            nextDay: '[Demain à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12294
            nextWeek: 'dddd [à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12295
            lastDay: '[Hier à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12296
            lastWeek: 'dddd [dernier à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12297
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12298
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12299
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12300
            future : 'dans %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12301
            past : 'il y a %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12302
            s : 'quelques secondes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12303
            m : 'une minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12304
            mm : '%d minutes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12305
            h : 'une heure',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12306
            hh : '%d heures',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12307
            d : 'un jour',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12308
            dd : '%d jours',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12309
            M : 'un mois',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12310
            MM : '%d mois',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12311
            y : 'un an',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12312
            yy : '%d ans'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12313
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12314
        ordinalParse: /\d{1,2}(er|)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12315
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12316
            return number + (number === 1 ? 'er' : '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12317
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12318
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12319
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12320
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12321
// locale : french (fr)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12322
// author : John Fischer : https://github.com/jfroffice
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12323
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12324
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12325
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12326
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12327
    return moment.defineLocale('fr', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12328
        months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12329
        monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12330
        weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12331
        weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12332
        weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12333
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12334
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12335
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12336
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12337
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12338
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12339
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12340
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12341
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12342
            sameDay: '[Aujourd\'hui à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12343
            nextDay: '[Demain à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12344
            nextWeek: 'dddd [à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12345
            lastDay: '[Hier à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12346
            lastWeek: 'dddd [dernier à] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12347
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12348
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12349
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12350
            future : 'dans %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12351
            past : 'il y a %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12352
            s : 'quelques secondes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12353
            m : 'une minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12354
            mm : '%d minutes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12355
            h : 'une heure',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12356
            hh : '%d heures',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12357
            d : 'un jour',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12358
            dd : '%d jours',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12359
            M : 'un mois',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12360
            MM : '%d mois',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12361
            y : 'un an',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12362
            yy : '%d ans'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12363
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12364
        ordinalParse: /\d{1,2}(er|)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12365
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12366
            return number + (number === 1 ? 'er' : '');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12367
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12368
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12369
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12370
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12371
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12372
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12373
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12374
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12375
// locale : frisian (fy)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12376
// author : Robin van der Vliet : https://github.com/robin0van0der0v
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12377
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12378
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12379
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12380
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12381
    var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12382
        monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12383
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12384
    return moment.defineLocale('fy', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12385
        months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12386
        monthsShort : function (m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12387
            if (/-MMM-/.test(format)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12388
                return monthsShortWithoutDots[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12389
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12390
                return monthsShortWithDots[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12391
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12392
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12393
        weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12394
        weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12395
        weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12396
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12397
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12398
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12399
            L : 'DD-MM-YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12400
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12401
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12402
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12403
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12404
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12405
            sameDay: '[hjoed om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12406
            nextDay: '[moarn om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12407
            nextWeek: 'dddd [om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12408
            lastDay: '[juster om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12409
            lastWeek: '[ôfrûne] dddd [om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12410
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12411
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12412
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12413
            future : 'oer %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12414
            past : '%s lyn',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12415
            s : 'in pear sekonden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12416
            m : 'ien minút',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12417
            mm : '%d minuten',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12418
            h : 'ien oere',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12419
            hh : '%d oeren',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12420
            d : 'ien dei',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12421
            dd : '%d dagen',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12422
            M : 'ien moanne',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12423
            MM : '%d moannen',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12424
            y : 'ien jier',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12425
            yy : '%d jierren'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12426
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12427
        ordinalParse: /\d{1,2}(ste|de)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12428
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12429
            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12430
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12431
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12432
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12433
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12434
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12435
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12436
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12437
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12438
// locale : galician (gl)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12439
// author : Juan G. Hurtado : https://github.com/juanghurtado
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12440
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12441
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12442
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12443
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12444
    return moment.defineLocale('gl', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12445
        months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12446
        monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12447
        weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12448
        weekdaysShort : 'Dom._Lun._Mar._Mér._Xov._Ven._Sáb.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12449
        weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12450
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12451
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12452
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12453
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12454
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12455
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12456
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12457
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12458
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12459
            sameDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12460
                return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12461
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12462
            nextDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12463
                return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12464
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12465
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12466
                return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12467
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12468
            lastDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12469
                return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12470
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12471
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12472
                return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12473
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12474
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12475
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12476
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12477
            future : function (str) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12478
                if (str === 'uns segundos') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12479
                    return 'nuns segundos';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12480
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12481
                return 'en ' + str;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12482
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12483
            past : 'hai %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12484
            s : 'uns segundos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12485
            m : 'un minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12486
            mm : '%d minutos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12487
            h : 'unha hora',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12488
            hh : '%d horas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12489
            d : 'un día',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12490
            dd : '%d días',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12491
            M : 'un mes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12492
            MM : '%d meses',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12493
            y : 'un ano',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12494
            yy : '%d anos'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12495
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12496
        ordinalParse : /\d{1,2}º/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12497
        ordinal : '%dº',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12498
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12499
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12500
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12501
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12502
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12503
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12504
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12505
// locale : Hebrew (he)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12506
// author : Tomer Cohen : https://github.com/tomer
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12507
// author : Moshe Simantov : https://github.com/DevelopmentIL
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12508
// author : Tal Ater : https://github.com/TalAter
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12509
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12510
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12511
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12512
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12513
    return moment.defineLocale('he', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12514
        months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12515
        monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12516
        weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12517
        weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12518
        weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12519
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12520
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12521
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12522
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12523
            LL : 'D [ב]MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12524
            LLL : 'D [ב]MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12525
            LLLL : 'dddd, D [ב]MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12526
            l : 'D/M/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12527
            ll : 'D MMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12528
            lll : 'D MMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12529
            llll : 'ddd, D MMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12530
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12531
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12532
            sameDay : '[היום ב־]LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12533
            nextDay : '[מחר ב־]LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12534
            nextWeek : 'dddd [בשעה] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12535
            lastDay : '[אתמול ב־]LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12536
            lastWeek : '[ביום] dddd [האחרון בשעה] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12537
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12538
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12539
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12540
            future : 'בעוד %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12541
            past : 'לפני %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12542
            s : 'מספר שניות',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12543
            m : 'דקה',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12544
            mm : '%d דקות',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12545
            h : 'שעה',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12546
            hh : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12547
                if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12548
                    return 'שעתיים';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12549
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12550
                return number + ' שעות';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12551
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12552
            d : 'יום',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12553
            dd : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12554
                if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12555
                    return 'יומיים';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12556
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12557
                return number + ' ימים';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12558
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12559
            M : 'חודש',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12560
            MM : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12561
                if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12562
                    return 'חודשיים';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12563
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12564
                return number + ' חודשים';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12565
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12566
            y : 'שנה',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12567
            yy : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12568
                if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12569
                    return 'שנתיים';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12570
                } else if (number % 10 === 0 && number !== 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12571
                    return number + ' שנה';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12572
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12573
                return number + ' שנים';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12574
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12575
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12576
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12577
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12578
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12579
// locale : hindi (hi)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12580
// author : Mayank Singhal : https://github.com/mayanksinghal
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12581
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12582
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12583
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12584
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12585
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12586
        '1': '१',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12587
        '2': '२',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12588
        '3': '३',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12589
        '4': '४',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12590
        '5': '५',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12591
        '6': '६',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12592
        '7': '७',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12593
        '8': '८',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12594
        '9': '९',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12595
        '0': '०'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12596
    },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12597
    numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12598
        '१': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12599
        '२': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12600
        '३': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12601
        '४': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12602
        '५': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12603
        '६': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12604
        '७': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12605
        '८': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12606
        '९': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12607
        '०': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12608
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12609
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12610
    return moment.defineLocale('hi', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12611
        months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12612
        monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12613
        weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12614
        weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12615
        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12616
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12617
            LT : 'A h:mm बजे',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12618
            LTS : 'A h:mm:ss बजे',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12619
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12620
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12621
            LLL : 'D MMMM YYYY, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12622
            LLLL : 'dddd, D MMMM YYYY, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12623
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12624
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12625
            sameDay : '[आज] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12626
            nextDay : '[कल] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12627
            nextWeek : 'dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12628
            lastDay : '[कल] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12629
            lastWeek : '[पिछले] dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12630
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12631
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12632
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12633
            future : '%s में',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12634
            past : '%s पहले',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12635
            s : 'कुछ ही क्षण',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12636
            m : 'एक मिनट',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12637
            mm : '%d मिनट',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12638
            h : 'एक घंटा',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12639
            hh : '%d घंटे',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12640
            d : 'एक दिन',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12641
            dd : '%d दिन',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12642
            M : 'एक महीने',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12643
            MM : '%d महीने',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12644
            y : 'एक वर्ष',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12645
            yy : '%d वर्ष'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12646
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12647
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12648
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12649
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12650
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12651
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12652
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12653
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12654
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12655
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12656
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12657
        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12658
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12659
        meridiemParse: /रात|सुबह|दोपहर|शाम/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12660
        meridiemHour : function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12661
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12662
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12663
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12664
            if (meridiem === 'रात') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12665
                return hour < 4 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12666
            } else if (meridiem === 'सुबह') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12667
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12668
            } else if (meridiem === 'दोपहर') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12669
                return hour >= 10 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12670
            } else if (meridiem === 'शाम') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12671
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12672
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12673
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12674
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12675
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12676
                return 'रात';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12677
            } else if (hour < 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12678
                return 'सुबह';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12679
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12680
                return 'दोपहर';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12681
            } else if (hour < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12682
                return 'शाम';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12683
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12684
                return 'रात';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12685
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12686
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12687
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12688
            dow : 0, // Sunday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12689
            doy : 6  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12690
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12691
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12692
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12693
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12694
// locale : hrvatski (hr)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12695
// author : Bojan Marković : https://github.com/bmarkovic
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12696
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12697
// based on (sl) translation by Robert Sedovšek
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12698
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12699
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12700
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12701
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12702
    function translate(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12703
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12704
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12705
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12706
            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12707
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12708
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12709
                result += 'minuta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12710
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12711
                result += 'minute';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12712
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12713
                result += 'minuta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12714
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12715
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12716
        case 'h':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12717
            return withoutSuffix ? 'jedan sat' : 'jednog sata';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12718
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12719
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12720
                result += 'sat';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12721
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12722
                result += 'sata';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12723
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12724
                result += 'sati';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12725
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12726
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12727
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12728
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12729
                result += 'dan';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12730
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12731
                result += 'dana';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12732
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12733
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12734
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12735
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12736
                result += 'mjesec';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12737
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12738
                result += 'mjeseca';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12739
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12740
                result += 'mjeseci';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12741
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12742
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12743
        case 'yy':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12744
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12745
                result += 'godina';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12746
            } else if (number === 2 || number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12747
                result += 'godine';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12748
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12749
                result += 'godina';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12750
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12751
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12752
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12753
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12754
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12755
    return moment.defineLocale('hr', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12756
        months : 'sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12757
        monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12758
        weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12759
        weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12760
        weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12761
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12762
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12763
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12764
            L : 'DD. MM. YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12765
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12766
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12767
            LLLL : 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12768
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12769
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12770
            sameDay  : '[danas u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12771
            nextDay  : '[sutra u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12772
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12773
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12774
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12775
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12776
                    return '[u] [nedjelju] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12777
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12778
                    return '[u] [srijedu] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12779
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12780
                    return '[u] [subotu] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12781
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12782
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12783
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12784
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12785
                    return '[u] dddd [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12786
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12787
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12788
            lastDay  : '[jučer u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12789
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12790
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12791
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12792
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12793
                    return '[prošlu] dddd [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12794
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12795
                    return '[prošle] [subote] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12796
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12797
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12798
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12799
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12800
                    return '[prošli] dddd [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12801
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12802
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12803
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12804
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12805
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12806
            future : 'za %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12807
            past   : 'prije %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12808
            s      : 'par sekundi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12809
            m      : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12810
            mm     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12811
            h      : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12812
            hh     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12813
            d      : 'dan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12814
            dd     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12815
            M      : 'mjesec',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12816
            MM     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12817
            y      : 'godinu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12818
            yy     : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12819
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12820
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12821
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12822
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12823
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12824
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12825
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12826
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12827
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12828
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12829
// locale : hungarian (hu)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12830
// author : Adam Brunner : https://github.com/adambrunner
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12831
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12832
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12833
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12834
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12835
    var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12836
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12837
    function translate(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12838
        var num = number,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12839
            suffix;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12840
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12841
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12842
        case 's':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12843
            return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12844
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12845
            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12846
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12847
            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12848
        case 'h':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12849
            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12850
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12851
            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12852
        case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12853
            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12854
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12855
            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12856
        case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12857
            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12858
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12859
            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12860
        case 'y':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12861
            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12862
        case 'yy':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12863
            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12864
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12865
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12866
        return '';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12867
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12868
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12869
    function week(isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12870
        return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12871
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12872
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12873
    return moment.defineLocale('hu', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12874
        months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12875
        monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12876
        weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12877
        weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12878
        weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12879
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12880
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12881
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12882
            L : 'YYYY.MM.DD.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12883
            LL : 'YYYY. MMMM D.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12884
            LLL : 'YYYY. MMMM D., LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12885
            LLLL : 'YYYY. MMMM D., dddd LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12886
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12887
        meridiemParse: /de|du/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12888
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12889
            return input.charAt(1).toLowerCase() === 'u';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12890
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12891
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12892
            if (hours < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12893
                return isLower === true ? 'de' : 'DE';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12894
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12895
                return isLower === true ? 'du' : 'DU';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12896
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12897
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12898
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12899
            sameDay : '[ma] LT[-kor]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12900
            nextDay : '[holnap] LT[-kor]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12901
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12902
                return week.call(this, true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12903
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12904
            lastDay : '[tegnap] LT[-kor]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12905
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12906
                return week.call(this, false);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12907
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12908
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12909
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12910
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12911
            future : '%s múlva',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12912
            past : '%s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12913
            s : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12914
            m : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12915
            mm : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12916
            h : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12917
            hh : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12918
            d : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12919
            dd : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12920
            M : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12921
            MM : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12922
            y : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12923
            yy : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12924
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12925
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12926
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12927
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12928
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12929
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12930
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12931
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12932
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12933
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12934
// locale : Armenian (hy-am)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12935
// author : Armendarabyan : https://github.com/armendarabyan
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12936
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12937
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12938
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12939
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12940
    function monthsCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12941
        var months = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12942
            'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12943
            'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12944
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12945
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12946
        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12947
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12948
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12949
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12950
        return months[nounCase][m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12951
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12952
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12953
    function monthsShortCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12954
        var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12955
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12956
        return monthsShort[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12957
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12958
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12959
    function weekdaysCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12960
        var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12961
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12962
        return weekdays[m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12963
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12964
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12965
    return moment.defineLocale('hy-am', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12966
        months : monthsCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12967
        monthsShort : monthsShortCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12968
        weekdays : weekdaysCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12969
        weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12970
        weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12971
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12972
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12973
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12974
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12975
            LL : 'D MMMM YYYY թ.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12976
            LLL : 'D MMMM YYYY թ., LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12977
            LLLL : 'dddd, D MMMM YYYY թ., LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12978
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12979
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12980
            sameDay: '[այսօր] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12981
            nextDay: '[վաղը] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12982
            lastDay: '[երեկ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12983
            nextWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12984
                return 'dddd [օրը ժամը] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12985
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12986
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12987
                return '[անցած] dddd [օրը ժամը] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12988
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12989
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12990
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12991
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12992
            future : '%s հետո',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12993
            past : '%s առաջ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12994
            s : 'մի քանի վայրկյան',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12995
            m : 'րոպե',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12996
            mm : '%d րոպե',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12997
            h : 'ժամ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12998
            hh : '%d ժամ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 12999
            d : 'օր',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13000
            dd : '%d օր',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13001
            M : 'ամիս',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13002
            MM : '%d ամիս',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13003
            y : 'տարի',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13004
            yy : '%d տարի'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13005
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13006
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13007
        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13008
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13009
            return /^(ցերեկվա|երեկոյան)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13010
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13011
        meridiem : function (hour) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13012
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13013
                return 'գիշերվա';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13014
            } else if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13015
                return 'առավոտվա';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13016
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13017
                return 'ցերեկվա';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13018
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13019
                return 'երեկոյան';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13020
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13021
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13022
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13023
        ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13024
        ordinal: function (number, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13025
            switch (period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13026
            case 'DDD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13027
            case 'w':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13028
            case 'W':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13029
            case 'DDDo':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13030
                if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13031
                    return number + '-ին';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13032
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13033
                return number + '-րդ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13034
            default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13035
                return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13036
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13037
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13038
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13039
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13040
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13041
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13042
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13043
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13044
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13045
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13046
// locale : Bahasa Indonesia (id)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13047
// author : Mohammad Satrio Utomo : https://github.com/tyok
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13048
// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13049
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13050
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13051
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13052
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13053
    return moment.defineLocale('id', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13054
        months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13055
        monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13056
        weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13057
        weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13058
        weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13059
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13060
            LT : 'HH.mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13061
            LTS : 'LT.ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13062
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13063
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13064
            LLL : 'D MMMM YYYY [pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13065
            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13066
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13067
        meridiemParse: /pagi|siang|sore|malam/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13068
        meridiemHour : function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13069
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13070
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13071
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13072
            if (meridiem === 'pagi') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13073
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13074
            } else if (meridiem === 'siang') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13075
                return hour >= 11 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13076
            } else if (meridiem === 'sore' || meridiem === 'malam') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13077
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13078
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13079
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13080
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13081
            if (hours < 11) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13082
                return 'pagi';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13083
            } else if (hours < 15) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13084
                return 'siang';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13085
            } else if (hours < 19) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13086
                return 'sore';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13087
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13088
                return 'malam';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13089
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13090
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13091
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13092
            sameDay : '[Hari ini pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13093
            nextDay : '[Besok pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13094
            nextWeek : 'dddd [pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13095
            lastDay : '[Kemarin pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13096
            lastWeek : 'dddd [lalu pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13097
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13098
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13099
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13100
            future : 'dalam %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13101
            past : '%s yang lalu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13102
            s : 'beberapa detik',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13103
            m : 'semenit',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13104
            mm : '%d menit',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13105
            h : 'sejam',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13106
            hh : '%d jam',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13107
            d : 'sehari',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13108
            dd : '%d hari',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13109
            M : 'sebulan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13110
            MM : '%d bulan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13111
            y : 'setahun',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13112
            yy : '%d tahun'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13113
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13114
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13115
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13116
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13117
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13118
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13119
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13120
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13121
// locale : icelandic (is)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13122
// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13123
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13124
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13125
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13126
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13127
    function plural(n) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13128
        if (n % 100 === 11) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13129
            return true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13130
        } else if (n % 10 === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13131
            return false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13132
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13133
        return true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13134
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13135
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13136
    function translate(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13137
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13138
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13139
        case 's':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13140
            return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13141
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13142
            return withoutSuffix ? 'mínúta' : 'mínútu';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13143
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13144
            if (plural(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13145
                return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13146
            } else if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13147
                return result + 'mínúta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13148
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13149
            return result + 'mínútu';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13150
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13151
            if (plural(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13152
                return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13153
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13154
            return result + 'klukkustund';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13155
        case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13156
            if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13157
                return 'dagur';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13158
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13159
            return isFuture ? 'dag' : 'degi';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13160
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13161
            if (plural(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13162
                if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13163
                    return result + 'dagar';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13164
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13165
                return result + (isFuture ? 'daga' : 'dögum');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13166
            } else if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13167
                return result + 'dagur';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13168
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13169
            return result + (isFuture ? 'dag' : 'degi');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13170
        case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13171
            if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13172
                return 'mánuður';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13173
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13174
            return isFuture ? 'mánuð' : 'mánuði';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13175
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13176
            if (plural(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13177
                if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13178
                    return result + 'mánuðir';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13179
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13180
                return result + (isFuture ? 'mánuði' : 'mánuðum');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13181
            } else if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13182
                return result + 'mánuður';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13183
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13184
            return result + (isFuture ? 'mánuð' : 'mánuði');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13185
        case 'y':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13186
            return withoutSuffix || isFuture ? 'ár' : 'ári';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13187
        case 'yy':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13188
            if (plural(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13189
                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13190
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13191
            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13192
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13193
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13194
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13195
    return moment.defineLocale('is', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13196
        months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13197
        monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13198
        weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13199
        weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13200
        weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13201
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13202
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13203
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13204
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13205
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13206
            LLL : 'D. MMMM YYYY [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13207
            LLLL : 'dddd, D. MMMM YYYY [kl.] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13208
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13209
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13210
            sameDay : '[í dag kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13211
            nextDay : '[á morgun kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13212
            nextWeek : 'dddd [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13213
            lastDay : '[í gær kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13214
            lastWeek : '[síðasta] dddd [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13215
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13216
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13217
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13218
            future : 'eftir %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13219
            past : 'fyrir %s síðan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13220
            s : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13221
            m : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13222
            mm : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13223
            h : 'klukkustund',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13224
            hh : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13225
            d : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13226
            dd : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13227
            M : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13228
            MM : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13229
            y : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13230
            yy : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13231
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13232
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13233
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13234
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13235
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13236
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13237
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13238
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13239
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13240
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13241
// locale : italian (it)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13242
// author : Lorenzo : https://github.com/aliem
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13243
// author: Mattia Larentis: https://github.com/nostalgiaz
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13244
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13245
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13246
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13247
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13248
    return moment.defineLocale('it', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13249
        months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13250
        monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13251
        weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13252
        weekdaysShort : 'Dom_Lun_Mar_Mer_Gio_Ven_Sab'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13253
        weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13254
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13255
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13256
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13257
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13258
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13259
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13260
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13261
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13262
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13263
            sameDay: '[Oggi alle] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13264
            nextDay: '[Domani alle] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13265
            nextWeek: 'dddd [alle] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13266
            lastDay: '[Ieri alle] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13267
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13268
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13269
                    case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13270
                        return '[la scorsa] dddd [alle] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13271
                    default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13272
                        return '[lo scorso] dddd [alle] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13273
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13274
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13275
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13276
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13277
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13278
            future : function (s) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13279
                return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13280
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13281
            past : '%s fa',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13282
            s : 'alcuni secondi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13283
            m : 'un minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13284
            mm : '%d minuti',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13285
            h : 'un\'ora',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13286
            hh : '%d ore',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13287
            d : 'un giorno',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13288
            dd : '%d giorni',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13289
            M : 'un mese',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13290
            MM : '%d mesi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13291
            y : 'un anno',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13292
            yy : '%d anni'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13293
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13294
        ordinalParse : /\d{1,2}º/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13295
        ordinal: '%dº',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13296
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13297
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13298
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13299
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13300
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13301
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13302
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13303
// locale : japanese (ja)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13304
// author : LI Long : https://github.com/baryon
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13305
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13306
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13307
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13308
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13309
    return moment.defineLocale('ja', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13310
        months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13311
        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13312
        weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13313
        weekdaysShort : '日_月_火_水_木_金_土'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13314
        weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13315
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13316
            LT : 'Ah時m分',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13317
            LTS : 'LTs秒',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13318
            L : 'YYYY/MM/DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13319
            LL : 'YYYY年M月D日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13320
            LLL : 'YYYY年M月D日LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13321
            LLLL : 'YYYY年M月D日LT dddd'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13322
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13323
        meridiemParse: /午前|午後/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13324
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13325
            return input === '午後';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13326
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13327
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13328
            if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13329
                return '午前';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13330
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13331
                return '午後';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13332
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13333
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13334
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13335
            sameDay : '[今日] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13336
            nextDay : '[明日] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13337
            nextWeek : '[来週]dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13338
            lastDay : '[昨日] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13339
            lastWeek : '[前週]dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13340
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13341
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13342
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13343
            future : '%s後',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13344
            past : '%s前',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13345
            s : '数秒',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13346
            m : '1分',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13347
            mm : '%d分',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13348
            h : '1時間',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13349
            hh : '%d時間',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13350
            d : '1日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13351
            dd : '%d日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13352
            M : '1ヶ月',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13353
            MM : '%dヶ月',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13354
            y : '1年',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13355
            yy : '%d年'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13356
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13357
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13358
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13359
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13360
// locale : Georgian (ka)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13361
// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13362
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13363
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13364
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13365
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13366
    function monthsCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13367
        var months = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13368
            'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13369
            'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13370
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13371
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13372
        nounCase = (/D[oD] *MMMM?/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13373
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13374
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13375
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13376
        return months[nounCase][m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13377
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13378
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13379
    function weekdaysCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13380
        var weekdays = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13381
            'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13382
            'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13383
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13384
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13385
        nounCase = (/(წინა|შემდეგ)/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13386
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13387
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13388
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13389
        return weekdays[nounCase][m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13390
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13391
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13392
    return moment.defineLocale('ka', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13393
        months : monthsCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13394
        monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13395
        weekdays : weekdaysCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13396
        weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13397
        weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13398
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13399
            LT : 'h:mm A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13400
            LTS : 'h:mm:ss A',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13401
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13402
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13403
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13404
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13405
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13406
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13407
            sameDay : '[დღეს] LT[-ზე]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13408
            nextDay : '[ხვალ] LT[-ზე]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13409
            lastDay : '[გუშინ] LT[-ზე]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13410
            nextWeek : '[შემდეგ] dddd LT[-ზე]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13411
            lastWeek : '[წინა] dddd LT-ზე',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13412
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13413
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13414
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13415
            future : function (s) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13416
                return (/(წამი|წუთი|საათი|წელი)/).test(s) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13417
                    s.replace(/ი$/, 'ში') :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13418
                    s + 'ში';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13419
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13420
            past : function (s) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13421
                if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13422
                    return s.replace(/(ი|ე)$/, 'ის წინ');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13423
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13424
                if ((/წელი/).test(s)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13425
                    return s.replace(/წელი$/, 'წლის წინ');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13426
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13427
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13428
            s : 'რამდენიმე წამი',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13429
            m : 'წუთი',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13430
            mm : '%d წუთი',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13431
            h : 'საათი',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13432
            hh : '%d საათი',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13433
            d : 'დღე',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13434
            dd : '%d დღე',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13435
            M : 'თვე',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13436
            MM : '%d თვე',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13437
            y : 'წელი',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13438
            yy : '%d წელი'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13439
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13440
        ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13441
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13442
            if (number === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13443
                return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13444
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13445
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13446
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13447
                return number + '-ლი';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13448
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13449
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13450
            if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13451
                return 'მე-' + number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13452
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13453
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13454
            return number + '-ე';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13455
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13456
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13457
            dow : 1,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13458
            doy : 7
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13459
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13460
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13461
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13462
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13463
// locale : khmer (km)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13464
// author : Kruy Vanna : https://github.com/kruyvanna
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13465
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13466
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13467
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13468
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13469
    return moment.defineLocale('km', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13470
        months: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13471
        monthsShort: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13472
        weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13473
        weekdaysShort: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13474
        weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13475
        longDateFormat: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13476
            LT: 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13477
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13478
            L: 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13479
            LL: 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13480
            LLL: 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13481
            LLLL: 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13482
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13483
        calendar: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13484
            sameDay: '[ថ្ងៃនៈ ម៉ោង] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13485
            nextDay: '[ស្អែក ម៉ោង] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13486
            nextWeek: 'dddd [ម៉ោង] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13487
            lastDay: '[ម្សិលមិញ ម៉ោង] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13488
            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13489
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13490
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13491
        relativeTime: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13492
            future: '%sទៀត',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13493
            past: '%sមុន',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13494
            s: 'ប៉ុន្មានវិនាទី',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13495
            m: 'មួយនាទី',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13496
            mm: '%d នាទី',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13497
            h: 'មួយម៉ោង',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13498
            hh: '%d ម៉ោង',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13499
            d: 'មួយថ្ងៃ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13500
            dd: '%d ថ្ងៃ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13501
            M: 'មួយខែ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13502
            MM: '%d ខែ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13503
            y: 'មួយឆ្នាំ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13504
            yy: '%d ឆ្នាំ'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13505
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13506
        week: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13507
            dow: 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13508
            doy: 4 // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13509
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13510
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13511
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13512
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13513
// locale : korean (ko)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13514
//
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13515
// authors
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13516
//
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13517
// - Kyungwook, Park : https://github.com/kyungw00k
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13518
// - Jeeeyul Lee <jeeeyul@gmail.com>
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13519
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13520
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13521
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13522
    return moment.defineLocale('ko', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13523
        months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13524
        monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13525
        weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13526
        weekdaysShort : '일_월_화_수_목_금_토'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13527
        weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13528
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13529
            LT : 'A h시 m분',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13530
            LTS : 'A h시 m분 s초',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13531
            L : 'YYYY.MM.DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13532
            LL : 'YYYY년 MMMM D일',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13533
            LLL : 'YYYY년 MMMM D일 LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13534
            LLLL : 'YYYY년 MMMM D일 dddd LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13535
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13536
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13537
            sameDay : '오늘 LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13538
            nextDay : '내일 LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13539
            nextWeek : 'dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13540
            lastDay : '어제 LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13541
            lastWeek : '지난주 dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13542
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13543
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13544
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13545
            future : '%s 후',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13546
            past : '%s 전',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13547
            s : '몇초',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13548
            ss : '%d초',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13549
            m : '일분',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13550
            mm : '%d분',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13551
            h : '한시간',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13552
            hh : '%d시간',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13553
            d : '하루',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13554
            dd : '%d일',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13555
            M : '한달',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13556
            MM : '%d달',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13557
            y : '일년',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13558
            yy : '%d년'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13559
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13560
        ordinalParse : /\d{1,2}일/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13561
        ordinal : '%d일',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13562
        meridiemParse : /오전|오후/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13563
        isPM : function (token) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13564
            return token === '오후';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13565
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13566
        meridiem : function (hour, minute, isUpper) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13567
            return hour < 12 ? '오전' : '오후';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13568
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13569
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13570
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13571
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13572
// locale : Luxembourgish (lb)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13573
// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13574
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13575
// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13576
// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13577
// and 'eifelerRegelAppliesToNumber' methods are meant for
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13578
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13579
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13580
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13581
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13582
    function processRelativeTime(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13583
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13584
            'm': ['eng Minutt', 'enger Minutt'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13585
            'h': ['eng Stonn', 'enger Stonn'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13586
            'd': ['een Dag', 'engem Dag'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13587
            'M': ['ee Mount', 'engem Mount'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13588
            'y': ['ee Joer', 'engem Joer']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13589
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13590
        return withoutSuffix ? format[key][0] : format[key][1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13591
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13592
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13593
    function processFutureTime(string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13594
        var number = string.substr(0, string.indexOf(' '));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13595
        if (eifelerRegelAppliesToNumber(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13596
            return 'a ' + string;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13597
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13598
        return 'an ' + string;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13599
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13600
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13601
    function processPastTime(string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13602
        var number = string.substr(0, string.indexOf(' '));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13603
        if (eifelerRegelAppliesToNumber(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13604
            return 'viru ' + string;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13605
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13606
        return 'virun ' + string;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13607
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13608
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13609
    /**
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13610
     * Returns true if the word before the given number loses the '-n' ending.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13611
     * e.g. 'an 10 Deeg' but 'a 5 Deeg'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13612
     *
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13613
     * @param number {integer}
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13614
     * @returns {boolean}
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13615
     */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13616
    function eifelerRegelAppliesToNumber(number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13617
        number = parseInt(number, 10);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13618
        if (isNaN(number)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13619
            return false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13620
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13621
        if (number < 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13622
            // Negative Number --> always true
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13623
            return true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13624
        } else if (number < 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13625
            // Only 1 digit
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13626
            if (4 <= number && number <= 7) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13627
                return true;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13628
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13629
            return false;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13630
        } else if (number < 100) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13631
            // 2 digits
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13632
            var lastDigit = number % 10, firstDigit = number / 10;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13633
            if (lastDigit === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13634
                return eifelerRegelAppliesToNumber(firstDigit);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13635
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13636
            return eifelerRegelAppliesToNumber(lastDigit);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13637
        } else if (number < 10000) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13638
            // 3 or 4 digits --> recursively check first digit
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13639
            while (number >= 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13640
                number = number / 10;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13641
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13642
            return eifelerRegelAppliesToNumber(number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13643
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13644
            // Anything larger than 4 digits: recursively check first n-3 digits
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13645
            number = number / 1000;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13646
            return eifelerRegelAppliesToNumber(number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13647
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13648
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13649
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13650
    return moment.defineLocale('lb', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13651
        months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13652
        monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13653
        weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13654
        weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13655
        weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13656
        longDateFormat: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13657
            LT: 'H:mm [Auer]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13658
            LTS: 'H:mm:ss [Auer]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13659
            L: 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13660
            LL: 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13661
            LLL: 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13662
            LLLL: 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13663
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13664
        calendar: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13665
            sameDay: '[Haut um] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13666
            sameElse: 'L',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13667
            nextDay: '[Muer um] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13668
            nextWeek: 'dddd [um] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13669
            lastDay: '[Gëschter um] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13670
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13671
                // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13672
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13673
                    case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13674
                    case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13675
                        return '[Leschten] dddd [um] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13676
                    default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13677
                        return '[Leschte] dddd [um] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13678
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13679
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13680
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13681
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13682
            future : processFutureTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13683
            past : processPastTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13684
            s : 'e puer Sekonnen',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13685
            m : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13686
            mm : '%d Minutten',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13687
            h : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13688
            hh : '%d Stonnen',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13689
            d : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13690
            dd : '%d Deeg',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13691
            M : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13692
            MM : '%d Méint',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13693
            y : processRelativeTime,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13694
            yy : '%d Joer'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13695
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13696
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13697
        ordinal: '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13698
        week: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13699
            dow: 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13700
            doy: 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13701
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13702
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13703
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13704
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13705
// locale : Lithuanian (lt)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13706
// author : Mindaugas Mozūras : https://github.com/mmozuras
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13707
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13708
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13709
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13710
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13711
    var units = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13712
        'm' : 'minutė_minutės_minutę',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13713
        'mm': 'minutės_minučių_minutes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13714
        'h' : 'valanda_valandos_valandą',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13715
        'hh': 'valandos_valandų_valandas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13716
        'd' : 'diena_dienos_dieną',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13717
        'dd': 'dienos_dienų_dienas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13718
        'M' : 'mėnuo_mėnesio_mėnesį',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13719
        'MM': 'mėnesiai_mėnesių_mėnesius',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13720
        'y' : 'metai_metų_metus',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13721
        'yy': 'metai_metų_metus'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13722
    },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13723
    weekDays = 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13724
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13725
    function translateSeconds(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13726
        if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13727
            return 'kelios sekundės';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13728
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13729
            return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13730
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13731
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13732
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13733
    function translateSingular(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13734
        return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13735
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13736
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13737
    function special(number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13738
        return number % 10 === 0 || (number > 10 && number < 20);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13739
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13740
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13741
    function forms(key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13742
        return units[key].split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13743
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13744
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13745
    function translate(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13746
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13747
        if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13748
            return result + translateSingular(number, withoutSuffix, key[0], isFuture);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13749
        } else if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13750
            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13751
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13752
            if (isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13753
                return result + forms(key)[1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13754
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13755
                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13756
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13757
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13758
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13759
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13760
    function relativeWeekDay(moment, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13761
        var nominative = format.indexOf('dddd HH:mm') === -1,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13762
            weekDay = weekDays[moment.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13763
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13764
        return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13765
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13766
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13767
    return moment.defineLocale('lt', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13768
        months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13769
        monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13770
        weekdays : relativeWeekDay,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13771
        weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13772
        weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13773
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13774
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13775
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13776
            L : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13777
            LL : 'YYYY [m.] MMMM D [d.]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13778
            LLL : 'YYYY [m.] MMMM D [d.], LT [val.]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13779
            LLLL : 'YYYY [m.] MMMM D [d.], dddd, LT [val.]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13780
            l : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13781
            ll : 'YYYY [m.] MMMM D [d.]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13782
            lll : 'YYYY [m.] MMMM D [d.], LT [val.]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13783
            llll : 'YYYY [m.] MMMM D [d.], ddd, LT [val.]'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13784
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13785
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13786
            sameDay : '[Šiandien] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13787
            nextDay : '[Rytoj] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13788
            nextWeek : 'dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13789
            lastDay : '[Vakar] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13790
            lastWeek : '[Praėjusį] dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13791
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13792
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13793
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13794
            future : 'po %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13795
            past : 'prieš %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13796
            s : translateSeconds,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13797
            m : translateSingular,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13798
            mm : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13799
            h : translateSingular,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13800
            hh : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13801
            d : translateSingular,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13802
            dd : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13803
            M : translateSingular,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13804
            MM : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13805
            y : translateSingular,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13806
            yy : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13807
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13808
        ordinalParse: /\d{1,2}-oji/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13809
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13810
            return number + '-oji';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13811
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13812
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13813
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13814
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13815
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13816
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13817
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13818
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13819
// locale : latvian (lv)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13820
// author : Kristaps Karlsons : https://github.com/skakri
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13821
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13822
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13823
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13824
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13825
    var units = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13826
        'mm': 'minūti_minūtes_minūte_minūtes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13827
        'hh': 'stundu_stundas_stunda_stundas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13828
        'dd': 'dienu_dienas_diena_dienas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13829
        'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13830
        'yy': 'gadu_gadus_gads_gadi'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13831
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13832
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13833
    function format(word, number, withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13834
        var forms = word.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13835
        if (withoutSuffix) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13836
            return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13837
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13838
            return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13839
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13840
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13841
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13842
    function relativeTimeWithPlural(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13843
        return number + ' ' + format(units[key], number, withoutSuffix);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13844
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13845
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13846
    return moment.defineLocale('lv', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13847
        months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13848
        monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13849
        weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13850
        weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13851
        weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13852
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13853
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13854
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13855
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13856
            LL : 'YYYY. [gada] D. MMMM',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13857
            LLL : 'YYYY. [gada] D. MMMM, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13858
            LLLL : 'YYYY. [gada] D. MMMM, dddd, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13859
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13860
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13861
            sameDay : '[Šodien pulksten] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13862
            nextDay : '[Rīt pulksten] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13863
            nextWeek : 'dddd [pulksten] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13864
            lastDay : '[Vakar pulksten] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13865
            lastWeek : '[Pagājušā] dddd [pulksten] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13866
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13867
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13868
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13869
            future : '%s vēlāk',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13870
            past : '%s agrāk',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13871
            s : 'dažas sekundes',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13872
            m : 'minūti',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13873
            mm : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13874
            h : 'stundu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13875
            hh : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13876
            d : 'dienu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13877
            dd : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13878
            M : 'mēnesi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13879
            MM : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13880
            y : 'gadu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13881
            yy : relativeTimeWithPlural
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13882
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13883
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13884
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13885
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13886
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13887
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13888
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13889
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13890
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13891
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13892
// locale : macedonian (mk)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13893
// author : Borislav Mickov : https://github.com/B0k0
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13894
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13895
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13896
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13897
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13898
    return moment.defineLocale('mk', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13899
        months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13900
        monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13901
        weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13902
        weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13903
        weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13904
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13905
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13906
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13907
            L : 'D.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13908
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13909
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13910
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13911
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13912
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13913
            sameDay : '[Денес во] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13914
            nextDay : '[Утре во] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13915
            nextWeek : 'dddd [во] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13916
            lastDay : '[Вчера во] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13917
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13918
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13919
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13920
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13921
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13922
                    return '[Во изминатата] dddd [во] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13923
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13924
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13925
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13926
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13927
                    return '[Во изминатиот] dddd [во] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13928
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13929
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13930
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13931
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13932
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13933
            future : 'после %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13934
            past : 'пред %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13935
            s : 'неколку секунди',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13936
            m : 'минута',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13937
            mm : '%d минути',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13938
            h : 'час',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13939
            hh : '%d часа',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13940
            d : 'ден',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13941
            dd : '%d дена',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13942
            M : 'месец',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13943
            MM : '%d месеци',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13944
            y : 'година',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13945
            yy : '%d години'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13946
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13947
        ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13948
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13949
            var lastDigit = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13950
                last2Digits = number % 100;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13951
            if (number === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13952
                return number + '-ев';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13953
            } else if (last2Digits === 0) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13954
                return number + '-ен';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13955
            } else if (last2Digits > 10 && last2Digits < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13956
                return number + '-ти';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13957
            } else if (lastDigit === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13958
                return number + '-ви';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13959
            } else if (lastDigit === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13960
                return number + '-ри';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13961
            } else if (lastDigit === 7 || lastDigit === 8) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13962
                return number + '-ми';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13963
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13964
                return number + '-ти';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13965
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13966
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13967
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13968
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13969
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13970
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13971
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13972
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13973
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13974
// locale : malayalam (ml)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13975
// author : Floyd Pink : https://github.com/floydpink
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13976
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13977
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13978
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13979
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13980
    return moment.defineLocale('ml', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13981
        months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13982
        monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13983
        weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13984
        weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13985
        weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13986
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13987
            LT : 'A h:mm -നു',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13988
            LTS : 'A h:mm:ss -നു',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13989
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13990
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13991
            LLL : 'D MMMM YYYY, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13992
            LLLL : 'dddd, D MMMM YYYY, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13993
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13994
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13995
            sameDay : '[ഇന്ന്] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13996
            nextDay : '[നാളെ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13997
            nextWeek : 'dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13998
            lastDay : '[ഇന്നലെ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 13999
            lastWeek : '[കഴിഞ്ഞ] dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14000
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14001
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14002
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14003
            future : '%s കഴിഞ്ഞ്',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14004
            past : '%s മുൻപ്',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14005
            s : 'അൽപ നിമിഷങ്ങൾ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14006
            m : 'ഒരു മിനിറ്റ്',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14007
            mm : '%d മിനിറ്റ്',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14008
            h : 'ഒരു മണിക്കൂർ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14009
            hh : '%d മണിക്കൂർ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14010
            d : 'ഒരു ദിവസം',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14011
            dd : '%d ദിവസം',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14012
            M : 'ഒരു മാസം',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14013
            MM : '%d മാസം',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14014
            y : 'ഒരു വർഷം',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14015
            yy : '%d വർഷം'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14016
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14017
        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14018
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14019
            return /^(ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14020
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14021
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14022
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14023
                return 'രാത്രി';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14024
            } else if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14025
                return 'രാവിലെ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14026
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14027
                return 'ഉച്ച കഴിഞ്ഞ്';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14028
            } else if (hour < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14029
                return 'വൈകുന്നേരം';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14030
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14031
                return 'രാത്രി';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14032
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14033
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14034
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14035
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14036
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14037
// locale : Marathi (mr)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14038
// author : Harshad Kale : https://github.com/kalehv
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14039
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14040
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14041
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14042
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14043
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14044
        '1': '१',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14045
        '2': '२',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14046
        '3': '३',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14047
        '4': '४',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14048
        '5': '५',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14049
        '6': '६',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14050
        '7': '७',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14051
        '8': '८',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14052
        '9': '९',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14053
        '0': '०'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14054
    },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14055
    numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14056
        '१': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14057
        '२': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14058
        '३': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14059
        '४': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14060
        '५': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14061
        '६': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14062
        '७': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14063
        '८': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14064
        '९': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14065
        '०': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14066
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14067
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14068
    return moment.defineLocale('mr', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14069
        months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14070
        monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14071
        weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14072
        weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14073
        weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14074
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14075
            LT : 'A h:mm वाजता',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14076
            LTS : 'A h:mm:ss वाजता',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14077
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14078
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14079
            LLL : 'D MMMM YYYY, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14080
            LLLL : 'dddd, D MMMM YYYY, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14081
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14082
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14083
            sameDay : '[आज] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14084
            nextDay : '[उद्या] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14085
            nextWeek : 'dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14086
            lastDay : '[काल] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14087
            lastWeek: '[मागील] dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14088
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14089
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14090
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14091
            future : '%s नंतर',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14092
            past : '%s पूर्वी',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14093
            s : 'सेकंद',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14094
            m: 'एक मिनिट',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14095
            mm: '%d मिनिटे',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14096
            h : 'एक तास',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14097
            hh : '%d तास',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14098
            d : 'एक दिवस',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14099
            dd : '%d दिवस',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14100
            M : 'एक महिना',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14101
            MM : '%d महिने',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14102
            y : 'एक वर्ष',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14103
            yy : '%d वर्षे'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14104
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14105
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14106
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14107
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14108
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14109
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14110
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14111
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14112
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14113
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14114
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14115
        meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14116
        meridiemHour : function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14117
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14118
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14119
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14120
            if (meridiem === 'रात्री') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14121
                return hour < 4 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14122
            } else if (meridiem === 'सकाळी') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14123
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14124
            } else if (meridiem === 'दुपारी') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14125
                return hour >= 10 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14126
            } else if (meridiem === 'सायंकाळी') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14127
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14128
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14129
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14130
        meridiem: function (hour, minute, isLower)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14131
        {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14132
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14133
                return 'रात्री';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14134
            } else if (hour < 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14135
                return 'सकाळी';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14136
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14137
                return 'दुपारी';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14138
            } else if (hour < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14139
                return 'सायंकाळी';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14140
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14141
                return 'रात्री';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14142
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14143
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14144
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14145
            dow : 0, // Sunday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14146
            doy : 6  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14147
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14148
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14149
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14150
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14151
// locale : Bahasa Malaysia (ms-MY)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14152
// author : Weldan Jamili : https://github.com/weldan
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14153
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14154
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14155
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14156
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14157
    return moment.defineLocale('ms-my', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14158
        months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14159
        monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14160
        weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14161
        weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14162
        weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14163
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14164
            LT : 'HH.mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14165
            LTS : 'LT.ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14166
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14167
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14168
            LLL : 'D MMMM YYYY [pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14169
            LLLL : 'dddd, D MMMM YYYY [pukul] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14170
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14171
        meridiemParse: /pagi|tengahari|petang|malam/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14172
        meridiemHour: function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14173
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14174
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14175
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14176
            if (meridiem === 'pagi') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14177
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14178
            } else if (meridiem === 'tengahari') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14179
                return hour >= 11 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14180
            } else if (meridiem === 'petang' || meridiem === 'malam') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14181
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14182
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14183
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14184
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14185
            if (hours < 11) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14186
                return 'pagi';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14187
            } else if (hours < 15) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14188
                return 'tengahari';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14189
            } else if (hours < 19) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14190
                return 'petang';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14191
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14192
                return 'malam';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14193
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14194
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14195
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14196
            sameDay : '[Hari ini pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14197
            nextDay : '[Esok pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14198
            nextWeek : 'dddd [pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14199
            lastDay : '[Kelmarin pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14200
            lastWeek : 'dddd [lepas pukul] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14201
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14202
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14203
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14204
            future : 'dalam %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14205
            past : '%s yang lepas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14206
            s : 'beberapa saat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14207
            m : 'seminit',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14208
            mm : '%d minit',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14209
            h : 'sejam',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14210
            hh : '%d jam',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14211
            d : 'sehari',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14212
            dd : '%d hari',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14213
            M : 'sebulan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14214
            MM : '%d bulan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14215
            y : 'setahun',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14216
            yy : '%d tahun'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14217
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14218
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14219
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14220
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14221
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14222
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14223
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14224
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14225
// locale : Burmese (my)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14226
// author : Squar team, mysquar.com
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14227
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14228
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14229
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14230
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14231
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14232
        '1': '၁',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14233
        '2': '၂',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14234
        '3': '၃',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14235
        '4': '၄',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14236
        '5': '၅',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14237
        '6': '၆',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14238
        '7': '၇',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14239
        '8': '၈',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14240
        '9': '၉',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14241
        '0': '၀'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14242
    }, numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14243
        '၁': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14244
        '၂': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14245
        '၃': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14246
        '၄': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14247
        '၅': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14248
        '၆': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14249
        '၇': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14250
        '၈': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14251
        '၉': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14252
        '၀': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14253
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14254
    return moment.defineLocale('my', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14255
        months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14256
        monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14257
        weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14258
        weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14259
        weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14260
        longDateFormat: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14261
            LT: 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14262
            LTS: 'HH:mm:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14263
            L: 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14264
            LL: 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14265
            LLL: 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14266
            LLLL: 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14267
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14268
        calendar: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14269
            sameDay: '[ယနေ.] LT [မှာ]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14270
            nextDay: '[မနက်ဖြန်] LT [မှာ]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14271
            nextWeek: 'dddd LT [မှာ]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14272
            lastDay: '[မနေ.က] LT [မှာ]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14273
            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14274
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14275
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14276
        relativeTime: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14277
            future: 'လာမည့် %s မှာ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14278
            past: 'လွန်ခဲ့သော %s က',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14279
            s: 'စက္ကန်.အနည်းငယ်',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14280
            m: 'တစ်မိနစ်',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14281
            mm: '%d မိနစ်',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14282
            h: 'တစ်နာရီ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14283
            hh: '%d နာရီ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14284
            d: 'တစ်ရက်',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14285
            dd: '%d ရက်',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14286
            M: 'တစ်လ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14287
            MM: '%d လ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14288
            y: 'တစ်နှစ်',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14289
            yy: '%d နှစ်'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14290
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14291
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14292
            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14293
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14294
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14295
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14296
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14297
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14298
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14299
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14300
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14301
        week: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14302
            dow: 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14303
            doy: 4 // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14304
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14305
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14306
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14307
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14308
// locale : norwegian bokmål (nb)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14309
// authors : Espen Hovlandsdal : https://github.com/rexxars
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14310
//           Sigurd Gartmann : https://github.com/sigurdga
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14311
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14312
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14313
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14314
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14315
    return moment.defineLocale('nb', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14316
        months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14317
        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14318
        weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14319
        weekdaysShort : 'søn_man_tirs_ons_tors_fre_lør'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14320
        weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14321
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14322
            LT : 'H.mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14323
            LTS : 'LT.ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14324
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14325
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14326
            LLL : 'D. MMMM YYYY [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14327
            LLLL : 'dddd D. MMMM YYYY [kl.] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14328
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14329
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14330
            sameDay: '[i dag kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14331
            nextDay: '[i morgen kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14332
            nextWeek: 'dddd [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14333
            lastDay: '[i går kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14334
            lastWeek: '[forrige] dddd [kl.] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14335
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14336
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14337
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14338
            future : 'om %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14339
            past : 'for %s siden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14340
            s : 'noen sekunder',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14341
            m : 'ett minutt',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14342
            mm : '%d minutter',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14343
            h : 'en time',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14344
            hh : '%d timer',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14345
            d : 'en dag',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14346
            dd : '%d dager',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14347
            M : 'en måned',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14348
            MM : '%d måneder',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14349
            y : 'ett år',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14350
            yy : '%d år'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14351
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14352
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14353
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14354
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14355
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14356
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14357
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14358
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14359
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14360
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14361
// locale : nepali/nepalese
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14362
// author : suvash : https://github.com/suvash
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14363
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14364
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14365
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14366
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14367
    var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14368
        '1': '१',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14369
        '2': '२',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14370
        '3': '३',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14371
        '4': '४',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14372
        '5': '५',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14373
        '6': '६',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14374
        '7': '७',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14375
        '8': '८',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14376
        '9': '९',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14377
        '0': '०'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14378
    },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14379
    numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14380
        '१': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14381
        '२': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14382
        '३': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14383
        '४': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14384
        '५': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14385
        '६': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14386
        '७': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14387
        '८': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14388
        '९': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14389
        '०': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14390
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14391
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14392
    return moment.defineLocale('ne', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14393
        months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14394
        monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14395
        weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14396
        weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14397
        weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14398
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14399
            LT : 'Aको h:mm बजे',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14400
            LTS : 'Aको h:mm:ss बजे',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14401
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14402
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14403
            LLL : 'D MMMM YYYY, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14404
            LLLL : 'dddd, D MMMM YYYY, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14405
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14406
        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14407
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14408
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14409
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14410
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14411
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14412
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14413
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14414
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14415
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14416
        meridiemParse: /राती|बिहान|दिउँसो|बेलुका|साँझ|राती/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14417
        meridiemHour : function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14418
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14419
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14420
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14421
            if (meridiem === 'राती') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14422
                return hour < 3 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14423
            } else if (meridiem === 'बिहान') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14424
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14425
            } else if (meridiem === 'दिउँसो') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14426
                return hour >= 10 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14427
            } else if (meridiem === 'बेलुका' || meridiem === 'साँझ') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14428
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14429
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14430
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14431
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14432
            if (hour < 3) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14433
                return 'राती';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14434
            } else if (hour < 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14435
                return 'बिहान';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14436
            } else if (hour < 15) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14437
                return 'दिउँसो';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14438
            } else if (hour < 18) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14439
                return 'बेलुका';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14440
            } else if (hour < 20) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14441
                return 'साँझ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14442
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14443
                return 'राती';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14444
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14445
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14446
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14447
            sameDay : '[आज] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14448
            nextDay : '[भोली] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14449
            nextWeek : '[आउँदो] dddd[,] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14450
            lastDay : '[हिजो] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14451
            lastWeek : '[गएको] dddd[,] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14452
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14453
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14454
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14455
            future : '%sमा',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14456
            past : '%s अगाडी',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14457
            s : 'केही समय',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14458
            m : 'एक मिनेट',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14459
            mm : '%d मिनेट',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14460
            h : 'एक घण्टा',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14461
            hh : '%d घण्टा',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14462
            d : 'एक दिन',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14463
            dd : '%d दिन',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14464
            M : 'एक महिना',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14465
            MM : '%d महिना',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14466
            y : 'एक बर्ष',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14467
            yy : '%d बर्ष'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14468
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14469
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14470
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14471
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14472
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14473
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14474
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14475
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14476
// locale : dutch (nl)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14477
// author : Joris Röling : https://github.com/jjupiter
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14478
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14479
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14480
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14481
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14482
    var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14483
        monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14484
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14485
    return moment.defineLocale('nl', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14486
        months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14487
        monthsShort : function (m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14488
            if (/-MMM-/.test(format)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14489
                return monthsShortWithoutDots[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14490
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14491
                return monthsShortWithDots[m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14492
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14493
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14494
        weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14495
        weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14496
        weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14497
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14498
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14499
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14500
            L : 'DD-MM-YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14501
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14502
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14503
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14504
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14505
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14506
            sameDay: '[vandaag om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14507
            nextDay: '[morgen om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14508
            nextWeek: 'dddd [om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14509
            lastDay: '[gisteren om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14510
            lastWeek: '[afgelopen] dddd [om] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14511
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14512
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14513
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14514
            future : 'over %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14515
            past : '%s geleden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14516
            s : 'een paar seconden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14517
            m : 'één minuut',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14518
            mm : '%d minuten',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14519
            h : 'één uur',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14520
            hh : '%d uur',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14521
            d : 'één dag',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14522
            dd : '%d dagen',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14523
            M : 'één maand',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14524
            MM : '%d maanden',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14525
            y : 'één jaar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14526
            yy : '%d jaar'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14527
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14528
        ordinalParse: /\d{1,2}(ste|de)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14529
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14530
            return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14531
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14532
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14533
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14534
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14535
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14536
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14537
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14538
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14539
// locale : norwegian nynorsk (nn)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14540
// author : https://github.com/mechuwind
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14541
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14542
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14543
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14544
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14545
    return moment.defineLocale('nn', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14546
        months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14547
        monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14548
        weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14549
        weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14550
        weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14551
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14552
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14553
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14554
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14555
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14556
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14557
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14558
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14559
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14560
            sameDay: '[I dag klokka] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14561
            nextDay: '[I morgon klokka] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14562
            nextWeek: 'dddd [klokka] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14563
            lastDay: '[I går klokka] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14564
            lastWeek: '[Føregåande] dddd [klokka] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14565
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14566
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14567
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14568
            future : 'om %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14569
            past : 'for %s sidan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14570
            s : 'nokre sekund',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14571
            m : 'eit minutt',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14572
            mm : '%d minutt',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14573
            h : 'ein time',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14574
            hh : '%d timar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14575
            d : 'ein dag',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14576
            dd : '%d dagar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14577
            M : 'ein månad',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14578
            MM : '%d månader',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14579
            y : 'eit år',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14580
            yy : '%d år'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14581
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14582
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14583
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14584
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14585
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14586
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14587
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14588
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14589
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14590
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14591
// locale : polish (pl)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14592
// author : Rafal Hirsz : https://github.com/evoL
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14593
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14594
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14595
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14596
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14597
    var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14598
        monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14599
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14600
    function plural(n) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14601
        return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14602
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14603
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14604
    function translate(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14605
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14606
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14607
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14608
            return withoutSuffix ? 'minuta' : 'minutę';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14609
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14610
            return result + (plural(number) ? 'minuty' : 'minut');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14611
        case 'h':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14612
            return withoutSuffix  ? 'godzina'  : 'godzinę';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14613
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14614
            return result + (plural(number) ? 'godziny' : 'godzin');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14615
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14616
            return result + (plural(number) ? 'miesiące' : 'miesięcy');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14617
        case 'yy':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14618
            return result + (plural(number) ? 'lata' : 'lat');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14619
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14620
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14621
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14622
    return moment.defineLocale('pl', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14623
        months : function (momentToFormat, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14624
            if (/D MMMM/.test(format)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14625
                return monthsSubjective[momentToFormat.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14626
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14627
                return monthsNominative[momentToFormat.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14628
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14629
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14630
        monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14631
        weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14632
        weekdaysShort : 'nie_pon_wt_śr_czw_pt_sb'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14633
        weekdaysMin : 'N_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14634
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14635
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14636
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14637
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14638
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14639
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14640
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14641
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14642
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14643
            sameDay: '[Dziś o] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14644
            nextDay: '[Jutro o] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14645
            nextWeek: '[W] dddd [o] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14646
            lastDay: '[Wczoraj o] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14647
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14648
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14649
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14650
                    return '[W zeszłą niedzielę o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14651
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14652
                    return '[W zeszłą środę o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14653
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14654
                    return '[W zeszłą sobotę o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14655
                default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14656
                    return '[W zeszły] dddd [o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14657
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14658
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14659
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14660
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14661
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14662
            future : 'za %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14663
            past : '%s temu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14664
            s : 'kilka sekund',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14665
            m : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14666
            mm : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14667
            h : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14668
            hh : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14669
            d : '1 dzień',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14670
            dd : '%d dni',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14671
            M : 'miesiąc',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14672
            MM : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14673
            y : 'rok',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14674
            yy : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14675
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14676
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14677
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14678
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14679
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14680
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14681
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14682
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14683
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14684
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14685
// locale : brazilian portuguese (pt-br)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14686
// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14687
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14688
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14689
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14690
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14691
    return moment.defineLocale('pt-br', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14692
        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14693
        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14694
        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14695
        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14696
        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14697
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14698
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14699
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14700
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14701
            LL : 'D [de] MMMM [de] YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14702
            LLL : 'D [de] MMMM [de] YYYY [às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14703
            LLLL : 'dddd, D [de] MMMM [de] YYYY [às] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14704
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14705
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14706
            sameDay: '[Hoje às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14707
            nextDay: '[Amanhã às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14708
            nextWeek: 'dddd [às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14709
            lastDay: '[Ontem às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14710
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14711
                return (this.day() === 0 || this.day() === 6) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14712
                    '[Último] dddd [às] LT' : // Saturday + Sunday
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14713
                    '[Última] dddd [às] LT'; // Monday - Friday
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14714
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14715
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14716
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14717
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14718
            future : 'em %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14719
            past : '%s atrás',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14720
            s : 'segundos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14721
            m : 'um minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14722
            mm : '%d minutos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14723
            h : 'uma hora',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14724
            hh : '%d horas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14725
            d : 'um dia',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14726
            dd : '%d dias',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14727
            M : 'um mês',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14728
            MM : '%d meses',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14729
            y : 'um ano',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14730
            yy : '%d anos'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14731
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14732
        ordinalParse: /\d{1,2}º/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14733
        ordinal : '%dº'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14734
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14735
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14736
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14737
// locale : portuguese (pt)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14738
// author : Jefferson : https://github.com/jalex79
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14739
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14740
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14741
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14742
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14743
    return moment.defineLocale('pt', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14744
        months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14745
        monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14746
        weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14747
        weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14748
        weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14749
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14750
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14751
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14752
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14753
            LL : 'D [de] MMMM [de] YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14754
            LLL : 'D [de] MMMM [de] YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14755
            LLLL : 'dddd, D [de] MMMM [de] YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14756
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14757
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14758
            sameDay: '[Hoje às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14759
            nextDay: '[Amanhã às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14760
            nextWeek: 'dddd [às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14761
            lastDay: '[Ontem às] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14762
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14763
                return (this.day() === 0 || this.day() === 6) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14764
                    '[Último] dddd [às] LT' : // Saturday + Sunday
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14765
                    '[Última] dddd [às] LT'; // Monday - Friday
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14766
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14767
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14768
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14769
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14770
            future : 'em %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14771
            past : 'há %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14772
            s : 'segundos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14773
            m : 'um minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14774
            mm : '%d minutos',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14775
            h : 'uma hora',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14776
            hh : '%d horas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14777
            d : 'um dia',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14778
            dd : '%d dias',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14779
            M : 'um mês',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14780
            MM : '%d meses',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14781
            y : 'um ano',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14782
            yy : '%d anos'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14783
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14784
        ordinalParse: /\d{1,2}º/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14785
        ordinal : '%dº',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14786
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14787
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14788
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14789
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14790
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14791
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14792
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14793
// locale : romanian (ro)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14794
// author : Vlad Gurdiga : https://github.com/gurdiga
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14795
// author : Valentin Agachi : https://github.com/avaly
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14796
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14797
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14798
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14799
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14800
    function relativeTimeWithPlural(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14801
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14802
                'mm': 'minute',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14803
                'hh': 'ore',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14804
                'dd': 'zile',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14805
                'MM': 'luni',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14806
                'yy': 'ani'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14807
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14808
            separator = ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14809
        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14810
            separator = ' de ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14811
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14812
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14813
        return number + separator + format[key];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14814
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14815
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14816
    return moment.defineLocale('ro', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14817
        months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14818
        monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14819
        weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14820
        weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14821
        weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14822
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14823
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14824
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14825
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14826
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14827
            LLL : 'D MMMM YYYY H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14828
            LLLL : 'dddd, D MMMM YYYY H:mm'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14829
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14830
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14831
            sameDay: '[azi la] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14832
            nextDay: '[mâine la] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14833
            nextWeek: 'dddd [la] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14834
            lastDay: '[ieri la] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14835
            lastWeek: '[fosta] dddd [la] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14836
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14837
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14838
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14839
            future : 'peste %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14840
            past : '%s în urmă',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14841
            s : 'câteva secunde',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14842
            m : 'un minut',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14843
            mm : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14844
            h : 'o oră',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14845
            hh : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14846
            d : 'o zi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14847
            dd : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14848
            M : 'o lună',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14849
            MM : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14850
            y : 'un an',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14851
            yy : relativeTimeWithPlural
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14852
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14853
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14854
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14855
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14856
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14857
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14858
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14859
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14860
// locale : russian (ru)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14861
// author : Viktorminator : https://github.com/Viktorminator
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14862
// Author : Menelion Elensúle : https://github.com/Oire
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14863
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14864
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14865
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14866
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14867
    function plural(word, num) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14868
        var forms = word.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14869
        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14870
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14871
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14872
    function relativeTimeWithPlural(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14873
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14874
            'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14875
            'hh': 'час_часа_часов',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14876
            'dd': 'день_дня_дней',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14877
            'MM': 'месяц_месяца_месяцев',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14878
            'yy': 'год_года_лет'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14879
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14880
        if (key === 'm') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14881
            return withoutSuffix ? 'минута' : 'минуту';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14882
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14883
        else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14884
            return number + ' ' + plural(format[key], +number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14885
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14886
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14887
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14888
    function monthsCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14889
        var months = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14890
            'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14891
            'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14892
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14893
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14894
        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14895
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14896
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14897
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14898
        return months[nounCase][m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14899
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14900
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14901
    function monthsShortCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14902
        var monthsShort = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14903
            'nominative': 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14904
            'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14905
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14906
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14907
        nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14908
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14909
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14910
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14911
        return monthsShort[nounCase][m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14912
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14913
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14914
    function weekdaysCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14915
        var weekdays = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14916
            'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14917
            'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14918
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14919
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14920
        nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14921
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14922
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14923
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14924
        return weekdays[nounCase][m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14925
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14926
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14927
    return moment.defineLocale('ru', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14928
        months : monthsCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14929
        monthsShort : monthsShortCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14930
        weekdays : weekdaysCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14931
        weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14932
        weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14933
        monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14934
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14935
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14936
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14937
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14938
            LL : 'D MMMM YYYY г.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14939
            LLL : 'D MMMM YYYY г., LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14940
            LLLL : 'dddd, D MMMM YYYY г., LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14941
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14942
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14943
            sameDay: '[Сегодня в] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14944
            nextDay: '[Завтра в] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14945
            lastDay: '[Вчера в] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14946
            nextWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14947
                return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14948
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14949
            lastWeek: function (now) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14950
                if (now.week() !== this.week()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14951
                    switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14952
                    case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14953
                        return '[В прошлое] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14954
                    case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14955
                    case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14956
                    case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14957
                        return '[В прошлый] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14958
                    case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14959
                    case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14960
                    case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14961
                        return '[В прошлую] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14962
                    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14963
                } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14964
                    if (this.day() === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14965
                        return '[Во] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14966
                    } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14967
                        return '[В] dddd [в] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14968
                    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14969
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14970
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14971
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14972
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14973
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14974
            future : 'через %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14975
            past : '%s назад',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14976
            s : 'несколько секунд',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14977
            m : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14978
            mm : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14979
            h : 'час',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14980
            hh : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14981
            d : 'день',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14982
            dd : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14983
            M : 'месяц',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14984
            MM : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14985
            y : 'год',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14986
            yy : relativeTimeWithPlural
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14987
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14988
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14989
        meridiemParse: /ночи|утра|дня|вечера/i,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14990
        isPM : function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14991
            return /^(дня|вечера)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14992
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14993
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14994
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14995
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14996
                return 'ночи';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14997
            } else if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14998
                return 'утра';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 14999
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15000
                return 'дня';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15001
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15002
                return 'вечера';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15003
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15004
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15005
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15006
        ordinalParse: /\d{1,2}-(й|го|я)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15007
        ordinal: function (number, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15008
            switch (period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15009
            case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15010
            case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15011
            case 'DDD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15012
                return number + '-й';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15013
            case 'D':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15014
                return number + '-го';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15015
            case 'w':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15016
            case 'W':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15017
                return number + '-я';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15018
            default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15019
                return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15020
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15021
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15022
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15023
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15024
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15025
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15026
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15027
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15028
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15029
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15030
// locale : slovak (sk)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15031
// author : Martin Minka : https://github.com/k2s
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15032
// based on work of petrbela : https://github.com/petrbela
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15033
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15034
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15035
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15036
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15037
    var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15038
        monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15039
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15040
    function plural(n) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15041
        return (n > 1) && (n < 5);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15042
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15043
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15044
    function translate(number, withoutSuffix, key, isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15045
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15046
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15047
        case 's':  // a few seconds / in a few seconds / a few seconds ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15048
            return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15049
        case 'm':  // a minute / in a minute / a minute ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15050
            return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15051
        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15052
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15053
                return result + (plural(number) ? 'minúty' : 'minút');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15054
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15055
                return result + 'minútami';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15056
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15057
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15058
        case 'h':  // an hour / in an hour / an hour ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15059
            return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15060
        case 'hh': // 9 hours / in 9 hours / 9 hours ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15061
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15062
                return result + (plural(number) ? 'hodiny' : 'hodín');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15063
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15064
                return result + 'hodinami';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15065
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15066
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15067
        case 'd':  // a day / in a day / a day ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15068
            return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15069
        case 'dd': // 9 days / in 9 days / 9 days ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15070
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15071
                return result + (plural(number) ? 'dni' : 'dní');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15072
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15073
                return result + 'dňami';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15074
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15075
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15076
        case 'M':  // a month / in a month / a month ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15077
            return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15078
        case 'MM': // 9 months / in 9 months / 9 months ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15079
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15080
                return result + (plural(number) ? 'mesiace' : 'mesiacov');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15081
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15082
                return result + 'mesiacmi';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15083
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15084
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15085
        case 'y':  // a year / in a year / a year ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15086
            return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15087
        case 'yy': // 9 years / in 9 years / 9 years ago
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15088
            if (withoutSuffix || isFuture) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15089
                return result + (plural(number) ? 'roky' : 'rokov');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15090
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15091
                return result + 'rokmi';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15092
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15093
            break;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15094
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15095
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15096
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15097
    return moment.defineLocale('sk', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15098
        months : months,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15099
        monthsShort : monthsShort,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15100
        monthsParse : (function (months, monthsShort) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15101
            var i, _monthsParse = [];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15102
            for (i = 0; i < 12; i++) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15103
                // use custom parser to solve problem with July (červenec)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15104
                _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15105
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15106
            return _monthsParse;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15107
        }(months, monthsShort)),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15108
        weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15109
        weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15110
        weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15111
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15112
            LT: 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15113
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15114
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15115
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15116
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15117
            LLLL : 'dddd D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15118
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15119
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15120
            sameDay: '[dnes o] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15121
            nextDay: '[zajtra o] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15122
            nextWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15123
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15124
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15125
                    return '[v nedeľu o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15126
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15127
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15128
                    return '[v] dddd [o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15129
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15130
                    return '[v stredu o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15131
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15132
                    return '[vo štvrtok o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15133
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15134
                    return '[v piatok o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15135
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15136
                    return '[v sobotu o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15137
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15138
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15139
            lastDay: '[včera o] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15140
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15141
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15142
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15143
                    return '[minulú nedeľu o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15144
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15145
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15146
                    return '[minulý] dddd [o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15147
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15148
                    return '[minulú stredu o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15149
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15150
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15151
                    return '[minulý] dddd [o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15152
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15153
                    return '[minulú sobotu o] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15154
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15155
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15156
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15157
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15158
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15159
            future : 'za %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15160
            past : 'pred %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15161
            s : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15162
            m : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15163
            mm : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15164
            h : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15165
            hh : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15166
            d : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15167
            dd : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15168
            M : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15169
            MM : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15170
            y : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15171
            yy : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15172
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15173
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15174
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15175
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15176
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15177
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15178
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15179
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15180
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15181
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15182
// locale : slovenian (sl)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15183
// author : Robert Sedovšek : https://github.com/sedovsek
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15184
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15185
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15186
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15187
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15188
    function translate(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15189
        var result = number + ' ';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15190
        switch (key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15191
        case 'm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15192
            return withoutSuffix ? 'ena minuta' : 'eno minuto';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15193
        case 'mm':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15194
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15195
                result += 'minuta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15196
            } else if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15197
                result += 'minuti';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15198
            } else if (number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15199
                result += 'minute';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15200
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15201
                result += 'minut';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15202
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15203
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15204
        case 'h':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15205
            return withoutSuffix ? 'ena ura' : 'eno uro';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15206
        case 'hh':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15207
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15208
                result += 'ura';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15209
            } else if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15210
                result += 'uri';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15211
            } else if (number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15212
                result += 'ure';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15213
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15214
                result += 'ur';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15215
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15216
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15217
        case 'dd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15218
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15219
                result += 'dan';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15220
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15221
                result += 'dni';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15222
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15223
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15224
        case 'MM':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15225
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15226
                result += 'mesec';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15227
            } else if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15228
                result += 'meseca';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15229
            } else if (number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15230
                result += 'mesece';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15231
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15232
                result += 'mesecev';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15233
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15234
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15235
        case 'yy':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15236
            if (number === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15237
                result += 'leto';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15238
            } else if (number === 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15239
                result += 'leti';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15240
            } else if (number === 3 || number === 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15241
                result += 'leta';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15242
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15243
                result += 'let';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15244
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15245
            return result;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15246
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15247
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15248
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15249
    return moment.defineLocale('sl', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15250
        months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15251
        monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15252
        weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15253
        weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15254
        weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15255
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15256
            LT : 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15257
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15258
            L : 'DD. MM. YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15259
            LL : 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15260
            LLL : 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15261
            LLLL : 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15262
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15263
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15264
            sameDay  : '[danes ob] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15265
            nextDay  : '[jutri ob] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15266
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15267
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15268
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15269
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15270
                    return '[v] [nedeljo] [ob] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15271
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15272
                    return '[v] [sredo] [ob] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15273
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15274
                    return '[v] [soboto] [ob] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15275
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15276
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15277
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15278
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15279
                    return '[v] dddd [ob] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15280
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15281
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15282
            lastDay  : '[včeraj ob] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15283
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15284
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15285
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15286
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15287
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15288
                    return '[prejšnja] dddd [ob] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15289
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15290
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15291
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15292
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15293
                    return '[prejšnji] dddd [ob] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15294
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15295
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15296
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15297
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15298
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15299
            future : 'čez %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15300
            past   : '%s nazaj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15301
            s      : 'nekaj sekund',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15302
            m      : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15303
            mm     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15304
            h      : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15305
            hh     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15306
            d      : 'en dan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15307
            dd     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15308
            M      : 'en mesec',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15309
            MM     : translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15310
            y      : 'eno leto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15311
            yy     : translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15312
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15313
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15314
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15315
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15316
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15317
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15318
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15319
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15320
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15321
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15322
// locale : Albanian (sq)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15323
// author : Flakërim Ismani : https://github.com/flakerimi
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15324
// author: Menelion Elensúle: https://github.com/Oire (tests)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15325
// author : Oerd Cukalla : https://github.com/oerd (fixes)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15326
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15327
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15328
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15329
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15330
    return moment.defineLocale('sq', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15331
        months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15332
        monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15333
        weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15334
        weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15335
        weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15336
        meridiemParse: /PD|MD/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15337
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15338
            return input.charAt(0) === 'M';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15339
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15340
        meridiem : function (hours, minutes, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15341
            return hours < 12 ? 'PD' : 'MD';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15342
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15343
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15344
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15345
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15346
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15347
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15348
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15349
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15350
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15351
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15352
            sameDay : '[Sot në] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15353
            nextDay : '[Nesër në] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15354
            nextWeek : 'dddd [në] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15355
            lastDay : '[Dje në] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15356
            lastWeek : 'dddd [e kaluar në] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15357
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15358
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15359
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15360
            future : 'në %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15361
            past : '%s më parë',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15362
            s : 'disa sekonda',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15363
            m : 'një minutë',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15364
            mm : '%d minuta',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15365
            h : 'një orë',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15366
            hh : '%d orë',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15367
            d : 'një ditë',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15368
            dd : '%d ditë',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15369
            M : 'një muaj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15370
            MM : '%d muaj',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15371
            y : 'një vit',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15372
            yy : '%d vite'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15373
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15374
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15375
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15376
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15377
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15378
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15379
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15380
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15381
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15382
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15383
// locale : Serbian-cyrillic (sr-cyrl)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15384
// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15385
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15386
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15387
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15388
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15389
    var translator = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15390
        words: { //Different grammatical cases
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15391
            m: ['један минут', 'једне минуте'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15392
            mm: ['минут', 'минуте', 'минута'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15393
            h: ['један сат', 'једног сата'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15394
            hh: ['сат', 'сата', 'сати'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15395
            dd: ['дан', 'дана', 'дана'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15396
            MM: ['месец', 'месеца', 'месеци'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15397
            yy: ['година', 'године', 'година']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15398
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15399
        correctGrammaticalCase: function (number, wordKey) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15400
            return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15401
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15402
        translate: function (number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15403
            var wordKey = translator.words[key];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15404
            if (key.length === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15405
                return withoutSuffix ? wordKey[0] : wordKey[1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15406
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15407
                return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15408
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15409
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15410
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15411
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15412
    return moment.defineLocale('sr-cyrl', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15413
        months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15414
        monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15415
        weekdays: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15416
        weekdaysShort: ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15417
        weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15418
        longDateFormat: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15419
            LT: 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15420
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15421
            L: 'DD. MM. YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15422
            LL: 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15423
            LLL: 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15424
            LLLL: 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15425
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15426
        calendar: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15427
            sameDay: '[данас у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15428
            nextDay: '[сутра у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15429
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15430
            nextWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15431
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15432
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15433
                    return '[у] [недељу] [у] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15434
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15435
                    return '[у] [среду] [у] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15436
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15437
                    return '[у] [суботу] [у] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15438
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15439
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15440
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15441
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15442
                    return '[у] dddd [у] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15443
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15444
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15445
            lastDay  : '[јуче у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15446
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15447
                var lastWeekDays = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15448
                    '[прошле] [недеље] [у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15449
                    '[прошлог] [понедељка] [у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15450
                    '[прошлог] [уторка] [у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15451
                    '[прошле] [среде] [у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15452
                    '[прошлог] [четвртка] [у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15453
                    '[прошлог] [петка] [у] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15454
                    '[прошле] [суботе] [у] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15455
                ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15456
                return lastWeekDays[this.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15457
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15458
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15459
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15460
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15461
            future : 'за %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15462
            past   : 'пре %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15463
            s      : 'неколико секунди',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15464
            m      : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15465
            mm     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15466
            h      : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15467
            hh     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15468
            d      : 'дан',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15469
            dd     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15470
            M      : 'месец',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15471
            MM     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15472
            y      : 'годину',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15473
            yy     : translator.translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15474
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15475
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15476
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15477
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15478
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15479
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15480
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15481
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15482
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15483
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15484
// locale : Serbian-latin (sr)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15485
// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15486
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15487
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15488
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15489
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15490
    var translator = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15491
        words: { //Different grammatical cases
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15492
            m: ['jedan minut', 'jedne minute'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15493
            mm: ['minut', 'minute', 'minuta'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15494
            h: ['jedan sat', 'jednog sata'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15495
            hh: ['sat', 'sata', 'sati'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15496
            dd: ['dan', 'dana', 'dana'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15497
            MM: ['mesec', 'meseca', 'meseci'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15498
            yy: ['godina', 'godine', 'godina']
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15499
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15500
        correctGrammaticalCase: function (number, wordKey) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15501
            return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15502
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15503
        translate: function (number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15504
            var wordKey = translator.words[key];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15505
            if (key.length === 1) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15506
                return withoutSuffix ? wordKey[0] : wordKey[1];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15507
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15508
                return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15509
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15510
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15511
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15512
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15513
    return moment.defineLocale('sr', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15514
        months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15515
        monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15516
        weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15517
        weekdaysShort: ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15518
        weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15519
        longDateFormat: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15520
            LT: 'H:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15521
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15522
            L: 'DD. MM. YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15523
            LL: 'D. MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15524
            LLL: 'D. MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15525
            LLLL: 'dddd, D. MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15526
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15527
        calendar: {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15528
            sameDay: '[danas u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15529
            nextDay: '[sutra u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15530
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15531
            nextWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15532
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15533
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15534
                    return '[u] [nedelju] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15535
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15536
                    return '[u] [sredu] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15537
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15538
                    return '[u] [subotu] [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15539
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15540
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15541
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15542
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15543
                    return '[u] dddd [u] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15544
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15545
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15546
            lastDay  : '[juče u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15547
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15548
                var lastWeekDays = [
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15549
                    '[prošle] [nedelje] [u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15550
                    '[prošlog] [ponedeljka] [u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15551
                    '[prošlog] [utorka] [u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15552
                    '[prošle] [srede] [u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15553
                    '[prošlog] [četvrtka] [u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15554
                    '[prošlog] [petka] [u] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15555
                    '[prošle] [subote] [u] LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15556
                ];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15557
                return lastWeekDays[this.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15558
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15559
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15560
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15561
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15562
            future : 'za %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15563
            past   : 'pre %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15564
            s      : 'nekoliko sekundi',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15565
            m      : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15566
            mm     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15567
            h      : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15568
            hh     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15569
            d      : 'dan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15570
            dd     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15571
            M      : 'mesec',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15572
            MM     : translator.translate,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15573
            y      : 'godinu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15574
            yy     : translator.translate
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15575
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15576
        ordinalParse: /\d{1,2}\./,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15577
        ordinal : '%d.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15578
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15579
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15580
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15581
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15582
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15583
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15584
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15585
// locale : swedish (sv)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15586
// author : Jens Alm : https://github.com/ulmus
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15587
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15588
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15589
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15590
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15591
    return moment.defineLocale('sv', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15592
        months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15593
        monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15594
        weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15595
        weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15596
        weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15597
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15598
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15599
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15600
            L : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15601
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15602
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15603
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15604
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15605
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15606
            sameDay: '[Idag] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15607
            nextDay: '[Imorgon] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15608
            lastDay: '[Igår] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15609
            nextWeek: 'dddd LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15610
            lastWeek: '[Förra] dddd[en] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15611
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15612
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15613
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15614
            future : 'om %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15615
            past : 'för %s sedan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15616
            s : 'några sekunder',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15617
            m : 'en minut',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15618
            mm : '%d minuter',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15619
            h : 'en timme',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15620
            hh : '%d timmar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15621
            d : 'en dag',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15622
            dd : '%d dagar',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15623
            M : 'en månad',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15624
            MM : '%d månader',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15625
            y : 'ett år',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15626
            yy : '%d år'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15627
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15628
        ordinalParse: /\d{1,2}(e|a)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15629
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15630
            var b = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15631
                output = (~~(number % 100 / 10) === 1) ? 'e' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15632
                (b === 1) ? 'a' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15633
                (b === 2) ? 'a' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15634
                (b === 3) ? 'e' : 'e';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15635
            return number + output;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15636
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15637
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15638
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15639
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15640
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15641
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15642
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15643
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15644
// locale : tamil (ta)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15645
// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15646
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15647
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15648
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15649
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15650
    /*var symbolMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15651
            '1': '௧',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15652
            '2': '௨',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15653
            '3': '௩',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15654
            '4': '௪',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15655
            '5': '௫',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15656
            '6': '௬',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15657
            '7': '௭',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15658
            '8': '௮',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15659
            '9': '௯',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15660
            '0': '௦'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15661
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15662
        numberMap = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15663
            '௧': '1',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15664
            '௨': '2',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15665
            '௩': '3',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15666
            '௪': '4',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15667
            '௫': '5',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15668
            '௬': '6',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15669
            '௭': '7',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15670
            '௮': '8',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15671
            '௯': '9',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15672
            '௦': '0'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15673
        }; */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15674
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15675
    return moment.defineLocale('ta', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15676
        months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15677
        monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15678
        weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15679
        weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15680
        weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15681
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15682
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15683
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15684
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15685
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15686
            LLL : 'D MMMM YYYY, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15687
            LLLL : 'dddd, D MMMM YYYY, LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15688
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15689
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15690
            sameDay : '[இன்று] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15691
            nextDay : '[நாளை] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15692
            nextWeek : 'dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15693
            lastDay : '[நேற்று] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15694
            lastWeek : '[கடந்த வாரம்] dddd, LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15695
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15696
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15697
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15698
            future : '%s இல்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15699
            past : '%s முன்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15700
            s : 'ஒரு சில விநாடிகள்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15701
            m : 'ஒரு நிமிடம்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15702
            mm : '%d நிமிடங்கள்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15703
            h : 'ஒரு மணி நேரம்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15704
            hh : '%d மணி நேரம்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15705
            d : 'ஒரு நாள்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15706
            dd : '%d நாட்கள்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15707
            M : 'ஒரு மாதம்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15708
            MM : '%d மாதங்கள்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15709
            y : 'ஒரு வருடம்',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15710
            yy : '%d ஆண்டுகள்'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15711
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15712
/*        preparse: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15713
            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15714
                return numberMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15715
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15716
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15717
        postformat: function (string) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15718
            return string.replace(/\d/g, function (match) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15719
                return symbolMap[match];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15720
            });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15721
        },*/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15722
        ordinalParse: /\d{1,2}வது/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15723
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15724
            return number + 'வது';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15725
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15726
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15727
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15728
        // refer http://ta.wikipedia.org/s/1er1
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15729
        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15730
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15731
            if (hour < 2) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15732
                return ' யாமம்';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15733
            } else if (hour < 6) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15734
                return ' வைகறை';  // வைகறை
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15735
            } else if (hour < 10) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15736
                return ' காலை'; // காலை
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15737
            } else if (hour < 14) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15738
                return ' நண்பகல்'; // நண்பகல்
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15739
            } else if (hour < 18) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15740
                return ' எற்பாடு'; // எற்பாடு
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15741
            } else if (hour < 22) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15742
                return ' மாலை'; // மாலை
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15743
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15744
                return ' யாமம்';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15745
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15746
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15747
        meridiemHour : function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15748
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15749
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15750
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15751
            if (meridiem === 'யாமம்') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15752
                return hour < 2 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15753
            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15754
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15755
            } else if (meridiem === 'நண்பகல்') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15756
                return hour >= 10 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15757
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15758
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15759
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15760
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15761
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15762
            dow : 0, // Sunday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15763
            doy : 6  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15764
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15765
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15766
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15767
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15768
// locale : thai (th)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15769
// author : Kridsada Thanabulpong : https://github.com/sirn
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15770
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15771
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15772
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15773
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15774
    return moment.defineLocale('th', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15775
        months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15776
        monthsShort : 'มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15777
        weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15778
        weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15779
        weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15780
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15781
            LT : 'H นาฬิกา m นาที',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15782
            LTS : 'LT s วินาที',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15783
            L : 'YYYY/MM/DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15784
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15785
            LLL : 'D MMMM YYYY เวลา LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15786
            LLLL : 'วันddddที่ D MMMM YYYY เวลา LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15787
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15788
        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15789
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15790
            return input === 'หลังเที่ยง';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15791
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15792
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15793
            if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15794
                return 'ก่อนเที่ยง';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15795
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15796
                return 'หลังเที่ยง';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15797
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15798
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15799
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15800
            sameDay : '[วันนี้ เวลา] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15801
            nextDay : '[พรุ่งนี้ เวลา] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15802
            nextWeek : 'dddd[หน้า เวลา] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15803
            lastDay : '[เมื่อวานนี้ เวลา] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15804
            lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15805
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15806
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15807
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15808
            future : 'อีก %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15809
            past : '%sที่แล้ว',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15810
            s : 'ไม่กี่วินาที',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15811
            m : '1 นาที',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15812
            mm : '%d นาที',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15813
            h : '1 ชั่วโมง',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15814
            hh : '%d ชั่วโมง',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15815
            d : '1 วัน',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15816
            dd : '%d วัน',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15817
            M : '1 เดือน',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15818
            MM : '%d เดือน',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15819
            y : '1 ปี',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15820
            yy : '%d ปี'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15821
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15822
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15823
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15824
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15825
// locale : Tagalog/Filipino (tl-ph)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15826
// author : Dan Hagman
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15827
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15828
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15829
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15830
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15831
    return moment.defineLocale('tl-ph', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15832
        months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15833
        monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15834
        weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15835
        weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15836
        weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15837
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15838
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15839
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15840
            L : 'MM/D/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15841
            LL : 'MMMM D, YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15842
            LLL : 'MMMM D, YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15843
            LLLL : 'dddd, MMMM DD, YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15844
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15845
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15846
            sameDay: '[Ngayon sa] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15847
            nextDay: '[Bukas sa] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15848
            nextWeek: 'dddd [sa] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15849
            lastDay: '[Kahapon sa] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15850
            lastWeek: 'dddd [huling linggo] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15851
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15852
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15853
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15854
            future : 'sa loob ng %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15855
            past : '%s ang nakalipas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15856
            s : 'ilang segundo',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15857
            m : 'isang minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15858
            mm : '%d minuto',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15859
            h : 'isang oras',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15860
            hh : '%d oras',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15861
            d : 'isang araw',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15862
            dd : '%d araw',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15863
            M : 'isang buwan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15864
            MM : '%d buwan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15865
            y : 'isang taon',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15866
            yy : '%d taon'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15867
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15868
        ordinalParse: /\d{1,2}/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15869
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15870
            return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15871
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15872
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15873
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15874
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15875
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15876
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15877
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15878
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15879
// locale : turkish (tr)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15880
// authors : Erhan Gundogan : https://github.com/erhangundogan,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15881
//           Burak Yiğit Kaya: https://github.com/BYK
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15882
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15883
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15884
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15885
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15886
    var suffixes = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15887
        1: '\'inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15888
        5: '\'inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15889
        8: '\'inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15890
        70: '\'inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15891
        80: '\'inci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15892
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15893
        2: '\'nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15894
        7: '\'nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15895
        20: '\'nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15896
        50: '\'nci',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15897
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15898
        3: '\'üncü',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15899
        4: '\'üncü',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15900
        100: '\'üncü',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15901
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15902
        6: '\'ncı',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15903
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15904
        9: '\'uncu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15905
        10: '\'uncu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15906
        30: '\'uncu',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15907
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15908
        60: '\'ıncı',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15909
        90: '\'ıncı'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15910
    };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15911
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15912
    return moment.defineLocale('tr', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15913
        months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15914
        monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15915
        weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15916
        weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15917
        weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15918
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15919
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15920
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15921
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15922
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15923
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15924
            LLLL : 'dddd, D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15925
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15926
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15927
            sameDay : '[bugün saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15928
            nextDay : '[yarın saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15929
            nextWeek : '[haftaya] dddd [saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15930
            lastDay : '[dün] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15931
            lastWeek : '[geçen hafta] dddd [saat] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15932
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15933
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15934
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15935
            future : '%s sonra',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15936
            past : '%s önce',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15937
            s : 'birkaç saniye',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15938
            m : 'bir dakika',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15939
            mm : '%d dakika',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15940
            h : 'bir saat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15941
            hh : '%d saat',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15942
            d : 'bir gün',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15943
            dd : '%d gün',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15944
            M : 'bir ay',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15945
            MM : '%d ay',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15946
            y : 'bir yıl',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15947
            yy : '%d yıl'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15948
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15949
        ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15950
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15951
            if (number === 0) {  // special case for zero
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15952
                return number + '\'ıncı';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15953
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15954
            var a = number % 10,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15955
                b = number % 100 - a,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15956
                c = number >= 100 ? 100 : null;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15957
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15958
            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15959
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15960
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15961
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15962
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15963
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15964
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15965
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15966
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15967
// locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15968
// author : Abdel Said : https://github.com/abdelsaid
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15969
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15970
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15971
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15972
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15973
    return moment.defineLocale('tzm-latn', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15974
        months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15975
        monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15976
        weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15977
        weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15978
        weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15979
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15980
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15981
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15982
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15983
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15984
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15985
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15986
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15987
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15988
            sameDay: '[asdkh g] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15989
            nextDay: '[aska g] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15990
            nextWeek: 'dddd [g] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15991
            lastDay: '[assant g] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15992
            lastWeek: 'dddd [g] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15993
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15994
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15995
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15996
            future : 'dadkh s yan %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15997
            past : 'yan %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15998
            s : 'imik',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 15999
            m : 'minuḍ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16000
            mm : '%d minuḍ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16001
            h : 'saɛa',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16002
            hh : '%d tassaɛin',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16003
            d : 'ass',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16004
            dd : '%d ossan',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16005
            M : 'ayowr',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16006
            MM : '%d iyyirn',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16007
            y : 'asgas',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16008
            yy : '%d isgasn'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16009
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16010
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16011
            dow : 6, // Saturday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16012
            doy : 12  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16013
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16014
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16015
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16016
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16017
// locale : Morocco Central Atlas Tamaziɣt (tzm)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16018
// author : Abdel Said : https://github.com/abdelsaid
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16019
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16020
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16021
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16022
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16023
    return moment.defineLocale('tzm', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16024
        months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16025
        monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16026
        weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16027
        weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16028
        weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16029
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16030
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16031
            LTS: 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16032
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16033
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16034
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16035
            LLLL : 'dddd D MMMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16036
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16037
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16038
            sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16039
            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16040
            nextWeek: 'dddd [ⴴ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16041
            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16042
            lastWeek: 'dddd [ⴴ] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16043
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16044
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16045
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16046
            future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16047
            past : 'ⵢⴰⵏ %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16048
            s : 'ⵉⵎⵉⴽ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16049
            m : 'ⵎⵉⵏⵓⴺ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16050
            mm : '%d ⵎⵉⵏⵓⴺ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16051
            h : 'ⵙⴰⵄⴰ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16052
            hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16053
            d : 'ⴰⵙⵙ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16054
            dd : '%d oⵙⵙⴰⵏ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16055
            M : 'ⴰⵢoⵓⵔ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16056
            MM : '%d ⵉⵢⵢⵉⵔⵏ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16057
            y : 'ⴰⵙⴳⴰⵙ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16058
            yy : '%d ⵉⵙⴳⴰⵙⵏ'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16059
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16060
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16061
            dow : 6, // Saturday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16062
            doy : 12  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16063
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16064
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16065
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16066
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16067
// locale : ukrainian (uk)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16068
// author : zemlanin : https://github.com/zemlanin
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16069
// Author : Menelion Elensúle : https://github.com/Oire
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16070
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16071
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16072
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16073
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16074
    function plural(word, num) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16075
        var forms = word.split('_');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16076
        return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16077
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16078
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16079
    function relativeTimeWithPlural(number, withoutSuffix, key) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16080
        var format = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16081
            'mm': 'хвилина_хвилини_хвилин',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16082
            'hh': 'година_години_годин',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16083
            'dd': 'день_дні_днів',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16084
            'MM': 'місяць_місяці_місяців',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16085
            'yy': 'рік_роки_років'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16086
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16087
        if (key === 'm') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16088
            return withoutSuffix ? 'хвилина' : 'хвилину';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16089
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16090
        else if (key === 'h') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16091
            return withoutSuffix ? 'година' : 'годину';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16092
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16093
        else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16094
            return number + ' ' + plural(format[key], +number);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16095
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16096
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16097
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16098
    function monthsCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16099
        var months = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16100
            'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16101
            'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16102
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16103
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16104
        nounCase = (/D[oD]? *MMMM?/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16105
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16106
            'nominative';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16107
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16108
        return months[nounCase][m.month()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16109
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16110
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16111
    function weekdaysCaseReplace(m, format) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16112
        var weekdays = {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16113
            'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16114
            'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16115
            'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16116
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16117
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16118
        nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16119
            'accusative' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16120
            ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16121
                'genitive' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16122
                'nominative');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16123
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16124
        return weekdays[nounCase][m.day()];
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16125
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16126
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16127
    function processHoursFunction(str) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16128
        return function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16129
            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16130
        };
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16131
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16132
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16133
    return moment.defineLocale('uk', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16134
        months : monthsCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16135
        monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16136
        weekdays : weekdaysCaseReplace,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16137
        weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16138
        weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16139
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16140
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16141
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16142
            L : 'DD.MM.YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16143
            LL : 'D MMMM YYYY р.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16144
            LLL : 'D MMMM YYYY р., LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16145
            LLLL : 'dddd, D MMMM YYYY р., LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16146
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16147
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16148
            sameDay: processHoursFunction('[Сьогодні '),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16149
            nextDay: processHoursFunction('[Завтра '),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16150
            lastDay: processHoursFunction('[Вчора '),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16151
            nextWeek: processHoursFunction('[У] dddd ['),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16152
            lastWeek: function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16153
                switch (this.day()) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16154
                case 0:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16155
                case 3:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16156
                case 5:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16157
                case 6:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16158
                    return processHoursFunction('[Минулої] dddd [').call(this);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16159
                case 1:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16160
                case 2:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16161
                case 4:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16162
                    return processHoursFunction('[Минулого] dddd [').call(this);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16163
                }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16164
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16165
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16166
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16167
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16168
            future : 'за %s',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16169
            past : '%s тому',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16170
            s : 'декілька секунд',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16171
            m : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16172
            mm : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16173
            h : 'годину',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16174
            hh : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16175
            d : 'день',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16176
            dd : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16177
            M : 'місяць',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16178
            MM : relativeTimeWithPlural,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16179
            y : 'рік',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16180
            yy : relativeTimeWithPlural
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16181
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16182
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16183
        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16184
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16185
        meridiemParse: /ночі|ранку|дня|вечора/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16186
        isPM: function (input) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16187
            return /^(дня|вечора)$/.test(input);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16188
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16189
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16190
            if (hour < 4) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16191
                return 'ночі';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16192
            } else if (hour < 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16193
                return 'ранку';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16194
            } else if (hour < 17) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16195
                return 'дня';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16196
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16197
                return 'вечора';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16198
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16199
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16200
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16201
        ordinalParse: /\d{1,2}-(й|го)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16202
        ordinal: function (number, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16203
            switch (period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16204
            case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16205
            case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16206
            case 'DDD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16207
            case 'w':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16208
            case 'W':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16209
                return number + '-й';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16210
            case 'D':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16211
                return number + '-го';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16212
            default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16213
                return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16214
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16215
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16216
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16217
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16218
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16219
            doy : 7  // The week that contains Jan 1st is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16220
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16221
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16222
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16223
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16224
// locale : uzbek (uz)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16225
// author : Sardor Muminov : https://github.com/muminoff
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16226
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16227
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16228
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16229
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16230
    return moment.defineLocale('uz', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16231
        months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16232
        monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16233
        weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16234
        weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16235
        weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16236
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16237
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16238
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16239
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16240
            LL : 'D MMMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16241
            LLL : 'D MMMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16242
            LLLL : 'D MMMM YYYY, dddd LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16243
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16244
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16245
            sameDay : '[Бугун соат] LT [да]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16246
            nextDay : '[Эртага] LT [да]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16247
            nextWeek : 'dddd [куни соат] LT [да]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16248
            lastDay : '[Кеча соат] LT [да]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16249
            lastWeek : '[Утган] dddd [куни соат] LT [да]',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16250
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16251
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16252
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16253
            future : 'Якин %s ичида',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16254
            past : 'Бир неча %s олдин',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16255
            s : 'фурсат',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16256
            m : 'бир дакика',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16257
            mm : '%d дакика',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16258
            h : 'бир соат',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16259
            hh : '%d соат',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16260
            d : 'бир кун',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16261
            dd : '%d кун',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16262
            M : 'бир ой',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16263
            MM : '%d ой',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16264
            y : 'бир йил',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16265
            yy : '%d йил'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16266
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16267
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16268
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16269
            doy : 7  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16270
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16271
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16272
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16273
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16274
// locale : vietnamese (vi)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16275
// author : Bang Nguyen : https://github.com/bangnk
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16276
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16277
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16278
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16279
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16280
    return moment.defineLocale('vi', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16281
        months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16282
        monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16283
        weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16284
        weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16285
        weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16286
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16287
            LT : 'HH:mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16288
            LTS : 'LT:ss',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16289
            L : 'DD/MM/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16290
            LL : 'D MMMM [năm] YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16291
            LLL : 'D MMMM [năm] YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16292
            LLLL : 'dddd, D MMMM [năm] YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16293
            l : 'DD/M/YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16294
            ll : 'D MMM YYYY',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16295
            lll : 'D MMM YYYY LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16296
            llll : 'ddd, D MMM YYYY LT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16297
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16298
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16299
            sameDay: '[Hôm nay lúc] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16300
            nextDay: '[Ngày mai lúc] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16301
            nextWeek: 'dddd [tuần tới lúc] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16302
            lastDay: '[Hôm qua lúc] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16303
            lastWeek: 'dddd [tuần rồi lúc] LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16304
            sameElse: 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16305
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16306
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16307
            future : '%s tới',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16308
            past : '%s trước',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16309
            s : 'vài giây',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16310
            m : 'một phút',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16311
            mm : '%d phút',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16312
            h : 'một giờ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16313
            hh : '%d giờ',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16314
            d : 'một ngày',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16315
            dd : '%d ngày',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16316
            M : 'một tháng',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16317
            MM : '%d tháng',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16318
            y : 'một năm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16319
            yy : '%d năm'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16320
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16321
        ordinalParse: /\d{1,2}/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16322
        ordinal : function (number) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16323
            return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16324
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16325
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16326
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16327
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16328
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16329
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16330
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16331
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16332
// locale : chinese (zh-cn)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16333
// author : suupic : https://github.com/suupic
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16334
// author : Zeno Zeng : https://github.com/zenozeng
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16335
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16336
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16337
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16338
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16339
    return moment.defineLocale('zh-cn', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16340
        months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16341
        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16342
        weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16343
        weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16344
        weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16345
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16346
            LT : 'Ah点mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16347
            LTS : 'Ah点m分s秒',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16348
            L : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16349
            LL : 'YYYY年MMMD日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16350
            LLL : 'YYYY年MMMD日LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16351
            LLLL : 'YYYY年MMMD日ddddLT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16352
            l : 'YYYY-MM-DD',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16353
            ll : 'YYYY年MMMD日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16354
            lll : 'YYYY年MMMD日LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16355
            llll : 'YYYY年MMMD日ddddLT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16356
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16357
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16358
        meridiemHour: function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16359
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16360
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16361
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16362
            if (meridiem === '凌晨' || meridiem === '早上' ||
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16363
                    meridiem === '上午') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16364
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16365
            } else if (meridiem === '下午' || meridiem === '晚上') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16366
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16367
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16368
                // '中午'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16369
                return hour >= 11 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16370
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16371
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16372
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16373
            var hm = hour * 100 + minute;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16374
            if (hm < 600) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16375
                return '凌晨';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16376
            } else if (hm < 900) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16377
                return '早上';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16378
            } else if (hm < 1130) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16379
                return '上午';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16380
            } else if (hm < 1230) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16381
                return '中午';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16382
            } else if (hm < 1800) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16383
                return '下午';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16384
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16385
                return '晚上';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16386
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16387
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16388
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16389
            sameDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16390
                return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16391
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16392
            nextDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16393
                return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16394
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16395
            lastDay : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16396
                return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16397
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16398
            nextWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16399
                var startOfWeek, prefix;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16400
                startOfWeek = moment().startOf('week');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16401
                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16402
                return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16403
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16404
            lastWeek : function () {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16405
                var startOfWeek, prefix;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16406
                startOfWeek = moment().startOf('week');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16407
                prefix = this.unix() < startOfWeek.unix()  ? '[上]' : '[本]';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16408
                return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16409
            },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16410
            sameElse : 'LL'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16411
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16412
        ordinalParse: /\d{1,2}(日|月|周)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16413
        ordinal : function (number, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16414
            switch (period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16415
            case 'd':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16416
            case 'D':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16417
            case 'DDD':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16418
                return number + '日';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16419
            case 'M':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16420
                return number + '月';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16421
            case 'w':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16422
            case 'W':
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16423
                return number + '周';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16424
            default:
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16425
                return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16426
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16427
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16428
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16429
            future : '%s内',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16430
            past : '%s前',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16431
            s : '几秒',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16432
            m : '1分钟',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16433
            mm : '%d分钟',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16434
            h : '1小时',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16435
            hh : '%d小时',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16436
            d : '1天',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16437
            dd : '%d天',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16438
            M : '1个月',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16439
            MM : '%d个月',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16440
            y : '1年',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16441
            yy : '%d年'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16442
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16443
        week : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16444
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16445
            dow : 1, // Monday is the first day of the week.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16446
            doy : 4  // The week that contains Jan 4th is the first week of the year.
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16447
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16448
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16449
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16450
// moment.js locale configuration
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16451
// locale : traditional chinese (zh-tw)
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16452
// author : Ben : https://github.com/ben-lin
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16453
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16454
(function (factory) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16455
    factory(moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16456
}(function (moment) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16457
    return moment.defineLocale('zh-tw', {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16458
        months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16459
        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16460
        weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16461
        weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16462
        weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16463
        longDateFormat : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16464
            LT : 'Ah點mm',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16465
            LTS : 'Ah點m分s秒',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16466
            L : 'YYYY年MMMD日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16467
            LL : 'YYYY年MMMD日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16468
            LLL : 'YYYY年MMMD日LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16469
            LLLL : 'YYYY年MMMD日ddddLT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16470
            l : 'YYYY年MMMD日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16471
            ll : 'YYYY年MMMD日',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16472
            lll : 'YYYY年MMMD日LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16473
            llll : 'YYYY年MMMD日ddddLT'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16474
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16475
        meridiemParse: /早上|上午|中午|下午|晚上/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16476
        meridiemHour : function (hour, meridiem) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16477
            if (hour === 12) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16478
                hour = 0;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16479
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16480
            if (meridiem === '早上' || meridiem === '上午') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16481
                return hour;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16482
            } else if (meridiem === '中午') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16483
                return hour >= 11 ? hour : hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16484
            } else if (meridiem === '下午' || meridiem === '晚上') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16485
                return hour + 12;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16486
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16487
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16488
        meridiem : function (hour, minute, isLower) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16489
            var hm = hour * 100 + minute;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16490
            if (hm < 900) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16491
                return '早上';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16492
            } else if (hm < 1130) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16493
                return '上午';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16494
            } else if (hm < 1230) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16495
                return '中午';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16496
            } else if (hm < 1800) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16497
                return '下午';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16498
            } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16499
                return '晚上';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16500
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16501
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16502
        calendar : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16503
            sameDay : '[今天]LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16504
            nextDay : '[明天]LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16505
            nextWeek : '[下]ddddLT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16506
            lastDay : '[昨天]LT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16507
            lastWeek : '[上]ddddLT',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16508
            sameElse : 'L'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16509
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16510
        ordinalParse: /\d{1,2}(日|月|週)/,
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16511
        ordinal : function (number, period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16512
            switch (period) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16513
            case 'd' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16514
            case 'D' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16515
            case 'DDD' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16516
                return number + '日';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16517
            case 'M' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16518
                return number + '月';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16519
            case 'w' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16520
            case 'W' :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16521
                return number + '週';
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16522
            default :
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16523
                return number;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16524
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16525
        },
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16526
        relativeTime : {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16527
            future : '%s內',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16528
            past : '%s前',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16529
            s : '幾秒',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16530
            m : '一分鐘',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16531
            mm : '%d分鐘',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16532
            h : '一小時',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16533
            hh : '%d小時',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16534
            d : '一天',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16535
            dd : '%d天',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16536
            M : '一個月',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16537
            MM : '%d個月',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16538
            y : '一年',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16539
            yy : '%d年'
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16540
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16541
    });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16542
}));
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16543
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16544
    moment.locale('en');
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16545
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16546
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16547
    /************************************
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16548
        Exposing Moment
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16549
    ************************************/
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16550
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16551
    function makeGlobal(shouldDeprecate) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16552
        /*global ender:false */
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16553
        if (typeof ender !== 'undefined') {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16554
            return;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16555
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16556
        oldGlobalMoment = globalScope.moment;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16557
        if (shouldDeprecate) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16558
            globalScope.moment = deprecate(
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16559
                    'Accessing Moment through the global scope is ' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16560
                    'deprecated, and will be removed in an upcoming ' +
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16561
                    'release.',
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16562
                    moment);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16563
        } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16564
            globalScope.moment = moment;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16565
        }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16566
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16567
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16568
    // CommonJS module is defined
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16569
    if (hasModule) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16570
        module.exports = moment;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16571
    } else if (typeof define === 'function' && define.amd) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16572
        define(function (require, exports, module) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16573
            if (module.config && module.config() && module.config().noGlobal === true) {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16574
                // release the global variable
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16575
                globalScope.moment = oldGlobalMoment;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16576
            }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16577
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16578
            return moment;
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16579
        });
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16580
        makeGlobal(true);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16581
    } else {
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16582
        makeGlobal();
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16583
    }
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16584
}).call(this);
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16585
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16586
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16587
108
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16588
},{}],"pixi":[function(require,module,exports){
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16589
/**
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16590
 * @license
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16591
 * pixi.js - v2.2.3
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16592
 * Copyright (c) 2012-2014, Mat Groves
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16593
 * http://goodboydigital.com/
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16594
 *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16595
 * Compiled: 2015-01-06
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16596
 *
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16597
 * pixi.js is licensed under the MIT License.
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16598
 * http://www.opensource.org/licenses/mit-license.php
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16599
 */
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16600
(function(){var a=this,b=b||{};b.WEBGL_RENDERER=0,b.CANVAS_RENDERER=1,b.VERSION="v2.2.3",b.blendModes={NORMAL:0,ADD:1,MULTIPLY:2,SCREEN:3,OVERLAY:4,DARKEN:5,LIGHTEN:6,COLOR_DODGE:7,COLOR_BURN:8,HARD_LIGHT:9,SOFT_LIGHT:10,DIFFERENCE:11,EXCLUSION:12,HUE:13,SATURATION:14,COLOR:15,LUMINOSITY:16},b.scaleModes={DEFAULT:0,LINEAR:0,NEAREST:1},b._UID=0,"undefined"!=typeof Float32Array?(b.Float32Array=Float32Array,b.Uint16Array=Uint16Array,b.Uint32Array=Uint32Array,b.ArrayBuffer=ArrayBuffer):(b.Float32Array=Array,b.Uint16Array=Array),b.INTERACTION_FREQUENCY=30,b.AUTO_PREVENT_DEFAULT=!0,b.PI_2=2*Math.PI,b.RAD_TO_DEG=180/Math.PI,b.DEG_TO_RAD=Math.PI/180,b.RETINA_PREFIX="@2x",b.dontSayHello=!1,b.defaultRenderOptions={view:null,transparent:!1,antialias:!1,preserveDrawingBuffer:!1,resolution:1,clearBeforeRender:!0,autoResize:!1},b.sayHello=function(a){if(!b.dontSayHello){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var c=["%c %c %c Pixi.js "+b.VERSION+" - "+a+"  %c  %c  http://www.pixijs.com/  %c %c ♥%c♥%c♥ ","background: #ff66a5","background: #ff66a5","color: #ff66a5; background: #030307;","background: #ff66a5","background: #ffc3dc","background: #ff66a5","color: #ff2424; background: #fff","color: #ff2424; background: #fff","color: #ff2424; background: #fff"];console.log.apply(console,c)}else window.console&&console.log("Pixi.js "+b.VERSION+" - http://www.pixijs.com/");b.dontSayHello=!0}},b.Point=function(a,b){this.x=a||0,this.y=b||0},b.Point.prototype.clone=function(){return new b.Point(this.x,this.y)},b.Point.prototype.set=function(a,b){this.x=a||0,this.y=b||(0!==b?this.x:0)},b.Point.prototype.constructor=b.Point,b.Rectangle=function(a,b,c,d){this.x=a||0,this.y=b||0,this.width=c||0,this.height=d||0},b.Rectangle.prototype.clone=function(){return new b.Rectangle(this.x,this.y,this.width,this.height)},b.Rectangle.prototype.contains=function(a,b){if(this.width<=0||this.height<=0)return!1;var c=this.x;if(a>=c&&a<=c+this.width){var d=this.y;if(b>=d&&b<=d+this.height)return!0}return!1},b.Rectangle.prototype.constructor=b.Rectangle,b.EmptyRectangle=new b.Rectangle(0,0,0,0),b.Polygon=function(a){if(a instanceof Array||(a=Array.prototype.slice.call(arguments)),a[0]instanceof b.Point){for(var c=[],d=0,e=a.length;e>d;d++)c.push(a[d].x,a[d].y);a=c}this.closed=!0,this.points=a},b.Polygon.prototype.clone=function(){var a=this.points.slice();return new b.Polygon(a)},b.Polygon.prototype.contains=function(a,b){for(var c=!1,d=this.points.length/2,e=0,f=d-1;d>e;f=e++){var g=this.points[2*e],h=this.points[2*e+1],i=this.points[2*f],j=this.points[2*f+1],k=h>b!=j>b&&(i-g)*(b-h)/(j-h)+g>a;k&&(c=!c)}return c},b.Polygon.prototype.constructor=b.Polygon,b.Circle=function(a,b,c){this.x=a||0,this.y=b||0,this.radius=c||0},b.Circle.prototype.clone=function(){return new b.Circle(this.x,this.y,this.radius)},b.Circle.prototype.contains=function(a,b){if(this.radius<=0)return!1;var c=this.x-a,d=this.y-b,e=this.radius*this.radius;return c*=c,d*=d,e>=c+d},b.Circle.prototype.getBounds=function(){return new b.Rectangle(this.x-this.radius,this.y-this.radius,2*this.radius,2*this.radius)},b.Circle.prototype.constructor=b.Circle,b.Ellipse=function(a,b,c,d){this.x=a||0,this.y=b||0,this.width=c||0,this.height=d||0},b.Ellipse.prototype.clone=function(){return new b.Ellipse(this.x,this.y,this.width,this.height)},b.Ellipse.prototype.contains=function(a,b){if(this.width<=0||this.height<=0)return!1;var c=(a-this.x)/this.width,d=(b-this.y)/this.height;return c*=c,d*=d,1>=c+d},b.Ellipse.prototype.getBounds=function(){return new b.Rectangle(this.x-this.width,this.y-this.height,this.width,this.height)},b.Ellipse.prototype.constructor=b.Ellipse,b.RoundedRectangle=function(a,b,c,d,e){this.x=a||0,this.y=b||0,this.width=c||0,this.height=d||0,this.radius=e||20},b.RoundedRectangle.prototype.clone=function(){return new b.RoundedRectangle(this.x,this.y,this.width,this.height,this.radius)},b.RoundedRectangle.prototype.contains=function(a,b){if(this.width<=0||this.height<=0)return!1;var c=this.x;if(a>=c&&a<=c+this.width){var d=this.y;if(b>=d&&b<=d+this.height)return!0}return!1},b.RoundedRectangle.prototype.constructor=b.RoundedRectangle,b.Matrix=function(){this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0},b.Matrix.prototype.fromArray=function(a){this.a=a[0],this.b=a[1],this.c=a[3],this.d=a[4],this.tx=a[2],this.ty=a[5]},b.Matrix.prototype.toArray=function(a){this.array||(this.array=new b.Float32Array(9));var c=this.array;return a?(c[0]=this.a,c[1]=this.b,c[2]=0,c[3]=this.c,c[4]=this.d,c[5]=0,c[6]=this.tx,c[7]=this.ty,c[8]=1):(c[0]=this.a,c[1]=this.c,c[2]=this.tx,c[3]=this.b,c[4]=this.d,c[5]=this.ty,c[6]=0,c[7]=0,c[8]=1),c},b.Matrix.prototype.apply=function(a,c){return c=c||new b.Point,c.x=this.a*a.x+this.c*a.y+this.tx,c.y=this.b*a.x+this.d*a.y+this.ty,c},b.Matrix.prototype.applyInverse=function(a,c){c=c||new b.Point;var d=1/(this.a*this.d+this.c*-this.b);return c.x=this.d*d*a.x+-this.c*d*a.y+(this.ty*this.c-this.tx*this.d)*d,c.y=this.a*d*a.y+-this.b*d*a.x+(-this.ty*this.a+this.tx*this.b)*d,c},b.Matrix.prototype.translate=function(a,b){return this.tx+=a,this.ty+=b,this},b.Matrix.prototype.scale=function(a,b){return this.a*=a,this.d*=b,this.c*=a,this.b*=b,this.tx*=a,this.ty*=b,this},b.Matrix.prototype.rotate=function(a){var b=Math.cos(a),c=Math.sin(a),d=this.a,e=this.c,f=this.tx;return this.a=d*b-this.b*c,this.b=d*c+this.b*b,this.c=e*b-this.d*c,this.d=e*c+this.d*b,this.tx=f*b-this.ty*c,this.ty=f*c+this.ty*b,this},b.Matrix.prototype.append=function(a){var b=this.a,c=this.b,d=this.c,e=this.d;return this.a=a.a*b+a.b*d,this.b=a.a*c+a.b*e,this.c=a.c*b+a.d*d,this.d=a.c*c+a.d*e,this.tx=a.tx*b+a.ty*d+this.tx,this.ty=a.tx*c+a.ty*e+this.ty,this},b.Matrix.prototype.identity=function(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this},b.identityMatrix=new b.Matrix,b.DisplayObject=function(){this.position=new b.Point,this.scale=new b.Point(1,1),this.pivot=new b.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.hitArea=null,this.buttonMode=!1,this.renderable=!1,this.parent=null,this.stage=null,this.worldAlpha=1,this._interactive=!1,this.defaultCursor="pointer",this.worldTransform=new b.Matrix,this._sr=0,this._cr=1,this.filterArea=null,this._bounds=new b.Rectangle(0,0,1,1),this._currentBounds=null,this._mask=null,this._cacheAsBitmap=!1,this._cacheIsDirty=!1},b.DisplayObject.prototype.constructor=b.DisplayObject,Object.defineProperty(b.DisplayObject.prototype,"interactive",{get:function(){return this._interactive},set:function(a){this._interactive=a,this.stage&&(this.stage.dirty=!0)}}),Object.defineProperty(b.DisplayObject.prototype,"worldVisible",{get:function(){var a=this;do{if(!a.visible)return!1;a=a.parent}while(a);return!0}}),Object.defineProperty(b.DisplayObject.prototype,"mask",{get:function(){return this._mask},set:function(a){this._mask&&(this._mask.isMask=!1),this._mask=a,this._mask&&(this._mask.isMask=!0)}}),Object.defineProperty(b.DisplayObject.prototype,"filters",{get:function(){return this._filters},set:function(a){if(a){for(var b=[],c=0;c<a.length;c++)for(var d=a[c].passes,e=0;e<d.length;e++)b.push(d[e]);this._filterBlock={target:this,filterPasses:b}}this._filters=a}}),Object.defineProperty(b.DisplayObject.prototype,"cacheAsBitmap",{get:function(){return this._cacheAsBitmap},set:function(a){this._cacheAsBitmap!==a&&(a?this._generateCachedSprite():this._destroyCachedSprite(),this._cacheAsBitmap=a)}}),b.DisplayObject.prototype.updateTransform=function(){var a,c,d,e,f,g,h=this.parent.worldTransform,i=this.worldTransform;this.rotation%b.PI_2?(this.rotation!==this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation)),a=this._cr*this.scale.x,c=this._sr*this.scale.x,d=-this._sr*this.scale.y,e=this._cr*this.scale.y,f=this.position.x,g=this.position.y,(this.pivot.x||this.pivot.y)&&(f-=this.pivot.x*a+this.pivot.y*d,g-=this.pivot.x*c+this.pivot.y*e),i.a=a*h.a+c*h.c,i.b=a*h.b+c*h.d,i.c=d*h.a+e*h.c,i.d=d*h.b+e*h.d,i.tx=f*h.a+g*h.c+h.tx,i.ty=f*h.b+g*h.d+h.ty):(a=this.scale.x,e=this.scale.y,f=this.position.x-this.pivot.x*a,g=this.position.y-this.pivot.y*e,i.a=a*h.a,i.b=a*h.b,i.c=e*h.c,i.d=e*h.d,i.tx=f*h.a+g*h.c+h.tx,i.ty=f*h.b+g*h.d+h.ty),this.worldAlpha=this.alpha*this.parent.worldAlpha},b.DisplayObject.prototype.displayObjectUpdateTransform=b.DisplayObject.prototype.updateTransform,b.DisplayObject.prototype.getBounds=function(a){return a=a,b.EmptyRectangle},b.DisplayObject.prototype.getLocalBounds=function(){return this.getBounds(b.identityMatrix)},b.DisplayObject.prototype.setStageReference=function(a){this.stage=a,this._interactive&&(this.stage.dirty=!0)},b.DisplayObject.prototype.generateTexture=function(a,c,d){var e=this.getLocalBounds(),f=new b.RenderTexture(0|e.width,0|e.height,d,c,a);return b.DisplayObject._tempMatrix.tx=-e.x,b.DisplayObject._tempMatrix.ty=-e.y,f.render(this,b.DisplayObject._tempMatrix),f},b.DisplayObject.prototype.updateCache=function(){this._generateCachedSprite()},b.DisplayObject.prototype.toGlobal=function(a){return this.displayObjectUpdateTransform(),this.worldTransform.apply(a)},b.DisplayObject.prototype.toLocal=function(a,b){return b&&(a=b.toGlobal(a)),this.displayObjectUpdateTransform(),this.worldTransform.applyInverse(a)},b.DisplayObject.prototype._renderCachedSprite=function(a){this._cachedSprite.worldAlpha=this.worldAlpha,a.gl?b.Sprite.prototype._renderWebGL.call(this._cachedSprite,a):b.Sprite.prototype._renderCanvas.call(this._cachedSprite,a)},b.DisplayObject.prototype._generateCachedSprite=function(){this._cacheAsBitmap=!1;var a=this.getLocalBounds();if(this._cachedSprite)this._cachedSprite.texture.resize(0|a.width,0|a.height);else{var c=new b.RenderTexture(0|a.width,0|a.height);this._cachedSprite=new b.Sprite(c),this._cachedSprite.worldTransform=this.worldTransform}var d=this._filters;this._filters=null,this._cachedSprite.filters=d,b.DisplayObject._tempMatrix.tx=-a.x,b.DisplayObject._tempMatrix.ty=-a.y,this._cachedSprite.texture.render(this,b.DisplayObject._tempMatrix,!0),this._cachedSprite.anchor.x=-(a.x/a.width),this._cachedSprite.anchor.y=-(a.y/a.height),this._filters=d,this._cacheAsBitmap=!0},b.DisplayObject.prototype._destroyCachedSprite=function(){this._cachedSprite&&(this._cachedSprite.texture.destroy(!0),this._cachedSprite=null)},b.DisplayObject.prototype._renderWebGL=function(a){a=a},b.DisplayObject.prototype._renderCanvas=function(a){a=a},b.DisplayObject._tempMatrix=new b.Matrix,Object.defineProperty(b.DisplayObject.prototype,"x",{get:function(){return this.position.x},set:function(a){this.position.x=a}}),Object.defineProperty(b.DisplayObject.prototype,"y",{get:function(){return this.position.y},set:function(a){this.position.y=a}}),b.DisplayObjectContainer=function(){b.DisplayObject.call(this),this.children=[]},b.DisplayObjectContainer.prototype=Object.create(b.DisplayObject.prototype),b.DisplayObjectContainer.prototype.constructor=b.DisplayObjectContainer,Object.defineProperty(b.DisplayObjectContainer.prototype,"width",{get:function(){return this.scale.x*this.getLocalBounds().width},set:function(a){var b=this.getLocalBounds().width;this.scale.x=0!==b?a/b:1,this._width=a}}),Object.defineProperty(b.DisplayObjectContainer.prototype,"height",{get:function(){return this.scale.y*this.getLocalBounds().height},set:function(a){var b=this.getLocalBounds().height;this.scale.y=0!==b?a/b:1,this._height=a}}),b.DisplayObjectContainer.prototype.addChild=function(a){return this.addChildAt(a,this.children.length)},b.DisplayObjectContainer.prototype.addChildAt=function(a,b){if(b>=0&&b<=this.children.length)return a.parent&&a.parent.removeChild(a),a.parent=this,this.children.splice(b,0,a),this.stage&&a.setStageReference(this.stage),a;throw new Error(a+"addChildAt: The index "+b+" supplied is out of bounds "+this.children.length)},b.DisplayObjectContainer.prototype.swapChildren=function(a,b){if(a!==b){var c=this.getChildIndex(a),d=this.getChildIndex(b);if(0>c||0>d)throw new Error("swapChildren: Both the supplied DisplayObjects must be a child of the caller.");this.children[c]=b,this.children[d]=a}},b.DisplayObjectContainer.prototype.getChildIndex=function(a){var b=this.children.indexOf(a);if(-1===b)throw new Error("The supplied DisplayObject must be a child of the caller");return b},b.DisplayObjectContainer.prototype.setChildIndex=function(a,b){if(0>b||b>=this.children.length)throw new Error("The supplied index is out of bounds");var c=this.getChildIndex(a);this.children.splice(c,1),this.children.splice(b,0,a)},b.DisplayObjectContainer.prototype.getChildAt=function(a){if(0>a||a>=this.children.length)throw new Error("getChildAt: Supplied index "+a+" does not exist in the child list, or the supplied DisplayObject must be a child of the caller");return this.children[a]},b.DisplayObjectContainer.prototype.removeChild=function(a){var b=this.children.indexOf(a);if(-1!==b)return this.removeChildAt(b)},b.DisplayObjectContainer.prototype.removeChildAt=function(a){var b=this.getChildAt(a);return this.stage&&b.removeStageReference(),b.parent=void 0,this.children.splice(a,1),b},b.DisplayObjectContainer.prototype.removeChildren=function(a,b){var c=a||0,d="number"==typeof b?b:this.children.length,e=d-c;if(e>0&&d>=e){for(var f=this.children.splice(c,e),g=0;g<f.length;g++){var h=f[g];this.stage&&h.removeStageReference(),h.parent=void 0}return f}if(0===e&&0===this.children.length)return[];throw new Error("removeChildren: Range Error, numeric values are outside the acceptable range")},b.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible&&(this.displayObjectUpdateTransform(),!this._cacheAsBitmap))for(var a=0,b=this.children.length;b>a;a++)this.children[a].updateTransform()},b.DisplayObjectContainer.prototype.displayObjectContainerUpdateTransform=b.DisplayObjectContainer.prototype.updateTransform,b.DisplayObjectContainer.prototype.getBounds=function(){if(0===this.children.length)return b.EmptyRectangle;for(var a,c,d,e=1/0,f=1/0,g=-1/0,h=-1/0,i=!1,j=0,k=this.children.length;k>j;j++){var l=this.children[j];l.visible&&(i=!0,a=this.children[j].getBounds(),e=e<a.x?e:a.x,f=f<a.y?f:a.y,c=a.width+a.x,d=a.height+a.y,g=g>c?g:c,h=h>d?h:d)}if(!i)return b.EmptyRectangle;var m=this._bounds;return m.x=e,m.y=f,m.width=g-e,m.height=h-f,m},b.DisplayObjectContainer.prototype.getLocalBounds=function(){var a=this.worldTransform;this.worldTransform=b.identityMatrix;for(var c=0,d=this.children.length;d>c;c++)this.children[c].updateTransform();var e=this.getBounds();return this.worldTransform=a,e},b.DisplayObjectContainer.prototype.setStageReference=function(a){this.stage=a,this._interactive&&(this.stage.dirty=!0);for(var b=0,c=this.children.length;c>b;b++){var d=this.children[b];d.setStageReference(a)}},b.DisplayObjectContainer.prototype.removeStageReference=function(){for(var a=0,b=this.children.length;b>a;a++){var c=this.children[a];c.removeStageReference()}this._interactive&&(this.stage.dirty=!0),this.stage=null},b.DisplayObjectContainer.prototype._renderWebGL=function(a){if(this.visible&&!(this.alpha<=0)){if(this._cacheAsBitmap)return void this._renderCachedSprite(a);var b,c;if(this._mask||this._filters){for(this._filters&&(a.spriteBatch.flush(),a.filterManager.pushFilter(this._filterBlock)),this._mask&&(a.spriteBatch.stop(),a.maskManager.pushMask(this.mask,a),a.spriteBatch.start()),b=0,c=this.children.length;c>b;b++)this.children[b]._renderWebGL(a);a.spriteBatch.stop(),this._mask&&a.maskManager.popMask(this._mask,a),this._filters&&a.filterManager.popFilter(),a.spriteBatch.start()}else for(b=0,c=this.children.length;c>b;b++)this.children[b]._renderWebGL(a)}},b.DisplayObjectContainer.prototype._renderCanvas=function(a){if(this.visible!==!1&&0!==this.alpha){if(this._cacheAsBitmap)return void this._renderCachedSprite(a);this._mask&&a.maskManager.pushMask(this._mask,a);for(var b=0,c=this.children.length;c>b;b++){var d=this.children[b];d._renderCanvas(a)}this._mask&&a.maskManager.popMask(a)}},b.Sprite=function(a){b.DisplayObjectContainer.call(this),this.anchor=new b.Point,this.texture=a||b.Texture.emptyTexture,this._width=0,this._height=0,this.tint=16777215,this.blendMode=b.blendModes.NORMAL,this.shader=null,this.texture.baseTexture.hasLoaded?this.onTextureUpdate():this.texture.on("update",this.onTextureUpdate.bind(this)),this.renderable=!0},b.Sprite.prototype=Object.create(b.DisplayObjectContainer.prototype),b.Sprite.prototype.constructor=b.Sprite,Object.defineProperty(b.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(a){this.scale.x=a/this.texture.frame.width,this._width=a}}),Object.defineProperty(b.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(a){this.scale.y=a/this.texture.frame.height,this._height=a}}),b.Sprite.prototype.setTexture=function(a){this.texture=a,this.cachedTint=16777215},b.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height)},b.Sprite.prototype.getBounds=function(a){var b=this.texture.frame.width,c=this.texture.frame.height,d=b*(1-this.anchor.x),e=b*-this.anchor.x,f=c*(1-this.anchor.y),g=c*-this.anchor.y,h=a||this.worldTransform,i=h.a,j=h.b,k=h.c,l=h.d,m=h.tx,n=h.ty,o=-1/0,p=-1/0,q=1/0,r=1/0;if(0===j&&0===k)0>i&&(i*=-1),0>l&&(l*=-1),q=i*e+m,o=i*d+m,r=l*g+n,p=l*f+n;else{var s=i*e+k*g+m,t=l*g+j*e+n,u=i*d+k*g+m,v=l*g+j*d+n,w=i*d+k*f+m,x=l*f+j*d+n,y=i*e+k*f+m,z=l*f+j*e+n;q=q>s?s:q,q=q>u?u:q,q=q>w?w:q,q=q>y?y:q,r=r>t?t:r,r=r>v?v:r,r=r>x?x:r,r=r>z?z:r,o=s>o?s:o,o=u>o?u:o,o=w>o?w:o,o=y>o?y:o,p=t>p?t:p,p=v>p?v:p,p=x>p?x:p,p=z>p?z:p}var A=this._bounds;return A.x=q,A.width=o-q,A.y=r,A.height=p-r,this._currentBounds=A,A},b.Sprite.prototype._renderWebGL=function(a){if(this.visible&&!(this.alpha<=0)){var b,c;if(this._mask||this._filters){var d=a.spriteBatch;for(this._filters&&(d.flush(),a.filterManager.pushFilter(this._filterBlock)),this._mask&&(d.stop(),a.maskManager.pushMask(this.mask,a),d.start()),d.render(this),b=0,c=this.children.length;c>b;b++)this.children[b]._renderWebGL(a);d.stop(),this._mask&&a.maskManager.popMask(this._mask,a),this._filters&&a.filterManager.popFilter(),d.start()}else for(a.spriteBatch.render(this),b=0,c=this.children.length;c>b;b++)this.children[b]._renderWebGL(a)}},b.Sprite.prototype._renderCanvas=function(a){if(!(this.visible===!1||0===this.alpha||this.texture.crop.width<=0||this.texture.crop.height<=0)){if(this.blendMode!==a.currentBlendMode&&(a.currentBlendMode=this.blendMode,a.context.globalCompositeOperation=b.blendModesCanvas[a.currentBlendMode]),this._mask&&a.maskManager.pushMask(this._mask,a),this.texture.valid){var c=this.texture.baseTexture.resolution/a.resolution;a.context.globalAlpha=this.worldAlpha,a.smoothProperty&&a.scaleMode!==this.texture.baseTexture.scaleMode&&(a.scaleMode=this.texture.baseTexture.scaleMode,a.context[a.smoothProperty]=a.scaleMode===b.scaleModes.LINEAR);var d=this.texture.trim?this.texture.trim.x-this.anchor.x*this.texture.trim.width:this.anchor.x*-this.texture.frame.width,e=this.texture.trim?this.texture.trim.y-this.anchor.y*this.texture.trim.height:this.anchor.y*-this.texture.frame.height;a.roundPixels?(a.context.setTransform(this.worldTransform.a,this.worldTransform.b,this.worldTransform.c,this.worldTransform.d,this.worldTransform.tx*a.resolution|0,this.worldTransform.ty*a.resolution|0),d=0|d,e=0|e):a.context.setTransform(this.worldTransform.a,this.worldTransform.b,this.worldTransform.c,this.worldTransform.d,this.worldTransform.tx*a.resolution,this.worldTransform.ty*a.resolution),16777215!==this.tint?(this.cachedTint!==this.tint&&(this.cachedTint=this.tint,this.tintedTexture=b.CanvasTinter.getTintedTexture(this,this.tint)),a.context.drawImage(this.tintedTexture,0,0,this.texture.crop.width,this.texture.crop.height,d/c,e/c,this.texture.crop.width/c,this.texture.crop.height/c)):a.context.drawImage(this.texture.baseTexture.source,this.texture.crop.x,this.texture.crop.y,this.texture.crop.width,this.texture.crop.height,d/c,e/c,this.texture.crop.width/c,this.texture.crop.height/c)}for(var f=0,g=this.children.length;g>f;f++)this.children[f]._renderCanvas(a);this._mask&&a.maskManager.popMask(a)}},b.Sprite.fromFrame=function(a){var c=b.TextureCache[a];if(!c)throw new Error('The frameId "'+a+'" does not exist in the texture cache'+this);return new b.Sprite(c)},b.Sprite.fromImage=function(a,c,d){var e=b.Texture.fromImage(a,c,d);return new b.Sprite(e)},b.SpriteBatch=function(a){b.DisplayObjectContainer.call(this),this.textureThing=a,this.ready=!1},b.SpriteBatch.prototype=Object.create(b.DisplayObjectContainer.prototype),b.SpriteBatch.prototype.constructor=b.SpriteBatch,b.SpriteBatch.prototype.initWebGL=function(a){this.fastSpriteBatch=new b.WebGLFastSpriteBatch(a),this.ready=!0},b.SpriteBatch.prototype.updateTransform=function(){this.displayObjectUpdateTransform()},b.SpriteBatch.prototype._renderWebGL=function(a){!this.visible||this.alpha<=0||!this.children.length||(this.ready||this.initWebGL(a.gl),a.spriteBatch.stop(),a.shaderManager.setShader(a.shaderManager.fastShader),this.fastSpriteBatch.begin(this,a),this.fastSpriteBatch.render(this),a.spriteBatch.start())},b.SpriteBatch.prototype._renderCanvas=function(a){if(this.visible&&!(this.alpha<=0)&&this.children.length){var b=a.context;b.globalAlpha=this.worldAlpha,this.displayObjectUpdateTransform();for(var c=this.worldTransform,d=!0,e=0;e<this.children.length;e++){var f=this.children[e];if(f.visible){var g=f.texture,h=g.frame;if(b.globalAlpha=this.worldAlpha*f.alpha,f.rotation%(2*Math.PI)===0)d&&(b.setTransform(c.a,c.b,c.c,c.d,c.tx,c.ty),d=!1),b.drawImage(g.baseTexture.source,h.x,h.y,h.width,h.height,f.anchor.x*-h.width*f.scale.x+f.position.x+.5|0,f.anchor.y*-h.height*f.scale.y+f.position.y+.5|0,h.width*f.scale.x,h.height*f.scale.y);else{d||(d=!0),f.displayObjectUpdateTransform();var i=f.worldTransform;a.roundPixels?b.setTransform(i.a,i.b,i.c,i.d,0|i.tx,0|i.ty):b.setTransform(i.a,i.b,i.c,i.d,i.tx,i.ty),b.drawImage(g.baseTexture.source,h.x,h.y,h.width,h.height,f.anchor.x*-h.width+.5|0,f.anchor.y*-h.height+.5|0,h.width,h.height)}}}}},b.MovieClip=function(a){b.Sprite.call(this,a[0]),this.textures=a,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.currentFrame=0,this.playing=!1},b.MovieClip.prototype=Object.create(b.Sprite.prototype),b.MovieClip.prototype.constructor=b.MovieClip,Object.defineProperty(b.MovieClip.prototype,"totalFrames",{get:function(){return this.textures.length}}),b.MovieClip.prototype.stop=function(){this.playing=!1},b.MovieClip.prototype.play=function(){this.playing=!0},b.MovieClip.prototype.gotoAndStop=function(a){this.playing=!1,this.currentFrame=a;var b=this.currentFrame+.5|0;this.setTexture(this.textures[b%this.textures.length])},b.MovieClip.prototype.gotoAndPlay=function(a){this.currentFrame=a,this.playing=!0},b.MovieClip.prototype.updateTransform=function(){if(this.displayObjectContainerUpdateTransform(),this.playing){this.currentFrame+=this.animationSpeed;var a=this.currentFrame+.5|0;this.currentFrame=this.currentFrame%this.textures.length,this.loop||a<this.textures.length?this.setTexture(this.textures[a%this.textures.length]):a>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},b.MovieClip.fromFrames=function(a){for(var c=[],d=0;d<a.length;d++)c.push(new b.Texture.fromFrame(a[d]));return new b.MovieClip(c)},b.MovieClip.fromImages=function(a){for(var c=[],d=0;d<a.length;d++)c.push(new b.Texture.fromImage(a[d]));return new b.MovieClip(c)},b.FilterBlock=function(){this.visible=!0,this.renderable=!0},b.FilterBlock.prototype.constructor=b.FilterBlock,b.Text=function(a,c){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.resolution=1,b.Sprite.call(this,b.Texture.fromCanvas(this.canvas)),this.setText(a),this.setStyle(c)},b.Text.prototype=Object.create(b.Sprite.prototype),b.Text.prototype.constructor=b.Text,Object.defineProperty(b.Text.prototype,"width",{get:function(){return this.dirty&&(this.updateText(),this.dirty=!1),this.scale.x*this.texture.frame.width},set:function(a){this.scale.x=a/this.texture.frame.width,this._width=a}}),Object.defineProperty(b.Text.prototype,"height",{get:function(){return this.dirty&&(this.updateText(),this.dirty=!1),this.scale.y*this.texture.frame.height},set:function(a){this.scale.y=a/this.texture.frame.height,this._height=a}}),b.Text.prototype.setStyle=function(a){a=a||{},a.font=a.font||"bold 20pt Arial",a.fill=a.fill||"black",a.align=a.align||"left",a.stroke=a.stroke||"black",a.strokeThickness=a.strokeThickness||0,a.wordWrap=a.wordWrap||!1,a.wordWrapWidth=a.wordWrapWidth||100,a.dropShadow=a.dropShadow||!1,a.dropShadowAngle=a.dropShadowAngle||Math.PI/6,a.dropShadowDistance=a.dropShadowDistance||4,a.dropShadowColor=a.dropShadowColor||"black",this.style=a,this.dirty=!0},b.Text.prototype.setText=function(a){this.text=a.toString()||" ",this.dirty=!0},b.Text.prototype.updateText=function(){this.texture.baseTexture.resolution=this.resolution,this.context.font=this.style.font;var a=this.text;this.style.wordWrap&&(a=this.wordWrap(this.text));for(var b=a.split(/(?:\r\n|\r|\n)/),c=[],d=0,e=this.determineFontProperties(this.style.font),f=0;f<b.length;f++){var g=this.context.measureText(b[f]).width;c[f]=g,d=Math.max(d,g)}var h=d+this.style.strokeThickness;this.style.dropShadow&&(h+=this.style.dropShadowDistance),this.canvas.width=(h+this.context.lineWidth)*this.resolution;var i=e.fontSize+this.style.strokeThickness,j=i*b.length;this.style.dropShadow&&(j+=this.style.dropShadowDistance),this.canvas.height=j*this.resolution,this.context.scale(this.resolution,this.resolution),navigator.isCocoonJS&&this.context.clearRect(0,0,this.canvas.width,this.canvas.height),this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="alphabetic";var k,l;if(this.style.dropShadow){this.context.fillStyle=this.style.dropShadowColor;var m=Math.sin(this.style.dropShadowAngle)*this.style.dropShadowDistance,n=Math.cos(this.style.dropShadowAngle)*this.style.dropShadowDistance;for(f=0;f<b.length;f++)k=this.style.strokeThickness/2,l=this.style.strokeThickness/2+f*i+e.ascent,"right"===this.style.align?k+=d-c[f]:"center"===this.style.align&&(k+=(d-c[f])/2),this.style.fill&&this.context.fillText(b[f],k+m,l+n)}for(this.context.fillStyle=this.style.fill,f=0;f<b.length;f++)k=this.style.strokeThickness/2,l=this.style.strokeThickness/2+f*i+e.ascent,"right"===this.style.align?k+=d-c[f]:"center"===this.style.align&&(k+=(d-c[f])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(b[f],k,l),this.style.fill&&this.context.fillText(b[f],k,l);this.updateTexture()},b.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.crop.width=this.texture.frame.width=this.canvas.width,this.texture.crop.height=this.texture.frame.height=this.canvas.height,this._width=this.canvas.width,this._height=this.canvas.height,this.texture.baseTexture.dirty()},b.Text.prototype._renderWebGL=function(a){this.dirty&&(this.resolution=a.resolution,this.updateText(),this.dirty=!1),b.Sprite.prototype._renderWebGL.call(this,a)},b.Text.prototype._renderCanvas=function(a){this.dirty&&(this.resolution=a.resolution,this.updateText(),this.dirty=!1),b.Sprite.prototype._renderCanvas.call(this,a)},b.Text.prototype.determineFontProperties=function(a){var c=b.Text.fontPropertiesCache[a];if(!c){c={};var d=b.Text.fontPropertiesCanvas,e=b.Text.fontPropertiesContext;e.font=a;var f=Math.ceil(e.measureText("|Mq").width),g=Math.ceil(e.measureText("M").width),h=2*g;g=1.4*g|0,d.width=f,d.height=h,e.fillStyle="#f00",e.fillRect(0,0,f,h),e.font=a,e.textBaseline="alphabetic",e.fillStyle="#000",e.fillText("|MÉq",0,g);var i,j,k=e.getImageData(0,0,f,h).data,l=k.length,m=4*f,n=0,o=!1;for(i=0;g>i;i++){for(j=0;m>j;j+=4)if(255!==k[n+j]){o=!0;break}if(o)break;n+=m}for(c.ascent=g-i,n=l-m,o=!1,i=h;i>g;i--){for(j=0;m>j;j+=4)if(255!==k[n+j]){o=!0;break}if(o)break;n-=m}c.descent=i-g,c.descent+=6,c.fontSize=c.ascent+c.descent,b.Text.fontPropertiesCache[a]=c}return c},b.Text.prototype.wordWrap=function(a){for(var b="",c=a.split("\n"),d=0;d<c.length;d++){for(var e=this.style.wordWrapWidth,f=c[d].split(" "),g=0;g<f.length;g++){var h=this.context.measureText(f[g]).width,i=h+this.context.measureText(" ").width;0===g||i>e?(g>0&&(b+="\n"),b+=f[g],e=this.style.wordWrapWidth-h):(e-=i,b+=" "+f[g])}d<c.length-1&&(b+="\n")}return b},b.Text.prototype.getBounds=function(a){return this.dirty&&(this.updateText(),this.dirty=!1),b.Sprite.prototype.getBounds.call(this,a)},b.Text.prototype.destroy=function(a){this.context=null,this.canvas=null,this.texture.destroy(void 0===a?!0:a)},b.Text.fontPropertiesCache={},b.Text.fontPropertiesCanvas=document.createElement("canvas"),b.Text.fontPropertiesContext=b.Text.fontPropertiesCanvas.getContext("2d"),b.BitmapText=function(a,c){b.DisplayObjectContainer.call(this),this.textWidth=0,this.textHeight=0,this._pool=[],this.setText(a),this.setStyle(c),this.updateText(),this.dirty=!1},b.BitmapText.prototype=Object.create(b.DisplayObjectContainer.prototype),b.BitmapText.prototype.constructor=b.BitmapText,b.BitmapText.prototype.setText=function(a){this.text=a||" ",this.dirty=!0},b.BitmapText.prototype.setStyle=function(a){a=a||{},a.align=a.align||"left",this.style=a;var c=a.font.split(" ");this.fontName=c[c.length-1],this.fontSize=c.length>=2?parseInt(c[c.length-2],10):b.BitmapText.fonts[this.fontName].size,this.dirty=!0,this.tint=a.tint},b.BitmapText.prototype.updateText=function(){for(var a=b.BitmapText.fonts[this.fontName],c=new b.Point,d=null,e=[],f=0,g=[],h=0,i=this.fontSize/a.size,j=0;j<this.text.length;j++){var k=this.text.charCodeAt(j);if(/(?:\r\n|\r|\n)/.test(this.text.charAt(j)))g.push(c.x),f=Math.max(f,c.x),h++,c.x=0,c.y+=a.lineHeight,d=null;else{var l=a.chars[k];l&&(d&&l.kerning[d]&&(c.x+=l.kerning[d]),e.push({texture:l.texture,line:h,charCode:k,position:new b.Point(c.x+l.xOffset,c.y+l.yOffset)}),c.x+=l.xAdvance,d=k)}}g.push(c.x),f=Math.max(f,c.x);var m=[];for(j=0;h>=j;j++){var n=0;"right"===this.style.align?n=f-g[j]:"center"===this.style.align&&(n=(f-g[j])/2),m.push(n)}var o=this.children.length,p=e.length,q=this.tint||16777215;for(j=0;p>j;j++){var r=o>j?this.children[j]:this._pool.pop();r?r.setTexture(e[j].texture):r=new b.Sprite(e[j].texture),r.position.x=(e[j].position.x+m[e[j].line])*i,r.position.y=e[j].position.y*i,r.scale.x=r.scale.y=i,r.tint=q,r.parent||this.addChild(r)}for(;this.children.length>p;){var s=this.getChildAt(this.children.length-1);this._pool.push(s),this.removeChild(s)}this.textWidth=f*i,this.textHeight=(c.y+a.lineHeight)*i},b.BitmapText.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),b.DisplayObjectContainer.prototype.updateTransform.call(this)},b.BitmapText.fonts={},b.InteractionData=function(){this.global=new b.Point,this.target=null,this.originalEvent=null},b.InteractionData.prototype.getLocalPosition=function(a,c){var d=a.worldTransform,e=this.global,f=d.a,g=d.c,h=d.tx,i=d.b,j=d.d,k=d.ty,l=1/(f*j+g*-i);return c=c||new b.Point,c.x=j*l*e.x+-g*l*e.y+(k*g-h*j)*l,c.y=f*l*e.y+-i*l*e.x+(-k*f+h*i)*l,c},b.InteractionData.prototype.constructor=b.InteractionData,b.InteractionManager=function(a){this.stage=a,this.mouse=new b.InteractionData,this.touches={},this.tempPoint=new b.Point,this.mouseoverEnabled=!0,this.pool=[],this.interactiveItems=[],this.interactionDOMElement=null,this.onMouseMove=this.onMouseMove.bind(this),this.onMouseDown=this.onMouseDown.bind(this),this.onMouseOut=this.onMouseOut.bind(this),this.onMouseUp=this.onMouseUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.last=0,this.currentCursorStyle="inherit",this.mouseOut=!1,this.resolution=1,this._tempPoint=new b.Point},b.InteractionManager.prototype.constructor=b.InteractionManager,b.InteractionManager.prototype.collectInteractiveSprite=function(a,b){for(var c=a.children,d=c.length,e=d-1;e>=0;e--){var f=c[e];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16601
f._interactive?(b.interactiveChildren=!0,this.interactiveItems.push(f),f.children.length>0&&this.collectInteractiveSprite(f,f)):(f.__iParent=null,f.children.length>0&&this.collectInteractiveSprite(f,b))}},b.InteractionManager.prototype.setTarget=function(a){this.target=a,this.resolution=a.resolution,null===this.interactionDOMElement&&this.setTargetDomElement(a.view)},b.InteractionManager.prototype.setTargetDomElement=function(a){this.removeEvents(),window.navigator.msPointerEnabled&&(a.style["-ms-content-zooming"]="none",a.style["-ms-touch-action"]="none"),this.interactionDOMElement=a,a.addEventListener("mousemove",this.onMouseMove,!0),a.addEventListener("mousedown",this.onMouseDown,!0),a.addEventListener("mouseout",this.onMouseOut,!0),a.addEventListener("touchstart",this.onTouchStart,!0),a.addEventListener("touchend",this.onTouchEnd,!0),a.addEventListener("touchmove",this.onTouchMove,!0),window.addEventListener("mouseup",this.onMouseUp,!0)},b.InteractionManager.prototype.removeEvents=function(){this.interactionDOMElement&&(this.interactionDOMElement.style["-ms-content-zooming"]="",this.interactionDOMElement.style["-ms-touch-action"]="",this.interactionDOMElement.removeEventListener("mousemove",this.onMouseMove,!0),this.interactionDOMElement.removeEventListener("mousedown",this.onMouseDown,!0),this.interactionDOMElement.removeEventListener("mouseout",this.onMouseOut,!0),this.interactionDOMElement.removeEventListener("touchstart",this.onTouchStart,!0),this.interactionDOMElement.removeEventListener("touchend",this.onTouchEnd,!0),this.interactionDOMElement.removeEventListener("touchmove",this.onTouchMove,!0),this.interactionDOMElement=null,window.removeEventListener("mouseup",this.onMouseUp,!0))},b.InteractionManager.prototype.update=function(){if(this.target){var a=Date.now(),c=a-this.last;if(c=c*b.INTERACTION_FREQUENCY/1e3,!(1>c)){this.last=a;var d=0;this.dirty&&this.rebuildInteractiveGraph();var e=this.interactiveItems.length,f="inherit",g=!1;for(d=0;e>d;d++){var h=this.interactiveItems[d];h.__hit=this.hitTest(h,this.mouse),this.mouse.target=h,h.__hit&&!g?(h.buttonMode&&(f=h.defaultCursor),h.interactiveChildren||(g=!0),h.__isOver||(h.mouseover&&h.mouseover(this.mouse),h.__isOver=!0)):h.__isOver&&(h.mouseout&&h.mouseout(this.mouse),h.__isOver=!1)}this.currentCursorStyle!==f&&(this.currentCursorStyle=f,this.interactionDOMElement.style.cursor=f)}}},b.InteractionManager.prototype.rebuildInteractiveGraph=function(){this.dirty=!1;for(var a=this.interactiveItems.length,b=0;a>b;b++)this.interactiveItems[b].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)},b.InteractionManager.prototype.onMouseMove=function(a){this.dirty&&this.rebuildInteractiveGraph(),this.mouse.originalEvent=a;var b=this.interactionDOMElement.getBoundingClientRect();this.mouse.global.x=(a.clientX-b.left)*(this.target.width/b.width)/this.resolution,this.mouse.global.y=(a.clientY-b.top)*(this.target.height/b.height)/this.resolution;for(var c=this.interactiveItems.length,d=0;c>d;d++){var e=this.interactiveItems[d];e.mousemove&&e.mousemove(this.mouse)}},b.InteractionManager.prototype.onMouseDown=function(a){this.dirty&&this.rebuildInteractiveGraph(),this.mouse.originalEvent=a,b.AUTO_PREVENT_DEFAULT&&this.mouse.originalEvent.preventDefault();for(var c=this.interactiveItems.length,d=this.mouse.originalEvent,e=2===d.button||3===d.which,f=e?"rightdown":"mousedown",g=e?"rightclick":"click",h=e?"__rightIsDown":"__mouseIsDown",i=e?"__isRightDown":"__isDown",j=0;c>j;j++){var k=this.interactiveItems[j];if((k[f]||k[g])&&(k[h]=!0,k.__hit=this.hitTest(k,this.mouse),k.__hit&&(k[f]&&k[f](this.mouse),k[i]=!0,!k.interactiveChildren)))break}},b.InteractionManager.prototype.onMouseOut=function(a){this.dirty&&this.rebuildInteractiveGraph(),this.mouse.originalEvent=a;var b=this.interactiveItems.length;this.interactionDOMElement.style.cursor="inherit";for(var c=0;b>c;c++){var d=this.interactiveItems[c];d.__isOver&&(this.mouse.target=d,d.mouseout&&d.mouseout(this.mouse),d.__isOver=!1)}this.mouseOut=!0,this.mouse.global.x=-1e4,this.mouse.global.y=-1e4},b.InteractionManager.prototype.onMouseUp=function(a){this.dirty&&this.rebuildInteractiveGraph(),this.mouse.originalEvent=a;for(var b=this.interactiveItems.length,c=!1,d=this.mouse.originalEvent,e=2===d.button||3===d.which,f=e?"rightup":"mouseup",g=e?"rightclick":"click",h=e?"rightupoutside":"mouseupoutside",i=e?"__isRightDown":"__isDown",j=0;b>j;j++){var k=this.interactiveItems[j];(k[g]||k[f]||k[h])&&(k.__hit=this.hitTest(k,this.mouse),k.__hit&&!c?(k[f]&&k[f](this.mouse),k[i]&&k[g]&&k[g](this.mouse),k.interactiveChildren||(c=!0)):k[i]&&k[h]&&k[h](this.mouse),k[i]=!1)}},b.InteractionManager.prototype.hitTest=function(a,c){var d=c.global;if(!a.worldVisible)return!1;a.worldTransform.applyInverse(d,this._tempPoint);var e,f=this._tempPoint.x,g=this._tempPoint.y;if(c.target=a,a.hitArea&&a.hitArea.contains)return a.hitArea.contains(f,g);if(a instanceof b.Sprite){var h,i=a.texture.frame.width,j=a.texture.frame.height,k=-i*a.anchor.x;if(f>k&&k+i>f&&(h=-j*a.anchor.y,g>h&&h+j>g))return!0}else if(a instanceof b.Graphics){var l=a.graphicsData;for(e=0;e<l.length;e++){var m=l[e];if(m.fill&&m.shape&&m.shape.contains(f,g))return!0}}var n=a.children.length;for(e=0;n>e;e++){var o=a.children[e],p=this.hitTest(o,c);if(p)return c.target=a,!0}return!1},b.InteractionManager.prototype.onTouchMove=function(a){this.dirty&&this.rebuildInteractiveGraph();var b,c=this.interactionDOMElement.getBoundingClientRect(),d=a.changedTouches,e=0;for(e=0;e<d.length;e++){var f=d[e];b=this.touches[f.identifier],b.originalEvent=a,b.global.x=(f.clientX-c.left)*(this.target.width/c.width)/this.resolution,b.global.y=(f.clientY-c.top)*(this.target.height/c.height)/this.resolution,!navigator.isCocoonJS||c.left||c.top||a.target.style.width||a.target.style.height||(b.global.x=f.clientX,b.global.y=f.clientY);for(var g=0;g<this.interactiveItems.length;g++){var h=this.interactiveItems[g];h.touchmove&&h.__touchData&&h.__touchData[f.identifier]&&h.touchmove(b)}}},b.InteractionManager.prototype.onTouchStart=function(a){this.dirty&&this.rebuildInteractiveGraph();var c=this.interactionDOMElement.getBoundingClientRect();b.AUTO_PREVENT_DEFAULT&&a.preventDefault();for(var d=a.changedTouches,e=0;e<d.length;e++){var f=d[e],g=this.pool.pop();g||(g=new b.InteractionData),g.originalEvent=a,this.touches[f.identifier]=g,g.global.x=(f.clientX-c.left)*(this.target.width/c.width)/this.resolution,g.global.y=(f.clientY-c.top)*(this.target.height/c.height)/this.resolution,!navigator.isCocoonJS||c.left||c.top||a.target.style.width||a.target.style.height||(g.global.x=f.clientX,g.global.y=f.clientY);for(var h=this.interactiveItems.length,i=0;h>i;i++){var j=this.interactiveItems[i];if((j.touchstart||j.tap)&&(j.__hit=this.hitTest(j,g),j.__hit&&(j.touchstart&&j.touchstart(g),j.__isDown=!0,j.__touchData=j.__touchData||{},j.__touchData[f.identifier]=g,!j.interactiveChildren)))break}}},b.InteractionManager.prototype.onTouchEnd=function(a){this.dirty&&this.rebuildInteractiveGraph();for(var b=this.interactionDOMElement.getBoundingClientRect(),c=a.changedTouches,d=0;d<c.length;d++){var e=c[d],f=this.touches[e.identifier],g=!1;f.global.x=(e.clientX-b.left)*(this.target.width/b.width)/this.resolution,f.global.y=(e.clientY-b.top)*(this.target.height/b.height)/this.resolution,!navigator.isCocoonJS||b.left||b.top||a.target.style.width||a.target.style.height||(f.global.x=e.clientX,f.global.y=e.clientY);for(var h=this.interactiveItems.length,i=0;h>i;i++){var j=this.interactiveItems[i];j.__touchData&&j.__touchData[e.identifier]&&(j.__hit=this.hitTest(j,j.__touchData[e.identifier]),f.originalEvent=a,(j.touchend||j.tap)&&(j.__hit&&!g?(j.touchend&&j.touchend(f),j.__isDown&&j.tap&&j.tap(f),j.interactiveChildren||(g=!0)):j.__isDown&&j.touchendoutside&&j.touchendoutside(f),j.__isDown=!1),j.__touchData[e.identifier]=null)}this.pool.push(f),this.touches[e.identifier]=null}},b.Stage=function(a){b.DisplayObjectContainer.call(this),this.worldTransform=new b.Matrix,this.interactive=!0,this.interactionManager=new b.InteractionManager(this),this.dirty=!0,this.stage=this,this.stage.hitArea=new b.Rectangle(0,0,1e5,1e5),this.setBackgroundColor(a)},b.Stage.prototype=Object.create(b.DisplayObjectContainer.prototype),b.Stage.prototype.constructor=b.Stage,b.Stage.prototype.setInteractionDelegate=function(a){this.interactionManager.setTargetDomElement(a)},b.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var a=0,b=this.children.length;b>a;a++)this.children[a].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},b.Stage.prototype.setBackgroundColor=function(a){this.backgroundColor=a||0,this.backgroundColorSplit=b.hex2rgb(this.backgroundColor);var c=this.backgroundColor.toString(16);c="000000".substr(0,6-c.length)+c,this.backgroundColorString="#"+c},b.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},function(a){for(var b=0,c=["ms","moz","webkit","o"],d=0;d<c.length&&!a.requestAnimationFrame;++d)a.requestAnimationFrame=a[c[d]+"RequestAnimationFrame"],a.cancelAnimationFrame=a[c[d]+"CancelAnimationFrame"]||a[c[d]+"CancelRequestAnimationFrame"];a.requestAnimationFrame||(a.requestAnimationFrame=function(c){var d=(new Date).getTime(),e=Math.max(0,16-(d-b)),f=a.setTimeout(function(){c(d+e)},e);return b=d+e,f}),a.cancelAnimationFrame||(a.cancelAnimationFrame=function(a){clearTimeout(a)}),a.requestAnimFrame=a.requestAnimationFrame}(this),b.hex2rgb=function(a){return[(a>>16&255)/255,(a>>8&255)/255,(255&a)/255]},b.rgb2hex=function(a){return(255*a[0]<<16)+(255*a[1]<<8)+255*a[2]},"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){return function(a){function b(){for(var d=arguments.length,f=new Array(d);d--;)f[d]=arguments[d];return f=e.concat(f),c.apply(this instanceof b?this:a,f)}var c=this,d=arguments.length-1,e=[];if(d>0)for(e.length=d;d--;)e[d]=arguments[d+1];if("function"!=typeof c)throw new TypeError;return b.prototype=function f(a){return a&&(f.prototype=a),this instanceof f?void 0:new f}(c.prototype),b}}()),b.AjaxRequest=function(){var a=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new window.XMLHttpRequest:!1;for(var b=0;b<a.length;b++)try{return new window.ActiveXObject(a[b])}catch(c){}},b.canUseNewCanvasBlendModes=function(){if("undefined"==typeof document)return!1;var a=document.createElement("canvas");a.width=1,a.height=1;var b=a.getContext("2d");return b.fillStyle="#000",b.fillRect(0,0,1,1),b.globalCompositeOperation="multiply",b.fillStyle="#fff",b.fillRect(0,0,1,1),0===b.getImageData(0,0,1,1).data[0]},b.getNextPowerOfTwo=function(a){if(a>0&&0===(a&a-1))return a;for(var b=1;a>b;)b<<=1;return b},b.isPowerOfTwo=function(a,b){return a>0&&0===(a&a-1)&&b>0&&0===(b&b-1)},b.EventTarget={call:function(a){a&&(a=a.prototype||a,b.EventTarget.mixin(a))},mixin:function(a){a.listeners=function(a){return this._listeners=this._listeners||{},this._listeners[a]?this._listeners[a].slice():[]},a.emit=a.dispatchEvent=function(a,c){if(this._listeners=this._listeners||{},"object"==typeof a&&(c=a,a=a.type),c&&c.__isEventObject===!0||(c=new b.Event(this,a,c)),this._listeners&&this._listeners[a]){var d,e=this._listeners[a].slice(0),f=e.length,g=e[0];for(d=0;f>d;g=e[++d])if(g.call(this,c),c.stoppedImmediate)return this;if(c.stopped)return this}return this.parent&&this.parent.emit&&this.parent.emit.call(this.parent,a,c),this},a.on=a.addEventListener=function(a,b){return this._listeners=this._listeners||{},(this._listeners[a]=this._listeners[a]||[]).push(b),this},a.once=function(a,b){function c(){b.apply(d.off(a,c),arguments)}this._listeners=this._listeners||{};var d=this;return c._originalHandler=b,this.on(a,c)},a.off=a.removeEventListener=function(a,b){if(this._listeners=this._listeners||{},!this._listeners[a])return this;for(var c=this._listeners[a],d=b?c.length:0;d-->0;)(c[d]===b||c[d]._originalHandler===b)&&c.splice(d,1);return 0===c.length&&delete this._listeners[a],this},a.removeAllListeners=function(a){return this._listeners=this._listeners||{},this._listeners[a]?(delete this._listeners[a],this):this}}},b.Event=function(a,b,c){this.__isEventObject=!0,this.stopped=!1,this.stoppedImmediate=!1,this.target=a,this.type=b,this.data=c,this.content=c,this.timeStamp=Date.now()},b.Event.prototype.stopPropagation=function(){this.stopped=!0},b.Event.prototype.stopImmediatePropagation=function(){this.stoppedImmediate=!0},b.autoDetectRenderer=function(a,c,d){a||(a=800),c||(c=600);var e=function(){try{var a=document.createElement("canvas");return!!window.WebGLRenderingContext&&(a.getContext("webgl")||a.getContext("experimental-webgl"))}catch(b){return!1}}();return e?new b.WebGLRenderer(a,c,d):new b.CanvasRenderer(a,c,d)},b.autoDetectRecommendedRenderer=function(a,c,d){a||(a=800),c||(c=600);var e=function(){try{var a=document.createElement("canvas");return!!window.WebGLRenderingContext&&(a.getContext("webgl")||a.getContext("experimental-webgl"))}catch(b){return!1}}(),f=/Android/i.test(navigator.userAgent);return e&&!f?new b.WebGLRenderer(a,c,d):new b.CanvasRenderer(a,c,d)},b.PolyK={},b.PolyK.Triangulate=function(a){var c=!0,d=a.length>>1;if(3>d)return[];for(var e=[],f=[],g=0;d>g;g++)f.push(g);g=0;for(var h=d;h>3;){var i=f[(g+0)%h],j=f[(g+1)%h],k=f[(g+2)%h],l=a[2*i],m=a[2*i+1],n=a[2*j],o=a[2*j+1],p=a[2*k],q=a[2*k+1],r=!1;if(b.PolyK._convex(l,m,n,o,p,q,c)){r=!0;for(var s=0;h>s;s++){var t=f[s];if(t!==i&&t!==j&&t!==k&&b.PolyK._PointInTriangle(a[2*t],a[2*t+1],l,m,n,o,p,q)){r=!1;break}}}if(r)e.push(i,j,k),f.splice((g+1)%h,1),h--,g=0;else if(g++>3*h){if(!c)return null;for(e=[],f=[],g=0;d>g;g++)f.push(g);g=0,h=d,c=!1}}return e.push(f[0],f[1],f[2]),e},b.PolyK._PointInTriangle=function(a,b,c,d,e,f,g,h){var i=g-c,j=h-d,k=e-c,l=f-d,m=a-c,n=b-d,o=i*i+j*j,p=i*k+j*l,q=i*m+j*n,r=k*k+l*l,s=k*m+l*n,t=1/(o*r-p*p),u=(r*q-p*s)*t,v=(o*s-p*q)*t;return u>=0&&v>=0&&1>u+v},b.PolyK._convex=function(a,b,c,d,e,f,g){return(b-d)*(e-c)+(c-a)*(f-d)>=0===g},b.initDefaultShaders=function(){},b.CompileVertexShader=function(a,c){return b._CompileShader(a,c,a.VERTEX_SHADER)},b.CompileFragmentShader=function(a,c){return b._CompileShader(a,c,a.FRAGMENT_SHADER)},b._CompileShader=function(a,b,c){var d=b.join("\n"),e=a.createShader(c);return a.shaderSource(e,d),a.compileShader(e),a.getShaderParameter(e,a.COMPILE_STATUS)?e:(window.console.log(a.getShaderInfoLog(e)),null)},b.compileProgram=function(a,c,d){var e=b.CompileFragmentShader(a,d),f=b.CompileVertexShader(a,c),g=a.createProgram();return a.attachShader(g,f),a.attachShader(g,e),a.linkProgram(g),a.getProgramParameter(g,a.LINK_STATUS)||window.console.log("Could not initialise shaders"),g},b.PixiShader=function(a){this._UID=b._UID++,this.gl=a,this.program=null,this.fragmentSrc=["precision lowp float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform sampler2D uSampler;","void main(void) {","   gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor ;","}"],this.textureCount=0,this.firstRun=!0,this.dirty=!0,this.attributes=[],this.init()},b.PixiShader.prototype.constructor=b.PixiShader,b.PixiShader.prototype.init=function(){var a=this.gl,c=b.compileProgram(a,this.vertexSrc||b.PixiShader.defaultVertexSrc,this.fragmentSrc);a.useProgram(c),this.uSampler=a.getUniformLocation(c,"uSampler"),this.projectionVector=a.getUniformLocation(c,"projectionVector"),this.offsetVector=a.getUniformLocation(c,"offsetVector"),this.dimensions=a.getUniformLocation(c,"dimensions"),this.aVertexPosition=a.getAttribLocation(c,"aVertexPosition"),this.aTextureCoord=a.getAttribLocation(c,"aTextureCoord"),this.colorAttribute=a.getAttribLocation(c,"aColor"),-1===this.colorAttribute&&(this.colorAttribute=2),this.attributes=[this.aVertexPosition,this.aTextureCoord,this.colorAttribute];for(var d in this.uniforms)this.uniforms[d].uniformLocation=a.getUniformLocation(c,d);this.initUniforms(),this.program=c},b.PixiShader.prototype.initUniforms=function(){this.textureCount=1;var a,b=this.gl;for(var c in this.uniforms){a=this.uniforms[c];var d=a.type;"sampler2D"===d?(a._init=!1,null!==a.value&&this.initSampler2D(a)):"mat2"===d||"mat3"===d||"mat4"===d?(a.glMatrix=!0,a.glValueLength=1,"mat2"===d?a.glFunc=b.uniformMatrix2fv:"mat3"===d?a.glFunc=b.uniformMatrix3fv:"mat4"===d&&(a.glFunc=b.uniformMatrix4fv)):(a.glFunc=b["uniform"+d],a.glValueLength="2f"===d||"2i"===d?2:"3f"===d||"3i"===d?3:"4f"===d||"4i"===d?4:1)}},b.PixiShader.prototype.initSampler2D=function(a){if(a.value&&a.value.baseTexture&&a.value.baseTexture.hasLoaded){var b=this.gl;if(b.activeTexture(b["TEXTURE"+this.textureCount]),b.bindTexture(b.TEXTURE_2D,a.value.baseTexture._glTextures[b.id]),a.textureData){var c=a.textureData,d=c.magFilter?c.magFilter:b.LINEAR,e=c.minFilter?c.minFilter:b.LINEAR,f=c.wrapS?c.wrapS:b.CLAMP_TO_EDGE,g=c.wrapT?c.wrapT:b.CLAMP_TO_EDGE,h=c.luminance?b.LUMINANCE:b.RGBA;if(c.repeat&&(f=b.REPEAT,g=b.REPEAT),b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!!c.flipY),c.width){var i=c.width?c.width:512,j=c.height?c.height:2,k=c.border?c.border:0;b.texImage2D(b.TEXTURE_2D,0,h,i,j,k,h,b.UNSIGNED_BYTE,null)}else b.texImage2D(b.TEXTURE_2D,0,h,b.RGBA,b.UNSIGNED_BYTE,a.value.baseTexture.source);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,d),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,e),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,f),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,g)}b.uniform1i(a.uniformLocation,this.textureCount),a._init=!0,this.textureCount++}},b.PixiShader.prototype.syncUniforms=function(){this.textureCount=1;var a,c=this.gl;for(var d in this.uniforms)a=this.uniforms[d],1===a.glValueLength?a.glMatrix===!0?a.glFunc.call(c,a.uniformLocation,a.transpose,a.value):a.glFunc.call(c,a.uniformLocation,a.value):2===a.glValueLength?a.glFunc.call(c,a.uniformLocation,a.value.x,a.value.y):3===a.glValueLength?a.glFunc.call(c,a.uniformLocation,a.value.x,a.value.y,a.value.z):4===a.glValueLength?a.glFunc.call(c,a.uniformLocation,a.value.x,a.value.y,a.value.z,a.value.w):"sampler2D"===a.type&&(a._init?(c.activeTexture(c["TEXTURE"+this.textureCount]),a.value.baseTexture._dirty[c.id]?b.instances[c.id].updateTexture(a.value.baseTexture):c.bindTexture(c.TEXTURE_2D,a.value.baseTexture._glTextures[c.id]),c.uniform1i(a.uniformLocation,this.textureCount),this.textureCount++):this.initSampler2D(a))},b.PixiShader.prototype.destroy=function(){this.gl.deleteProgram(this.program),this.uniforms=null,this.gl=null,this.attributes=null},b.PixiShader.defaultVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute vec4 aColor;","uniform vec2 projectionVector;","uniform vec2 offsetVector;","varying vec2 vTextureCoord;","varying vec4 vColor;","const vec2 center = vec2(-1.0, 1.0);","void main(void) {","   gl_Position = vec4( ((aVertexPosition + offsetVector) / projectionVector) + center , 0.0, 1.0);","   vTextureCoord = aTextureCoord;","   vColor = vec4(aColor.rgb * aColor.a, aColor.a);","}"],b.PixiFastShader=function(a){this._UID=b._UID++,this.gl=a,this.program=null,this.fragmentSrc=["precision lowp float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","   gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor ;","}"],this.vertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aPositionCoord;","attribute vec2 aScale;","attribute float aRotation;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform vec2 projectionVector;","uniform vec2 offsetVector;","uniform mat3 uMatrix;","varying vec2 vTextureCoord;","varying float vColor;","const vec2 center = vec2(-1.0, 1.0);","void main(void) {","   vec2 v;","   vec2 sv = aVertexPosition * aScale;","   v.x = (sv.x) * cos(aRotation) - (sv.y) * sin(aRotation);","   v.y = (sv.x) * sin(aRotation) + (sv.y) * cos(aRotation);","   v = ( uMatrix * vec3(v + aPositionCoord , 1.0) ).xy ;","   gl_Position = vec4( ( v / projectionVector) + center , 0.0, 1.0);","   vTextureCoord = aTextureCoord;","   vColor = aColor;","}"],this.textureCount=0,this.init()},b.PixiFastShader.prototype.constructor=b.PixiFastShader,b.PixiFastShader.prototype.init=function(){var a=this.gl,c=b.compileProgram(a,this.vertexSrc,this.fragmentSrc);a.useProgram(c),this.uSampler=a.getUniformLocation(c,"uSampler"),this.projectionVector=a.getUniformLocation(c,"projectionVector"),this.offsetVector=a.getUniformLocation(c,"offsetVector"),this.dimensions=a.getUniformLocation(c,"dimensions"),this.uMatrix=a.getUniformLocation(c,"uMatrix"),this.aVertexPosition=a.getAttribLocation(c,"aVertexPosition"),this.aPositionCoord=a.getAttribLocation(c,"aPositionCoord"),this.aScale=a.getAttribLocation(c,"aScale"),this.aRotation=a.getAttribLocation(c,"aRotation"),this.aTextureCoord=a.getAttribLocation(c,"aTextureCoord"),this.colorAttribute=a.getAttribLocation(c,"aColor"),-1===this.colorAttribute&&(this.colorAttribute=2),this.attributes=[this.aVertexPosition,this.aPositionCoord,this.aScale,this.aRotation,this.aTextureCoord,this.colorAttribute],this.program=c},b.PixiFastShader.prototype.destroy=function(){this.gl.deleteProgram(this.program),this.uniforms=null,this.gl=null,this.attributes=null},b.StripShader=function(a){this._UID=b._UID++,this.gl=a,this.program=null,this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","uniform float alpha;","uniform sampler2D uSampler;","void main(void) {","   gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * alpha;","}"],this.vertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","uniform vec2 offsetVector;","varying vec2 vTextureCoord;","void main(void) {","   vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);","   v -= offsetVector.xyx;","   gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);","   vTextureCoord = aTextureCoord;","}"],this.init()},b.StripShader.prototype.constructor=b.StripShader,b.StripShader.prototype.init=function(){var a=this.gl,c=b.compileProgram(a,this.vertexSrc,this.fragmentSrc);a.useProgram(c),this.uSampler=a.getUniformLocation(c,"uSampler"),this.projectionVector=a.getUniformLocation(c,"projectionVector"),this.offsetVector=a.getUniformLocation(c,"offsetVector"),this.colorAttribute=a.getAttribLocation(c,"aColor"),this.aVertexPosition=a.getAttribLocation(c,"aVertexPosition"),this.aTextureCoord=a.getAttribLocation(c,"aTextureCoord"),this.attributes=[this.aVertexPosition,this.aTextureCoord],this.translationMatrix=a.getUniformLocation(c,"translationMatrix"),this.alpha=a.getUniformLocation(c,"alpha"),this.program=c},b.StripShader.prototype.destroy=function(){this.gl.deleteProgram(this.program),this.uniforms=null,this.gl=null,this.attribute=null},b.PrimitiveShader=function(a){this._UID=b._UID++,this.gl=a,this.program=null,this.fragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","   gl_FragColor = vColor;","}"],this.vertexSrc=["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","uniform vec2 offsetVector;","uniform float alpha;","uniform float flipY;","uniform vec3 tint;","varying vec4 vColor;","void main(void) {","   vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);","   v -= offsetVector.xyx;","   gl_Position = vec4( v.x / projectionVector.x -1.0, (v.y / projectionVector.y * -flipY) + flipY , 0.0, 1.0);","   vColor = aColor * vec4(tint * alpha, alpha);","}"],this.init()},b.PrimitiveShader.prototype.constructor=b.PrimitiveShader,b.PrimitiveShader.prototype.init=function(){var a=this.gl,c=b.compileProgram(a,this.vertexSrc,this.fragmentSrc);a.useProgram(c),this.projectionVector=a.getUniformLocation(c,"projectionVector"),this.offsetVector=a.getUniformLocation(c,"offsetVector"),this.tintColor=a.getUniformLocation(c,"tint"),this.flipY=a.getUniformLocation(c,"flipY"),this.aVertexPosition=a.getAttribLocation(c,"aVertexPosition"),this.colorAttribute=a.getAttribLocation(c,"aColor"),this.attributes=[this.aVertexPosition,this.colorAttribute],this.translationMatrix=a.getUniformLocation(c,"translationMatrix"),this.alpha=a.getUniformLocation(c,"alpha"),this.program=c},b.PrimitiveShader.prototype.destroy=function(){this.gl.deleteProgram(this.program),this.uniforms=null,this.gl=null,this.attributes=null},b.ComplexPrimitiveShader=function(a){this._UID=b._UID++,this.gl=a,this.program=null,this.fragmentSrc=["precision mediump float;","varying vec4 vColor;","void main(void) {","   gl_FragColor = vColor;","}"],this.vertexSrc=["attribute vec2 aVertexPosition;","uniform mat3 translationMatrix;","uniform vec2 projectionVector;","uniform vec2 offsetVector;","uniform vec3 tint;","uniform float alpha;","uniform vec3 color;","uniform float flipY;","varying vec4 vColor;","void main(void) {","   vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);","   v -= offsetVector.xyx;","   gl_Position = vec4( v.x / projectionVector.x -1.0, (v.y / projectionVector.y * -flipY) + flipY , 0.0, 1.0);","   vColor = vec4(color * alpha * tint, alpha);","}"],this.init()},b.ComplexPrimitiveShader.prototype.constructor=b.ComplexPrimitiveShader,b.ComplexPrimitiveShader.prototype.init=function(){var a=this.gl,c=b.compileProgram(a,this.vertexSrc,this.fragmentSrc);a.useProgram(c),this.projectionVector=a.getUniformLocation(c,"projectionVector"),this.offsetVector=a.getUniformLocation(c,"offsetVector"),this.tintColor=a.getUniformLocation(c,"tint"),this.color=a.getUniformLocation(c,"color"),this.flipY=a.getUniformLocation(c,"flipY"),this.aVertexPosition=a.getAttribLocation(c,"aVertexPosition"),this.attributes=[this.aVertexPosition,this.colorAttribute],this.translationMatrix=a.getUniformLocation(c,"translationMatrix"),this.alpha=a.getUniformLocation(c,"alpha"),this.program=c},b.ComplexPrimitiveShader.prototype.destroy=function(){this.gl.deleteProgram(this.program),this.uniforms=null,this.gl=null,this.attribute=null},b.WebGLGraphics=function(){},b.WebGLGraphics.renderGraphics=function(a,c){var d,e=c.gl,f=c.projection,g=c.offset,h=c.shaderManager.primitiveShader;a.dirty&&b.WebGLGraphics.updateGraphics(a,e);for(var i=a._webGL[e.id],j=0;j<i.data.length;j++)1===i.data[j].mode?(d=i.data[j],c.stencilManager.pushStencil(a,d,c),e.drawElements(e.TRIANGLE_FAN,4,e.UNSIGNED_SHORT,2*(d.indices.length-4)),c.stencilManager.popStencil(a,d,c)):(d=i.data[j],c.shaderManager.setShader(h),h=c.shaderManager.primitiveShader,e.uniformMatrix3fv(h.translationMatrix,!1,a.worldTransform.toArray(!0)),e.uniform1f(h.flipY,1),e.uniform2f(h.projectionVector,f.x,-f.y),e.uniform2f(h.offsetVector,-g.x,-g.y),e.uniform3fv(h.tintColor,b.hex2rgb(a.tint)),e.uniform1f(h.alpha,a.worldAlpha),e.bindBuffer(e.ARRAY_BUFFER,d.buffer),e.vertexAttribPointer(h.aVertexPosition,2,e.FLOAT,!1,24,0),e.vertexAttribPointer(h.colorAttribute,4,e.FLOAT,!1,24,8),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,d.indexBuffer),e.drawElements(e.TRIANGLE_STRIP,d.indices.length,e.UNSIGNED_SHORT,0))},b.WebGLGraphics.updateGraphics=function(a,c){var d=a._webGL[c.id];d||(d=a._webGL[c.id]={lastIndex:0,data:[],gl:c}),a.dirty=!1;var e;if(a.clearDirty){for(a.clearDirty=!1,e=0;e<d.data.length;e++){var f=d.data[e];f.reset(),b.WebGLGraphics.graphicsDataPool.push(f)}d.data=[],d.lastIndex=0}var g;for(e=d.lastIndex;e<a.graphicsData.length;e++){var h=a.graphicsData[e];if(h.type===b.Graphics.POLY){if(h.points=h.shape.points.slice(),h.shape.closed&&(h.points[0]!==h.points[h.points.length-2]||h.points[1]!==h.points[h.points.length-1])&&h.points.push(h.points[0],h.points[1]),h.fill&&h.points.length>=6)if(h.points.length<12){g=b.WebGLGraphics.switchMode(d,0);var i=b.WebGLGraphics.buildPoly(h,g);i||(g=b.WebGLGraphics.switchMode(d,1),b.WebGLGraphics.buildComplexPoly(h,g))}else g=b.WebGLGraphics.switchMode(d,1),b.WebGLGraphics.buildComplexPoly(h,g);h.lineWidth>0&&(g=b.WebGLGraphics.switchMode(d,0),b.WebGLGraphics.buildLine(h,g))}else g=b.WebGLGraphics.switchMode(d,0),h.type===b.Graphics.RECT?b.WebGLGraphics.buildRectangle(h,g):h.type===b.Graphics.CIRC||h.type===b.Graphics.ELIP?b.WebGLGraphics.buildCircle(h,g):h.type===b.Graphics.RREC&&b.WebGLGraphics.buildRoundedRectangle(h,g);d.lastIndex++}for(e=0;e<d.data.length;e++)g=d.data[e],g.dirty&&g.upload()},b.WebGLGraphics.switchMode=function(a,c){var d;return a.data.length?(d=a.data[a.data.length-1],(d.mode!==c||1===c)&&(d=b.WebGLGraphics.graphicsDataPool.pop()||new b.WebGLGraphicsData(a.gl),d.mode=c,a.data.push(d))):(d=b.WebGLGraphics.graphicsDataPool.pop()||new b.WebGLGraphicsData(a.gl),d.mode=c,a.data.push(d)),d.dirty=!0,d},b.WebGLGraphics.buildRectangle=function(a,c){var d=a.shape,e=d.x,f=d.y,g=d.width,h=d.height;if(a.fill){var i=b.hex2rgb(a.fillColor),j=a.fillAlpha,k=i[0]*j,l=i[1]*j,m=i[2]*j,n=c.points,o=c.indices,p=n.length/6;n.push(e,f),n.push(k,l,m,j),n.push(e+g,f),n.push(k,l,m,j),n.push(e,f+h),n.push(k,l,m,j),n.push(e+g,f+h),n.push(k,l,m,j),o.push(p,p,p+1,p+2,p+3,p+3)}if(a.lineWidth){var q=a.points;a.points=[e,f,e+g,f,e+g,f+h,e,f+h,e,f],b.WebGLGraphics.buildLine(a,c),a.points=q}},b.WebGLGraphics.buildRoundedRectangle=function(a,c){var d=a.shape,e=d.x,f=d.y,g=d.width,h=d.height,i=d.radius,j=[];if(j.push(e,f+i),j=j.concat(b.WebGLGraphics.quadraticBezierCurve(e,f+h-i,e,f+h,e+i,f+h)),j=j.concat(b.WebGLGraphics.quadraticBezierCurve(e+g-i,f+h,e+g,f+h,e+g,f+h-i)),j=j.concat(b.WebGLGraphics.quadraticBezierCurve(e+g,f+i,e+g,f,e+g-i,f)),j=j.concat(b.WebGLGraphics.quadraticBezierCurve(e+i,f,e,f,e,f+i)),a.fill){var k=b.hex2rgb(a.fillColor),l=a.fillAlpha,m=k[0]*l,n=k[1]*l,o=k[2]*l,p=c.points,q=c.indices,r=p.length/6,s=b.PolyK.Triangulate(j),t=0;for(t=0;t<s.length;t+=3)q.push(s[t]+r),q.push(s[t]+r),q.push(s[t+1]+r),q.push(s[t+2]+r),q.push(s[t+2]+r);for(t=0;t<j.length;t++)p.push(j[t],j[++t],m,n,o,l)}if(a.lineWidth){var u=a.points;a.points=j,b.WebGLGraphics.buildLine(a,c),a.points=u}},b.WebGLGraphics.quadraticBezierCurve=function(a,b,c,d,e,f){function g(a,b,c){var d=b-a;return a+d*c}for(var h,i,j,k,l,m,n=20,o=[],p=0,q=0;n>=q;q++)p=q/n,h=g(a,c,p),i=g(b,d,p),j=g(c,e,p),k=g(d,f,p),l=g(h,j,p),m=g(i,k,p),o.push(l,m);return o},b.WebGLGraphics.buildCircle=function(a,c){var d,e,f=a.shape,g=f.x,h=f.y;a.type===b.Graphics.CIRC?(d=f.radius,e=f.radius):(d=f.width,e=f.height);var i=40,j=2*Math.PI/i,k=0;if(a.fill){var l=b.hex2rgb(a.fillColor),m=a.fillAlpha,n=l[0]*m,o=l[1]*m,p=l[2]*m,q=c.points,r=c.indices,s=q.length/6;for(r.push(s),k=0;i+1>k;k++)q.push(g,h,n,o,p,m),q.push(g+Math.sin(j*k)*d,h+Math.cos(j*k)*e,n,o,p,m),r.push(s++,s++);r.push(s-1)}if(a.lineWidth){var t=a.points;for(a.points=[],k=0;i+1>k;k++)a.points.push(g+Math.sin(j*k)*d,h+Math.cos(j*k)*e);b.WebGLGraphics.buildLine(a,c),a.points=t}},b.WebGLGraphics.buildLine=function(a,c){var d=0,e=a.points;if(0!==e.length){if(a.lineWidth%2)for(d=0;d<e.length;d++)e[d]+=.5;var f=new b.Point(e[0],e[1]),g=new b.Point(e[e.length-2],e[e.length-1]);if(f.x===g.x&&f.y===g.y){e=e.slice(),e.pop(),e.pop(),g=new b.Point(e[e.length-2],e[e.length-1]);var h=g.x+.5*(f.x-g.x),i=g.y+.5*(f.y-g.y);e.unshift(h,i),e.push(h,i)}var j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G=c.points,H=c.indices,I=e.length/2,J=e.length,K=G.length/6,L=a.lineWidth/2,M=b.hex2rgb(a.lineColor),N=a.lineAlpha,O=M[0]*N,P=M[1]*N,Q=M[2]*N;for(l=e[0],m=e[1],n=e[2],o=e[3],r=-(m-o),s=l-n,F=Math.sqrt(r*r+s*s),r/=F,s/=F,r*=L,s*=L,G.push(l-r,m-s,O,P,Q,N),G.push(l+r,m+s,O,P,Q,N),d=1;I-1>d;d++)l=e[2*(d-1)],m=e[2*(d-1)+1],n=e[2*d],o=e[2*d+1],p=e[2*(d+1)],q=e[2*(d+1)+1],r=-(m-o),s=l-n,F=Math.sqrt(r*r+s*s),r/=F,s/=F,r*=L,s*=L,t=-(o-q),u=n-p,F=Math.sqrt(t*t+u*u),t/=F,u/=F,t*=L,u*=L,x=-s+m-(-s+o),y=-r+n-(-r+l),z=(-r+l)*(-s+o)-(-r+n)*(-s+m),A=-u+q-(-u+o),B=-t+n-(-t+p),C=(-t+p)*(-u+o)-(-t+n)*(-u+q),D=x*B-A*y,Math.abs(D)<.1?(D+=10.1,G.push(n-r,o-s,O,P,Q,N),G.push(n+r,o+s,O,P,Q,N)):(j=(y*C-B*z)/D,k=(A*z-x*C)/D,E=(j-n)*(j-n)+(k-o)+(k-o),E>19600?(v=r-t,w=s-u,F=Math.sqrt(v*v+w*w),v/=F,w/=F,v*=L,w*=L,G.push(n-v,o-w),G.push(O,P,Q,N),G.push(n+v,o+w),G.push(O,P,Q,N),G.push(n-v,o-w),G.push(O,P,Q,N),J++):(G.push(j,k),G.push(O,P,Q,N),G.push(n-(j-n),o-(k-o)),G.push(O,P,Q,N)));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16602
for(l=e[2*(I-2)],m=e[2*(I-2)+1],n=e[2*(I-1)],o=e[2*(I-1)+1],r=-(m-o),s=l-n,F=Math.sqrt(r*r+s*s),r/=F,s/=F,r*=L,s*=L,G.push(n-r,o-s),G.push(O,P,Q,N),G.push(n+r,o+s),G.push(O,P,Q,N),H.push(K),d=0;J>d;d++)H.push(K++);H.push(K-1)}},b.WebGLGraphics.buildComplexPoly=function(a,c){var d=a.points.slice();if(!(d.length<6)){var e=c.indices;c.points=d,c.alpha=a.fillAlpha,c.color=b.hex2rgb(a.fillColor);for(var f,g,h=1/0,i=-1/0,j=1/0,k=-1/0,l=0;l<d.length;l+=2)f=d[l],g=d[l+1],h=h>f?f:h,i=f>i?f:i,j=j>g?g:j,k=g>k?g:k;d.push(h,j,i,j,i,k,h,k);var m=d.length/2;for(l=0;m>l;l++)e.push(l)}},b.WebGLGraphics.buildPoly=function(a,c){var d=a.points;if(!(d.length<6)){var e=c.points,f=c.indices,g=d.length/2,h=b.hex2rgb(a.fillColor),i=a.fillAlpha,j=h[0]*i,k=h[1]*i,l=h[2]*i,m=b.PolyK.Triangulate(d);if(!m)return!1;var n=e.length/6,o=0;for(o=0;o<m.length;o+=3)f.push(m[o]+n),f.push(m[o]+n),f.push(m[o+1]+n),f.push(m[o+2]+n),f.push(m[o+2]+n);for(o=0;g>o;o++)e.push(d[2*o],d[2*o+1],j,k,l,i);return!0}},b.WebGLGraphics.graphicsDataPool=[],b.WebGLGraphicsData=function(a){this.gl=a,this.color=[0,0,0],this.points=[],this.indices=[],this.buffer=a.createBuffer(),this.indexBuffer=a.createBuffer(),this.mode=1,this.alpha=1,this.dirty=!0},b.WebGLGraphicsData.prototype.reset=function(){this.points=[],this.indices=[]},b.WebGLGraphicsData.prototype.upload=function(){var a=this.gl;this.glPoints=new b.Float32Array(this.points),a.bindBuffer(a.ARRAY_BUFFER,this.buffer),a.bufferData(a.ARRAY_BUFFER,this.glPoints,a.STATIC_DRAW),this.glIndicies=new b.Uint16Array(this.indices),a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,this.indexBuffer),a.bufferData(a.ELEMENT_ARRAY_BUFFER,this.glIndicies,a.STATIC_DRAW),this.dirty=!1},b.glContexts=[],b.instances=[],b.WebGLRenderer=function(a,c,d){if(d)for(var e in b.defaultRenderOptions)"undefined"==typeof d[e]&&(d[e]=b.defaultRenderOptions[e]);else d=b.defaultRenderOptions;b.defaultRenderer||(b.sayHello("webGL"),b.defaultRenderer=this),this.type=b.WEBGL_RENDERER,this.resolution=d.resolution,this.transparent=d.transparent,this.autoResize=d.autoResize||!1,this.preserveDrawingBuffer=d.preserveDrawingBuffer,this.clearBeforeRender=d.clearBeforeRender,this.width=a||800,this.height=c||600,this.view=d.view||document.createElement("canvas"),this.contextLostBound=this.handleContextLost.bind(this),this.contextRestoredBound=this.handleContextRestored.bind(this),this.view.addEventListener("webglcontextlost",this.contextLostBound,!1),this.view.addEventListener("webglcontextrestored",this.contextRestoredBound,!1),this._contextOptions={alpha:this.transparent,antialias:d.antialias,premultipliedAlpha:this.transparent&&"notMultiplied"!==this.transparent,stencil:!0,preserveDrawingBuffer:d.preserveDrawingBuffer},this.projection=new b.Point,this.offset=new b.Point(0,0),this.shaderManager=new b.WebGLShaderManager,this.spriteBatch=new b.WebGLSpriteBatch,this.maskManager=new b.WebGLMaskManager,this.filterManager=new b.WebGLFilterManager,this.stencilManager=new b.WebGLStencilManager,this.blendModeManager=new b.WebGLBlendModeManager,this.renderSession={},this.renderSession.gl=this.gl,this.renderSession.drawCount=0,this.renderSession.shaderManager=this.shaderManager,this.renderSession.maskManager=this.maskManager,this.renderSession.filterManager=this.filterManager,this.renderSession.blendModeManager=this.blendModeManager,this.renderSession.spriteBatch=this.spriteBatch,this.renderSession.stencilManager=this.stencilManager,this.renderSession.renderer=this,this.renderSession.resolution=this.resolution,this.initContext(),this.mapBlendModes()},b.WebGLRenderer.prototype.constructor=b.WebGLRenderer,b.WebGLRenderer.prototype.initContext=function(){var a=this.view.getContext("webgl",this._contextOptions)||this.view.getContext("experimental-webgl",this._contextOptions);if(this.gl=a,!a)throw new Error("This browser does not support webGL. Try using the canvas renderer");this.glContextId=a.id=b.WebGLRenderer.glContextId++,b.glContexts[this.glContextId]=a,b.instances[this.glContextId]=this,a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),this.shaderManager.setContext(a),this.spriteBatch.setContext(a),this.maskManager.setContext(a),this.filterManager.setContext(a),this.blendModeManager.setContext(a),this.stencilManager.setContext(a),this.renderSession.gl=this.gl,this.resize(this.width,this.height)},b.WebGLRenderer.prototype.render=function(a){if(!this.contextLost){this.__stage!==a&&(a.interactive&&a.interactionManager.removeEvents(),this.__stage=a),a.updateTransform();var b=this.gl;a._interactive?a._interactiveEventsAdded||(a._interactiveEventsAdded=!0,a.interactionManager.setTarget(this)):a._interactiveEventsAdded&&(a._interactiveEventsAdded=!1,a.interactionManager.setTarget(this)),b.viewport(0,0,this.width,this.height),b.bindFramebuffer(b.FRAMEBUFFER,null),this.clearBeforeRender&&(this.transparent?b.clearColor(0,0,0,0):b.clearColor(a.backgroundColorSplit[0],a.backgroundColorSplit[1],a.backgroundColorSplit[2],1),b.clear(b.COLOR_BUFFER_BIT)),this.renderDisplayObject(a,this.projection)}},b.WebGLRenderer.prototype.renderDisplayObject=function(a,c,d){this.renderSession.blendModeManager.setBlendMode(b.blendModes.NORMAL),this.renderSession.drawCount=0,this.renderSession.flipY=d?-1:1,this.renderSession.projection=c,this.renderSession.offset=this.offset,this.spriteBatch.begin(this.renderSession),this.filterManager.begin(this.renderSession,d),a._renderWebGL(this.renderSession),this.spriteBatch.end()},b.WebGLRenderer.prototype.resize=function(a,b){this.width=a*this.resolution,this.height=b*this.resolution,this.view.width=this.width,this.view.height=this.height,this.autoResize&&(this.view.style.width=this.width/this.resolution+"px",this.view.style.height=this.height/this.resolution+"px"),this.gl.viewport(0,0,this.width,this.height),this.projection.x=this.width/2/this.resolution,this.projection.y=-this.height/2/this.resolution},b.WebGLRenderer.prototype.updateTexture=function(a){if(a.hasLoaded){var c=this.gl;return a._glTextures[c.id]||(a._glTextures[c.id]=c.createTexture()),c.bindTexture(c.TEXTURE_2D,a._glTextures[c.id]),c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultipliedAlpha),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,a.source),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,a.scaleMode===b.scaleModes.LINEAR?c.LINEAR:c.NEAREST),a.mipmap&&b.isPowerOfTwo(a.width,a.height)?(c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,a.scaleMode===b.scaleModes.LINEAR?c.LINEAR_MIPMAP_LINEAR:c.NEAREST_MIPMAP_NEAREST),c.generateMipmap(c.TEXTURE_2D)):c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,a.scaleMode===b.scaleModes.LINEAR?c.LINEAR:c.NEAREST),a._powerOf2?(c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.REPEAT),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.REPEAT)):(c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE)),a._dirty[c.id]=!1,a._glTextures[c.id]}},b.WebGLRenderer.prototype.handleContextLost=function(a){a.preventDefault(),this.contextLost=!0},b.WebGLRenderer.prototype.handleContextRestored=function(){this.initContext();for(var a in b.TextureCache){var c=b.TextureCache[a].baseTexture;c._glTextures=[]}this.contextLost=!1},b.WebGLRenderer.prototype.destroy=function(){this.view.removeEventListener("webglcontextlost",this.contextLostBound),this.view.removeEventListener("webglcontextrestored",this.contextRestoredBound),b.glContexts[this.glContextId]=null,this.projection=null,this.offset=null,this.shaderManager.destroy(),this.spriteBatch.destroy(),this.maskManager.destroy(),this.filterManager.destroy(),this.shaderManager=null,this.spriteBatch=null,this.maskManager=null,this.filterManager=null,this.gl=null,this.renderSession=null},b.WebGLRenderer.prototype.mapBlendModes=function(){var a=this.gl;b.blendModesWebGL||(b.blendModesWebGL=[],b.blendModesWebGL[b.blendModes.NORMAL]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.ADD]=[a.SRC_ALPHA,a.DST_ALPHA],b.blendModesWebGL[b.blendModes.MULTIPLY]=[a.DST_COLOR,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.SCREEN]=[a.SRC_ALPHA,a.ONE],b.blendModesWebGL[b.blendModes.OVERLAY]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.DARKEN]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.LIGHTEN]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.COLOR_DODGE]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.COLOR_BURN]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.HARD_LIGHT]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.SOFT_LIGHT]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.DIFFERENCE]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.EXCLUSION]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.HUE]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.SATURATION]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.COLOR]=[a.ONE,a.ONE_MINUS_SRC_ALPHA],b.blendModesWebGL[b.blendModes.LUMINOSITY]=[a.ONE,a.ONE_MINUS_SRC_ALPHA])},b.WebGLRenderer.glContextId=0,b.WebGLBlendModeManager=function(){this.currentBlendMode=99999},b.WebGLBlendModeManager.prototype.constructor=b.WebGLBlendModeManager,b.WebGLBlendModeManager.prototype.setContext=function(a){this.gl=a},b.WebGLBlendModeManager.prototype.setBlendMode=function(a){if(this.currentBlendMode===a)return!1;this.currentBlendMode=a;var c=b.blendModesWebGL[this.currentBlendMode];return this.gl.blendFunc(c[0],c[1]),!0},b.WebGLBlendModeManager.prototype.destroy=function(){this.gl=null},b.WebGLMaskManager=function(){},b.WebGLMaskManager.prototype.constructor=b.WebGLMaskManager,b.WebGLMaskManager.prototype.setContext=function(a){this.gl=a},b.WebGLMaskManager.prototype.pushMask=function(a,c){var d=c.gl;a.dirty&&b.WebGLGraphics.updateGraphics(a,d),a._webGL[d.id].data.length&&c.stencilManager.pushStencil(a,a._webGL[d.id].data[0],c)},b.WebGLMaskManager.prototype.popMask=function(a,b){var c=this.gl;b.stencilManager.popStencil(a,a._webGL[c.id].data[0],b)},b.WebGLMaskManager.prototype.destroy=function(){this.gl=null},b.WebGLStencilManager=function(){this.stencilStack=[],this.reverse=!0,this.count=0},b.WebGLStencilManager.prototype.setContext=function(a){this.gl=a},b.WebGLStencilManager.prototype.pushStencil=function(a,b,c){var d=this.gl;this.bindGraphics(a,b,c),0===this.stencilStack.length&&(d.enable(d.STENCIL_TEST),d.clear(d.STENCIL_BUFFER_BIT),this.reverse=!0,this.count=0),this.stencilStack.push(b);var e=this.count;d.colorMask(!1,!1,!1,!1),d.stencilFunc(d.ALWAYS,0,255),d.stencilOp(d.KEEP,d.KEEP,d.INVERT),1===b.mode?(d.drawElements(d.TRIANGLE_FAN,b.indices.length-4,d.UNSIGNED_SHORT,0),this.reverse?(d.stencilFunc(d.EQUAL,255-e,255),d.stencilOp(d.KEEP,d.KEEP,d.DECR)):(d.stencilFunc(d.EQUAL,e,255),d.stencilOp(d.KEEP,d.KEEP,d.INCR)),d.drawElements(d.TRIANGLE_FAN,4,d.UNSIGNED_SHORT,2*(b.indices.length-4)),this.reverse?d.stencilFunc(d.EQUAL,255-(e+1),255):d.stencilFunc(d.EQUAL,e+1,255),this.reverse=!this.reverse):(this.reverse?(d.stencilFunc(d.EQUAL,e,255),d.stencilOp(d.KEEP,d.KEEP,d.INCR)):(d.stencilFunc(d.EQUAL,255-e,255),d.stencilOp(d.KEEP,d.KEEP,d.DECR)),d.drawElements(d.TRIANGLE_STRIP,b.indices.length,d.UNSIGNED_SHORT,0),this.reverse?d.stencilFunc(d.EQUAL,e+1,255):d.stencilFunc(d.EQUAL,255-(e+1),255)),d.colorMask(!0,!0,!0,!0),d.stencilOp(d.KEEP,d.KEEP,d.KEEP),this.count++},b.WebGLStencilManager.prototype.bindGraphics=function(a,c,d){this._currentGraphics=a;var e,f=this.gl,g=d.projection,h=d.offset;1===c.mode?(e=d.shaderManager.complexPrimitiveShader,d.shaderManager.setShader(e),f.uniform1f(e.flipY,d.flipY),f.uniformMatrix3fv(e.translationMatrix,!1,a.worldTransform.toArray(!0)),f.uniform2f(e.projectionVector,g.x,-g.y),f.uniform2f(e.offsetVector,-h.x,-h.y),f.uniform3fv(e.tintColor,b.hex2rgb(a.tint)),f.uniform3fv(e.color,c.color),f.uniform1f(e.alpha,a.worldAlpha*c.alpha),f.bindBuffer(f.ARRAY_BUFFER,c.buffer),f.vertexAttribPointer(e.aVertexPosition,2,f.FLOAT,!1,8,0),f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,c.indexBuffer)):(e=d.shaderManager.primitiveShader,d.shaderManager.setShader(e),f.uniformMatrix3fv(e.translationMatrix,!1,a.worldTransform.toArray(!0)),f.uniform1f(e.flipY,d.flipY),f.uniform2f(e.projectionVector,g.x,-g.y),f.uniform2f(e.offsetVector,-h.x,-h.y),f.uniform3fv(e.tintColor,b.hex2rgb(a.tint)),f.uniform1f(e.alpha,a.worldAlpha),f.bindBuffer(f.ARRAY_BUFFER,c.buffer),f.vertexAttribPointer(e.aVertexPosition,2,f.FLOAT,!1,24,0),f.vertexAttribPointer(e.colorAttribute,4,f.FLOAT,!1,24,8),f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,c.indexBuffer))},b.WebGLStencilManager.prototype.popStencil=function(a,b,c){var d=this.gl;if(this.stencilStack.pop(),this.count--,0===this.stencilStack.length)d.disable(d.STENCIL_TEST);else{var e=this.count;this.bindGraphics(a,b,c),d.colorMask(!1,!1,!1,!1),1===b.mode?(this.reverse=!this.reverse,this.reverse?(d.stencilFunc(d.EQUAL,255-(e+1),255),d.stencilOp(d.KEEP,d.KEEP,d.INCR)):(d.stencilFunc(d.EQUAL,e+1,255),d.stencilOp(d.KEEP,d.KEEP,d.DECR)),d.drawElements(d.TRIANGLE_FAN,4,d.UNSIGNED_SHORT,2*(b.indices.length-4)),d.stencilFunc(d.ALWAYS,0,255),d.stencilOp(d.KEEP,d.KEEP,d.INVERT),d.drawElements(d.TRIANGLE_FAN,b.indices.length-4,d.UNSIGNED_SHORT,0),this.reverse?d.stencilFunc(d.EQUAL,e,255):d.stencilFunc(d.EQUAL,255-e,255)):(this.reverse?(d.stencilFunc(d.EQUAL,e+1,255),d.stencilOp(d.KEEP,d.KEEP,d.DECR)):(d.stencilFunc(d.EQUAL,255-(e+1),255),d.stencilOp(d.KEEP,d.KEEP,d.INCR)),d.drawElements(d.TRIANGLE_STRIP,b.indices.length,d.UNSIGNED_SHORT,0),this.reverse?d.stencilFunc(d.EQUAL,e,255):d.stencilFunc(d.EQUAL,255-e,255)),d.colorMask(!0,!0,!0,!0),d.stencilOp(d.KEEP,d.KEEP,d.KEEP)}},b.WebGLStencilManager.prototype.destroy=function(){this.stencilStack=null,this.gl=null},b.WebGLShaderManager=function(){this.maxAttibs=10,this.attribState=[],this.tempAttribState=[];for(var a=0;a<this.maxAttibs;a++)this.attribState[a]=!1;this.stack=[]},b.WebGLShaderManager.prototype.constructor=b.WebGLShaderManager,b.WebGLShaderManager.prototype.setContext=function(a){this.gl=a,this.primitiveShader=new b.PrimitiveShader(a),this.complexPrimitiveShader=new b.ComplexPrimitiveShader(a),this.defaultShader=new b.PixiShader(a),this.fastShader=new b.PixiFastShader(a),this.stripShader=new b.StripShader(a),this.setShader(this.defaultShader)},b.WebGLShaderManager.prototype.setAttribs=function(a){var b;for(b=0;b<this.tempAttribState.length;b++)this.tempAttribState[b]=!1;for(b=0;b<a.length;b++){var c=a[b];this.tempAttribState[c]=!0}var d=this.gl;for(b=0;b<this.attribState.length;b++)this.attribState[b]!==this.tempAttribState[b]&&(this.attribState[b]=this.tempAttribState[b],this.tempAttribState[b]?d.enableVertexAttribArray(b):d.disableVertexAttribArray(b))},b.WebGLShaderManager.prototype.setShader=function(a){return this._currentId===a._UID?!1:(this._currentId=a._UID,this.currentShader=a,this.gl.useProgram(a.program),this.setAttribs(a.attributes),!0)},b.WebGLShaderManager.prototype.destroy=function(){this.attribState=null,this.tempAttribState=null,this.primitiveShader.destroy(),this.complexPrimitiveShader.destroy(),this.defaultShader.destroy(),this.fastShader.destroy(),this.stripShader.destroy(),this.gl=null},b.WebGLSpriteBatch=function(){this.vertSize=5,this.size=2e3;var a=4*this.size*4*this.vertSize,c=6*this.size;this.vertices=new b.ArrayBuffer(a),this.positions=new b.Float32Array(this.vertices),this.colors=new b.Uint32Array(this.vertices),this.indices=new b.Uint16Array(c),this.lastIndexCount=0;for(var d=0,e=0;c>d;d+=6,e+=4)this.indices[d+0]=e+0,this.indices[d+1]=e+1,this.indices[d+2]=e+2,this.indices[d+3]=e+0,this.indices[d+4]=e+2,this.indices[d+5]=e+3;this.drawing=!1,this.currentBatchSize=0,this.currentBaseTexture=null,this.dirty=!0,this.textures=[],this.blendModes=[],this.shaders=[],this.sprites=[],this.defaultShader=new b.AbstractFilter(["precision lowp float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform sampler2D uSampler;","void main(void) {","   gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor ;","}"])},b.WebGLSpriteBatch.prototype.setContext=function(a){this.gl=a,this.vertexBuffer=a.createBuffer(),this.indexBuffer=a.createBuffer(),a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,this.indexBuffer),a.bufferData(a.ELEMENT_ARRAY_BUFFER,this.indices,a.STATIC_DRAW),a.bindBuffer(a.ARRAY_BUFFER,this.vertexBuffer),a.bufferData(a.ARRAY_BUFFER,this.vertices,a.DYNAMIC_DRAW),this.currentBlendMode=99999;var c=new b.PixiShader(a);c.fragmentSrc=this.defaultShader.fragmentSrc,c.uniforms={},c.init(),this.defaultShader.shaders[a.id]=c},b.WebGLSpriteBatch.prototype.begin=function(a){this.renderSession=a,this.shader=this.renderSession.shaderManager.defaultShader,this.start()},b.WebGLSpriteBatch.prototype.end=function(){this.flush()},b.WebGLSpriteBatch.prototype.render=function(a){var b=a.texture;this.currentBatchSize>=this.size&&(this.flush(),this.currentBaseTexture=b.baseTexture);var c=b._uvs;if(c){var d,e,f,g,h=a.anchor.x,i=a.anchor.y;if(b.trim){var j=b.trim;e=j.x-h*j.width,d=e+b.crop.width,g=j.y-i*j.height,f=g+b.crop.height}else d=b.frame.width*(1-h),e=b.frame.width*-h,f=b.frame.height*(1-i),g=b.frame.height*-i;var k=4*this.currentBatchSize*this.vertSize,l=b.baseTexture.resolution,m=a.worldTransform,n=m.a/l,o=m.b/l,p=m.c/l,q=m.d/l,r=m.tx,s=m.ty,t=this.colors,u=this.positions;this.renderSession.roundPixels?(u[k]=n*e+p*g+r|0,u[k+1]=q*g+o*e+s|0,u[k+5]=n*d+p*g+r|0,u[k+6]=q*g+o*d+s|0,u[k+10]=n*d+p*f+r|0,u[k+11]=q*f+o*d+s|0,u[k+15]=n*e+p*f+r|0,u[k+16]=q*f+o*e+s|0):(u[k]=n*e+p*g+r,u[k+1]=q*g+o*e+s,u[k+5]=n*d+p*g+r,u[k+6]=q*g+o*d+s,u[k+10]=n*d+p*f+r,u[k+11]=q*f+o*d+s,u[k+15]=n*e+p*f+r,u[k+16]=q*f+o*e+s),u[k+2]=c.x0,u[k+3]=c.y0,u[k+7]=c.x1,u[k+8]=c.y1,u[k+12]=c.x2,u[k+13]=c.y2,u[k+17]=c.x3,u[k+18]=c.y3;var v=a.tint;t[k+4]=t[k+9]=t[k+14]=t[k+19]=(v>>16)+(65280&v)+((255&v)<<16)+(255*a.worldAlpha<<24),this.sprites[this.currentBatchSize++]=a}},b.WebGLSpriteBatch.prototype.renderTilingSprite=function(a){var c=a.tilingTexture;this.currentBatchSize>=this.size&&(this.flush(),this.currentBaseTexture=c.baseTexture),a._uvs||(a._uvs=new b.TextureUvs);var d=a._uvs;a.tilePosition.x%=c.baseTexture.width*a.tileScaleOffset.x,a.tilePosition.y%=c.baseTexture.height*a.tileScaleOffset.y;var e=a.tilePosition.x/(c.baseTexture.width*a.tileScaleOffset.x),f=a.tilePosition.y/(c.baseTexture.height*a.tileScaleOffset.y),g=a.width/c.baseTexture.width/(a.tileScale.x*a.tileScaleOffset.x),h=a.height/c.baseTexture.height/(a.tileScale.y*a.tileScaleOffset.y);d.x0=0-e,d.y0=0-f,d.x1=1*g-e,d.y1=0-f,d.x2=1*g-e,d.y2=1*h-f,d.x3=0-e,d.y3=1*h-f;var i=a.tint,j=(i>>16)+(65280&i)+((255&i)<<16)+(255*a.alpha<<24),k=this.positions,l=this.colors,m=a.width,n=a.height,o=a.anchor.x,p=a.anchor.y,q=m*(1-o),r=m*-o,s=n*(1-p),t=n*-p,u=4*this.currentBatchSize*this.vertSize,v=c.baseTexture.resolution,w=a.worldTransform,x=w.a/v,y=w.b/v,z=w.c/v,A=w.d/v,B=w.tx,C=w.ty;k[u++]=x*r+z*t+B,k[u++]=A*t+y*r+C,k[u++]=d.x0,k[u++]=d.y0,l[u++]=j,k[u++]=x*q+z*t+B,k[u++]=A*t+y*q+C,k[u++]=d.x1,k[u++]=d.y1,l[u++]=j,k[u++]=x*q+z*s+B,k[u++]=A*s+y*q+C,k[u++]=d.x2,k[u++]=d.y2,l[u++]=j,k[u++]=x*r+z*s+B,k[u++]=A*s+y*r+C,k[u++]=d.x3,k[u++]=d.y3,l[u++]=j,this.sprites[this.currentBatchSize++]=a},b.WebGLSpriteBatch.prototype.flush=function(){if(0!==this.currentBatchSize){var a,c=this.gl;if(this.dirty){this.dirty=!1,c.activeTexture(c.TEXTURE0),c.bindBuffer(c.ARRAY_BUFFER,this.vertexBuffer),c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,this.indexBuffer),a=this.defaultShader.shaders[c.id];var d=4*this.vertSize;c.vertexAttribPointer(a.aVertexPosition,2,c.FLOAT,!1,d,0),c.vertexAttribPointer(a.aTextureCoord,2,c.FLOAT,!1,d,8),c.vertexAttribPointer(a.colorAttribute,4,c.UNSIGNED_BYTE,!0,d,16)}if(this.currentBatchSize>.5*this.size)c.bufferSubData(c.ARRAY_BUFFER,0,this.vertices);else{var e=this.positions.subarray(0,4*this.currentBatchSize*this.vertSize);c.bufferSubData(c.ARRAY_BUFFER,0,e)}for(var f,g,h,i,j=0,k=0,l=null,m=this.renderSession.blendModeManager.currentBlendMode,n=null,o=!1,p=!1,q=0,r=this.currentBatchSize;r>q;q++){if(i=this.sprites[q],f=i.texture.baseTexture,g=i.blendMode,h=i.shader||this.defaultShader,o=m!==g,p=n!==h,(l!==f||o||p)&&(this.renderBatch(l,j,k),k=q,j=0,l=f,o&&(m=g,this.renderSession.blendModeManager.setBlendMode(m)),p)){n=h,a=n.shaders[c.id],a||(a=new b.PixiShader(c),a.fragmentSrc=n.fragmentSrc,a.uniforms=n.uniforms,a.init(),n.shaders[c.id]=a),this.renderSession.shaderManager.setShader(a),a.dirty&&a.syncUniforms();var s=this.renderSession.projection;c.uniform2f(a.projectionVector,s.x,s.y);var t=this.renderSession.offset;c.uniform2f(a.offsetVector,t.x,t.y)}j++}this.renderBatch(l,j,k),this.currentBatchSize=0}},b.WebGLSpriteBatch.prototype.renderBatch=function(a,b,c){if(0!==b){var d=this.gl;a._dirty[d.id]?this.renderSession.renderer.updateTexture(a):d.bindTexture(d.TEXTURE_2D,a._glTextures[d.id]),d.drawElements(d.TRIANGLES,6*b,d.UNSIGNED_SHORT,6*c*2),this.renderSession.drawCount++}},b.WebGLSpriteBatch.prototype.stop=function(){this.flush(),this.dirty=!0},b.WebGLSpriteBatch.prototype.start=function(){this.dirty=!0},b.WebGLSpriteBatch.prototype.destroy=function(){this.vertices=null,this.indices=null,this.gl.deleteBuffer(this.vertexBuffer),this.gl.deleteBuffer(this.indexBuffer),this.currentBaseTexture=null,this.gl=null},b.WebGLFastSpriteBatch=function(a){this.vertSize=10,this.maxSize=6e3,this.size=this.maxSize;var c=4*this.size*this.vertSize,d=6*this.maxSize;this.vertices=new b.Float32Array(c),this.indices=new b.Uint16Array(d),this.vertexBuffer=null,this.indexBuffer=null,this.lastIndexCount=0;for(var e=0,f=0;d>e;e+=6,f+=4)this.indices[e+0]=f+0,this.indices[e+1]=f+1,this.indices[e+2]=f+2,this.indices[e+3]=f+0,this.indices[e+4]=f+2,this.indices[e+5]=f+3;this.drawing=!1,this.currentBatchSize=0,this.currentBaseTexture=null,this.currentBlendMode=0,this.renderSession=null,this.shader=null,this.matrix=null,this.setContext(a)},b.WebGLFastSpriteBatch.prototype.constructor=b.WebGLFastSpriteBatch,b.WebGLFastSpriteBatch.prototype.setContext=function(a){this.gl=a,this.vertexBuffer=a.createBuffer(),this.indexBuffer=a.createBuffer(),a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,this.indexBuffer),a.bufferData(a.ELEMENT_ARRAY_BUFFER,this.indices,a.STATIC_DRAW),a.bindBuffer(a.ARRAY_BUFFER,this.vertexBuffer),a.bufferData(a.ARRAY_BUFFER,this.vertices,a.DYNAMIC_DRAW)},b.WebGLFastSpriteBatch.prototype.begin=function(a,b){this.renderSession=b,this.shader=this.renderSession.shaderManager.fastShader,this.matrix=a.worldTransform.toArray(!0),this.start()},b.WebGLFastSpriteBatch.prototype.end=function(){this.flush()},b.WebGLFastSpriteBatch.prototype.render=function(a){var b=a.children,c=b[0];if(c.texture._uvs){this.currentBaseTexture=c.texture.baseTexture,c.blendMode!==this.renderSession.blendModeManager.currentBlendMode&&(this.flush(),this.renderSession.blendModeManager.setBlendMode(c.blendMode));for(var d=0,e=b.length;e>d;d++)this.renderSprite(b[d]);this.flush()}},b.WebGLFastSpriteBatch.prototype.renderSprite=function(a){if(a.visible&&(a.texture.baseTexture===this.currentBaseTexture||(this.flush(),this.currentBaseTexture=a.texture.baseTexture,a.texture._uvs))){var b,c,d,e,f,g,h,i,j=this.vertices;if(b=a.texture._uvs,c=a.texture.frame.width,d=a.texture.frame.height,a.texture.trim){var k=a.texture.trim;f=k.x-a.anchor.x*k.width,e=f+a.texture.crop.width,h=k.y-a.anchor.y*k.height,g=h+a.texture.crop.height}else e=a.texture.frame.width*(1-a.anchor.x),f=a.texture.frame.width*-a.anchor.x,g=a.texture.frame.height*(1-a.anchor.y),h=a.texture.frame.height*-a.anchor.y;i=4*this.currentBatchSize*this.vertSize,j[i++]=f,j[i++]=h,j[i++]=a.position.x,j[i++]=a.position.y,j[i++]=a.scale.x,j[i++]=a.scale.y,j[i++]=a.rotation,j[i++]=b.x0,j[i++]=b.y1,j[i++]=a.alpha,j[i++]=e,j[i++]=h,j[i++]=a.position.x,j[i++]=a.position.y,j[i++]=a.scale.x,j[i++]=a.scale.y,j[i++]=a.rotation,j[i++]=b.x1,j[i++]=b.y1,j[i++]=a.alpha,j[i++]=e,j[i++]=g,j[i++]=a.position.x,j[i++]=a.position.y,j[i++]=a.scale.x,j[i++]=a.scale.y,j[i++]=a.rotation,j[i++]=b.x2,j[i++]=b.y2,j[i++]=a.alpha,j[i++]=f,j[i++]=g,j[i++]=a.position.x,j[i++]=a.position.y,j[i++]=a.scale.x,j[i++]=a.scale.y,j[i++]=a.rotation,j[i++]=b.x3,j[i++]=b.y3,j[i++]=a.alpha,this.currentBatchSize++,this.currentBatchSize>=this.size&&this.flush()}},b.WebGLFastSpriteBatch.prototype.flush=function(){if(0!==this.currentBatchSize){var a=this.gl;if(this.currentBaseTexture._glTextures[a.id]||this.renderSession.renderer.updateTexture(this.currentBaseTexture,a),a.bindTexture(a.TEXTURE_2D,this.currentBaseTexture._glTextures[a.id]),this.currentBatchSize>.5*this.size)a.bufferSubData(a.ARRAY_BUFFER,0,this.vertices);else{var b=this.vertices.subarray(0,4*this.currentBatchSize*this.vertSize);a.bufferSubData(a.ARRAY_BUFFER,0,b)}a.drawElements(a.TRIANGLES,6*this.currentBatchSize,a.UNSIGNED_SHORT,0),this.currentBatchSize=0,this.renderSession.drawCount++}},b.WebGLFastSpriteBatch.prototype.stop=function(){this.flush()},b.WebGLFastSpriteBatch.prototype.start=function(){var a=this.gl;a.activeTexture(a.TEXTURE0),a.bindBuffer(a.ARRAY_BUFFER,this.vertexBuffer),a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,this.indexBuffer);var b=this.renderSession.projection;a.uniform2f(this.shader.projectionVector,b.x,b.y),a.uniformMatrix3fv(this.shader.uMatrix,!1,this.matrix);var c=4*this.vertSize;a.vertexAttribPointer(this.shader.aVertexPosition,2,a.FLOAT,!1,c,0),a.vertexAttribPointer(this.shader.aPositionCoord,2,a.FLOAT,!1,c,8),a.vertexAttribPointer(this.shader.aScale,2,a.FLOAT,!1,c,16),a.vertexAttribPointer(this.shader.aRotation,1,a.FLOAT,!1,c,24),a.vertexAttribPointer(this.shader.aTextureCoord,2,a.FLOAT,!1,c,28),a.vertexAttribPointer(this.shader.colorAttribute,1,a.FLOAT,!1,c,36)},b.WebGLFilterManager=function(){this.filterStack=[],this.offsetX=0,this.offsetY=0},b.WebGLFilterManager.prototype.constructor=b.WebGLFilterManager,b.WebGLFilterManager.prototype.setContext=function(a){this.gl=a,this.texturePool=[],this.initShaderBuffers()},b.WebGLFilterManager.prototype.begin=function(a,b){this.renderSession=a,this.defaultShader=a.shaderManager.defaultShader;var c=this.renderSession.projection;this.width=2*c.x,this.height=2*-c.y,this.buffer=b},b.WebGLFilterManager.prototype.pushFilter=function(a){var c=this.gl,d=this.renderSession.projection,e=this.renderSession.offset;a._filterArea=a.target.filterArea||a.target.getBounds(),this.filterStack.push(a);var f=a.filterPasses[0];this.offsetX+=a._filterArea.x,this.offsetY+=a._filterArea.y;var g=this.texturePool.pop();g?g.resize(this.width,this.height):g=new b.FilterTexture(this.gl,this.width,this.height),c.bindTexture(c.TEXTURE_2D,g.texture);var h=a._filterArea,i=f.padding;h.x-=i,h.y-=i,h.width+=2*i,h.height+=2*i,h.x<0&&(h.x=0),h.width>this.width&&(h.width=this.width),h.y<0&&(h.y=0),h.height>this.height&&(h.height=this.height),c.bindFramebuffer(c.FRAMEBUFFER,g.frameBuffer),c.viewport(0,0,h.width,h.height),d.x=h.width/2,d.y=-h.height/2,e.x=-h.x,e.y=-h.y,c.colorMask(!0,!0,!0,!0),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT),a._glFilterTexture=g},b.WebGLFilterManager.prototype.popFilter=function(){var a=this.gl,c=this.filterStack.pop(),d=c._filterArea,e=c._glFilterTexture,f=this.renderSession.projection,g=this.renderSession.offset;if(c.filterPasses.length>1){a.viewport(0,0,d.width,d.height),a.bindBuffer(a.ARRAY_BUFFER,this.vertexBuffer),this.vertexArray[0]=0,this.vertexArray[1]=d.height,this.vertexArray[2]=d.width,this.vertexArray[3]=d.height,this.vertexArray[4]=0,this.vertexArray[5]=0,this.vertexArray[6]=d.width,this.vertexArray[7]=0,a.bufferSubData(a.ARRAY_BUFFER,0,this.vertexArray),a.bindBuffer(a.ARRAY_BUFFER,this.uvBuffer),this.uvArray[2]=d.width/this.width,this.uvArray[5]=d.height/this.height,this.uvArray[6]=d.width/this.width,this.uvArray[7]=d.height/this.height,a.bufferSubData(a.ARRAY_BUFFER,0,this.uvArray);var h=e,i=this.texturePool.pop();i||(i=new b.FilterTexture(this.gl,this.width,this.height)),i.resize(this.width,this.height),a.bindFramebuffer(a.FRAMEBUFFER,i.frameBuffer),a.clear(a.COLOR_BUFFER_BIT),a.disable(a.BLEND);for(var j=0;j<c.filterPasses.length-1;j++){var k=c.filterPasses[j];a.bindFramebuffer(a.FRAMEBUFFER,i.frameBuffer),a.activeTexture(a.TEXTURE0),a.bindTexture(a.TEXTURE_2D,h.texture),this.applyFilterPass(k,d,d.width,d.height);var l=h;h=i,i=l}a.enable(a.BLEND),e=h,this.texturePool.push(i)}var m=c.filterPasses[c.filterPasses.length-1];this.offsetX-=d.x,this.offsetY-=d.y;var n=this.width,o=this.height,p=0,q=0,r=this.buffer;if(0===this.filterStack.length)a.colorMask(!0,!0,!0,!0);else{var s=this.filterStack[this.filterStack.length-1];d=s._filterArea,n=d.width,o=d.height,p=d.x,q=d.y,r=s._glFilterTexture.frameBuffer}f.x=n/2,f.y=-o/2,g.x=p,g.y=q,d=c._filterArea;var t=d.x-p,u=d.y-q;a.bindBuffer(a.ARRAY_BUFFER,this.vertexBuffer),this.vertexArray[0]=t,this.vertexArray[1]=u+d.height,this.vertexArray[2]=t+d.width,this.vertexArray[3]=u+d.height,this.vertexArray[4]=t,this.vertexArray[5]=u,this.vertexArray[6]=t+d.width,this.vertexArray[7]=u,a.bufferSubData(a.ARRAY_BUFFER,0,this.vertexArray),a.bindBuffer(a.ARRAY_BUFFER,this.uvBuffer),this.uvArray[2]=d.width/this.width,this.uvArray[5]=d.height/this.height,this.uvArray[6]=d.width/this.width,this.uvArray[7]=d.height/this.height,a.bufferSubData(a.ARRAY_BUFFER,0,this.uvArray),a.viewport(0,0,n,o),a.bindFramebuffer(a.FRAMEBUFFER,r),a.activeTexture(a.TEXTURE0),a.bindTexture(a.TEXTURE_2D,e.texture),this.applyFilterPass(m,d,n,o),this.texturePool.push(e),c._glFilterTexture=null},b.WebGLFilterManager.prototype.applyFilterPass=function(a,c,d,e){var f=this.gl,g=a.shaders[f.id];g||(g=new b.PixiShader(f),g.fragmentSrc=a.fragmentSrc,g.uniforms=a.uniforms,g.init(),a.shaders[f.id]=g),this.renderSession.shaderManager.setShader(g),f.uniform2f(g.projectionVector,d/2,-e/2),f.uniform2f(g.offsetVector,0,0),a.uniforms.dimensions&&(a.uniforms.dimensions.value[0]=this.width,a.uniforms.dimensions.value[1]=this.height,a.uniforms.dimensions.value[2]=this.vertexArray[0],a.uniforms.dimensions.value[3]=this.vertexArray[5]),g.syncUniforms(),f.bindBuffer(f.ARRAY_BUFFER,this.vertexBuffer),f.vertexAttribPointer(g.aVertexPosition,2,f.FLOAT,!1,0,0),f.bindBuffer(f.ARRAY_BUFFER,this.uvBuffer),f.vertexAttribPointer(g.aTextureCoord,2,f.FLOAT,!1,0,0),f.bindBuffer(f.ARRAY_BUFFER,this.colorBuffer),f.vertexAttribPointer(g.colorAttribute,2,f.FLOAT,!1,0,0),f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,this.indexBuffer),f.drawElements(f.TRIANGLES,6,f.UNSIGNED_SHORT,0),this.renderSession.drawCount++},b.WebGLFilterManager.prototype.initShaderBuffers=function(){var a=this.gl;this.vertexBuffer=a.createBuffer(),this.uvBuffer=a.createBuffer(),this.colorBuffer=a.createBuffer(),this.indexBuffer=a.createBuffer(),this.vertexArray=new b.Float32Array([0,0,1,0,0,1,1,1]),a.bindBuffer(a.ARRAY_BUFFER,this.vertexBuffer),a.bufferData(a.ARRAY_BUFFER,this.vertexArray,a.STATIC_DRAW),this.uvArray=new b.Float32Array([0,0,1,0,0,1,1,1]),a.bindBuffer(a.ARRAY_BUFFER,this.uvBuffer),a.bufferData(a.ARRAY_BUFFER,this.uvArray,a.STATIC_DRAW),this.colorArray=new b.Float32Array([1,16777215,1,16777215,1,16777215,1,16777215]),a.bindBuffer(a.ARRAY_BUFFER,this.colorBuffer),a.bufferData(a.ARRAY_BUFFER,this.colorArray,a.STATIC_DRAW),a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,this.indexBuffer),a.bufferData(a.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,1,3,2]),a.STATIC_DRAW)},b.WebGLFilterManager.prototype.destroy=function(){var a=this.gl;this.filterStack=null,this.offsetX=0,this.offsetY=0;for(var b=0;b<this.texturePool.length;b++)this.texturePool[b].destroy();this.texturePool=null,a.deleteBuffer(this.vertexBuffer),a.deleteBuffer(this.uvBuffer),a.deleteBuffer(this.colorBuffer),a.deleteBuffer(this.indexBuffer)},b.FilterTexture=function(a,c,d,e){this.gl=a,this.frameBuffer=a.createFramebuffer(),this.texture=a.createTexture(),e=e||b.scaleModes.DEFAULT,a.bindTexture(a.TEXTURE_2D,this.texture),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,e===b.scaleModes.LINEAR?a.LINEAR:a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,e===b.scaleModes.LINEAR?a.LINEAR:a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.bindFramebuffer(a.FRAMEBUFFER,this.frameBuffer),a.bindFramebuffer(a.FRAMEBUFFER,this.frameBuffer),a.framebufferTexture2D(a.FRAMEBUFFER,a.COLOR_ATTACHMENT0,a.TEXTURE_2D,this.texture,0),this.renderBuffer=a.createRenderbuffer(),a.bindRenderbuffer(a.RENDERBUFFER,this.renderBuffer),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,this.renderBuffer),this.resize(c,d)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16603
},b.FilterTexture.prototype.constructor=b.FilterTexture,b.FilterTexture.prototype.clear=function(){var a=this.gl;a.clearColor(0,0,0,0),a.clear(a.COLOR_BUFFER_BIT)},b.FilterTexture.prototype.resize=function(a,b){if(this.width!==a||this.height!==b){this.width=a,this.height=b;var c=this.gl;c.bindTexture(c.TEXTURE_2D,this.texture),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,a,b,0,c.RGBA,c.UNSIGNED_BYTE,null),c.bindRenderbuffer(c.RENDERBUFFER,this.renderBuffer),c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_STENCIL,a,b)}},b.FilterTexture.prototype.destroy=function(){var a=this.gl;a.deleteFramebuffer(this.frameBuffer),a.deleteTexture(this.texture),this.frameBuffer=null,this.texture=null},b.CanvasBuffer=function(a,b){this.width=a,this.height=b,this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.canvas.width=a,this.canvas.height=b},b.CanvasBuffer.prototype.constructor=b.CanvasBuffer,b.CanvasBuffer.prototype.clear=function(){this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height)},b.CanvasBuffer.prototype.resize=function(a,b){this.width=this.canvas.width=a,this.height=this.canvas.height=b},b.CanvasMaskManager=function(){},b.CanvasMaskManager.prototype.constructor=b.CanvasMaskManager,b.CanvasMaskManager.prototype.pushMask=function(a,c){var d=c.context;d.save();var e=a.alpha,f=a.worldTransform,g=c.resolution;d.setTransform(f.a*g,f.b*g,f.c*g,f.d*g,f.tx*g,f.ty*g),b.CanvasGraphics.renderGraphicsMask(a,d),d.clip(),a.worldAlpha=e},b.CanvasMaskManager.prototype.popMask=function(a){a.context.restore()},b.CanvasTinter=function(){},b.CanvasTinter.getTintedTexture=function(a,c){var d=a.texture;c=b.CanvasTinter.roundColor(c);var e="#"+("00000"+(0|c).toString(16)).substr(-6);if(d.tintCache=d.tintCache||{},d.tintCache[e])return d.tintCache[e];var f=b.CanvasTinter.canvas||document.createElement("canvas");if(b.CanvasTinter.tintMethod(d,c,f),b.CanvasTinter.convertTintToImage){var g=new Image;g.src=f.toDataURL(),d.tintCache[e]=g}else d.tintCache[e]=f,b.CanvasTinter.canvas=null;return f},b.CanvasTinter.tintWithMultiply=function(a,b,c){var d=c.getContext("2d"),e=a.crop;c.width=e.width,c.height=e.height,d.fillStyle="#"+("00000"+(0|b).toString(16)).substr(-6),d.fillRect(0,0,e.width,e.height),d.globalCompositeOperation="multiply",d.drawImage(a.baseTexture.source,e.x,e.y,e.width,e.height,0,0,e.width,e.height),d.globalCompositeOperation="destination-atop",d.drawImage(a.baseTexture.source,e.x,e.y,e.width,e.height,0,0,e.width,e.height)},b.CanvasTinter.tintWithOverlay=function(a,b,c){var d=c.getContext("2d"),e=a.crop;c.width=e.width,c.height=e.height,d.globalCompositeOperation="copy",d.fillStyle="#"+("00000"+(0|b).toString(16)).substr(-6),d.fillRect(0,0,e.width,e.height),d.globalCompositeOperation="destination-atop",d.drawImage(a.baseTexture.source,e.x,e.y,e.width,e.height,0,0,e.width,e.height)},b.CanvasTinter.tintWithPerPixel=function(a,c,d){var e=d.getContext("2d"),f=a.crop;d.width=f.width,d.height=f.height,e.globalCompositeOperation="copy",e.drawImage(a.baseTexture.source,f.x,f.y,f.width,f.height,0,0,f.width,f.height);for(var g=b.hex2rgb(c),h=g[0],i=g[1],j=g[2],k=e.getImageData(0,0,f.width,f.height),l=k.data,m=0;m<l.length;m+=4)l[m+0]*=h,l[m+1]*=i,l[m+2]*=j;e.putImageData(k,0,0)},b.CanvasTinter.roundColor=function(a){var c=b.CanvasTinter.cacheStepsPerColorChannel,d=b.hex2rgb(a);return d[0]=Math.min(255,d[0]/c*c),d[1]=Math.min(255,d[1]/c*c),d[2]=Math.min(255,d[2]/c*c),b.rgb2hex(d)},b.CanvasTinter.cacheStepsPerColorChannel=8,b.CanvasTinter.convertTintToImage=!1,b.CanvasTinter.canUseMultiply=b.canUseNewCanvasBlendModes(),b.CanvasTinter.tintMethod=b.CanvasTinter.canUseMultiply?b.CanvasTinter.tintWithMultiply:b.CanvasTinter.tintWithPerPixel,b.CanvasRenderer=function(a,c,d){if(d)for(var e in b.defaultRenderOptions)"undefined"==typeof d[e]&&(d[e]=b.defaultRenderOptions[e]);else d=b.defaultRenderOptions;b.defaultRenderer||(b.sayHello("Canvas"),b.defaultRenderer=this),this.type=b.CANVAS_RENDERER,this.resolution=d.resolution,this.clearBeforeRender=d.clearBeforeRender,this.transparent=d.transparent,this.autoResize=d.autoResize||!1,this.width=a||800,this.height=c||600,this.width*=this.resolution,this.height*=this.resolution,this.view=d.view||document.createElement("canvas"),this.context=this.view.getContext("2d",{alpha:this.transparent}),this.refresh=!0,this.view.width=this.width*this.resolution,this.view.height=this.height*this.resolution,this.count=0,this.maskManager=new b.CanvasMaskManager,this.renderSession={context:this.context,maskManager:this.maskManager,scaleMode:null,smoothProperty:null,roundPixels:!1},this.mapBlendModes(),this.resize(a,c),"imageSmoothingEnabled"in this.context?this.renderSession.smoothProperty="imageSmoothingEnabled":"webkitImageSmoothingEnabled"in this.context?this.renderSession.smoothProperty="webkitImageSmoothingEnabled":"mozImageSmoothingEnabled"in this.context?this.renderSession.smoothProperty="mozImageSmoothingEnabled":"oImageSmoothingEnabled"in this.context?this.renderSession.smoothProperty="oImageSmoothingEnabled":"msImageSmoothingEnabled"in this.context&&(this.renderSession.smoothProperty="msImageSmoothingEnabled")},b.CanvasRenderer.prototype.constructor=b.CanvasRenderer,b.CanvasRenderer.prototype.render=function(a){a.updateTransform(),this.context.setTransform(1,0,0,1,0,0),this.context.globalAlpha=1,this.renderSession.currentBlendMode=b.blendModes.NORMAL,this.context.globalCompositeOperation=b.blendModesCanvas[b.blendModes.NORMAL],navigator.isCocoonJS&&this.view.screencanvas&&(this.context.fillStyle="black",this.context.clear()),this.clearBeforeRender&&(this.transparent?this.context.clearRect(0,0,this.width,this.height):(this.context.fillStyle=a.backgroundColorString,this.context.fillRect(0,0,this.width,this.height))),this.renderDisplayObject(a),a.interactive&&(a._interactiveEventsAdded||(a._interactiveEventsAdded=!0,a.interactionManager.setTarget(this)))},b.CanvasRenderer.prototype.destroy=function(a){"undefined"==typeof a&&(a=!0),a&&this.view.parent&&this.view.parent.removeChild(this.view),this.view=null,this.context=null,this.maskManager=null,this.renderSession=null},b.CanvasRenderer.prototype.resize=function(a,b){this.width=a*this.resolution,this.height=b*this.resolution,this.view.width=this.width,this.view.height=this.height,this.autoResize&&(this.view.style.width=this.width/this.resolution+"px",this.view.style.height=this.height/this.resolution+"px")},b.CanvasRenderer.prototype.renderDisplayObject=function(a,b){this.renderSession.context=b||this.context,this.renderSession.resolution=this.resolution,a._renderCanvas(this.renderSession)},b.CanvasRenderer.prototype.mapBlendModes=function(){b.blendModesCanvas||(b.blendModesCanvas=[],b.canUseNewCanvasBlendModes()?(b.blendModesCanvas[b.blendModes.NORMAL]="source-over",b.blendModesCanvas[b.blendModes.ADD]="lighter",b.blendModesCanvas[b.blendModes.MULTIPLY]="multiply",b.blendModesCanvas[b.blendModes.SCREEN]="screen",b.blendModesCanvas[b.blendModes.OVERLAY]="overlay",b.blendModesCanvas[b.blendModes.DARKEN]="darken",b.blendModesCanvas[b.blendModes.LIGHTEN]="lighten",b.blendModesCanvas[b.blendModes.COLOR_DODGE]="color-dodge",b.blendModesCanvas[b.blendModes.COLOR_BURN]="color-burn",b.blendModesCanvas[b.blendModes.HARD_LIGHT]="hard-light",b.blendModesCanvas[b.blendModes.SOFT_LIGHT]="soft-light",b.blendModesCanvas[b.blendModes.DIFFERENCE]="difference",b.blendModesCanvas[b.blendModes.EXCLUSION]="exclusion",b.blendModesCanvas[b.blendModes.HUE]="hue",b.blendModesCanvas[b.blendModes.SATURATION]="saturation",b.blendModesCanvas[b.blendModes.COLOR]="color",b.blendModesCanvas[b.blendModes.LUMINOSITY]="luminosity"):(b.blendModesCanvas[b.blendModes.NORMAL]="source-over",b.blendModesCanvas[b.blendModes.ADD]="lighter",b.blendModesCanvas[b.blendModes.MULTIPLY]="source-over",b.blendModesCanvas[b.blendModes.SCREEN]="source-over",b.blendModesCanvas[b.blendModes.OVERLAY]="source-over",b.blendModesCanvas[b.blendModes.DARKEN]="source-over",b.blendModesCanvas[b.blendModes.LIGHTEN]="source-over",b.blendModesCanvas[b.blendModes.COLOR_DODGE]="source-over",b.blendModesCanvas[b.blendModes.COLOR_BURN]="source-over",b.blendModesCanvas[b.blendModes.HARD_LIGHT]="source-over",b.blendModesCanvas[b.blendModes.SOFT_LIGHT]="source-over",b.blendModesCanvas[b.blendModes.DIFFERENCE]="source-over",b.blendModesCanvas[b.blendModes.EXCLUSION]="source-over",b.blendModesCanvas[b.blendModes.HUE]="source-over",b.blendModesCanvas[b.blendModes.SATURATION]="source-over",b.blendModesCanvas[b.blendModes.COLOR]="source-over",b.blendModesCanvas[b.blendModes.LUMINOSITY]="source-over"))},b.CanvasGraphics=function(){},b.CanvasGraphics.renderGraphics=function(a,c){var d=a.worldAlpha;a.dirty&&(this.updateGraphicsTint(a),a.dirty=!1);for(var e=0;e<a.graphicsData.length;e++){var f=a.graphicsData[e],g=f.shape,h=f._fillTint,i=f._lineTint;if(c.lineWidth=f.lineWidth,f.type===b.Graphics.POLY){c.beginPath();var j=g.points;c.moveTo(j[0],j[1]);for(var k=1;k<j.length/2;k++)c.lineTo(j[2*k],j[2*k+1]);g.closed&&c.lineTo(j[0],j[1]),j[0]===j[j.length-2]&&j[1]===j[j.length-1]&&c.closePath(),f.fill&&(c.globalAlpha=f.fillAlpha*d,c.fillStyle="#"+("00000"+(0|h).toString(16)).substr(-6),c.fill()),f.lineWidth&&(c.globalAlpha=f.lineAlpha*d,c.strokeStyle="#"+("00000"+(0|i).toString(16)).substr(-6),c.stroke())}else if(f.type===b.Graphics.RECT)(f.fillColor||0===f.fillColor)&&(c.globalAlpha=f.fillAlpha*d,c.fillStyle="#"+("00000"+(0|h).toString(16)).substr(-6),c.fillRect(g.x,g.y,g.width,g.height)),f.lineWidth&&(c.globalAlpha=f.lineAlpha*d,c.strokeStyle="#"+("00000"+(0|i).toString(16)).substr(-6),c.strokeRect(g.x,g.y,g.width,g.height));else if(f.type===b.Graphics.CIRC)c.beginPath(),c.arc(g.x,g.y,g.radius,0,2*Math.PI),c.closePath(),f.fill&&(c.globalAlpha=f.fillAlpha*d,c.fillStyle="#"+("00000"+(0|h).toString(16)).substr(-6),c.fill()),f.lineWidth&&(c.globalAlpha=f.lineAlpha*d,c.strokeStyle="#"+("00000"+(0|i).toString(16)).substr(-6),c.stroke());else if(f.type===b.Graphics.ELIP){var l=2*g.width,m=2*g.height,n=g.x-l/2,o=g.y-m/2;c.beginPath();var p=.5522848,q=l/2*p,r=m/2*p,s=n+l,t=o+m,u=n+l/2,v=o+m/2;c.moveTo(n,v),c.bezierCurveTo(n,v-r,u-q,o,u,o),c.bezierCurveTo(u+q,o,s,v-r,s,v),c.bezierCurveTo(s,v+r,u+q,t,u,t),c.bezierCurveTo(u-q,t,n,v+r,n,v),c.closePath(),f.fill&&(c.globalAlpha=f.fillAlpha*d,c.fillStyle="#"+("00000"+(0|h).toString(16)).substr(-6),c.fill()),f.lineWidth&&(c.globalAlpha=f.lineAlpha*d,c.strokeStyle="#"+("00000"+(0|i).toString(16)).substr(-6),c.stroke())}else if(f.type===b.Graphics.RREC){var w=g.x,x=g.y,y=g.width,z=g.height,A=g.radius,B=Math.min(y,z)/2|0;A=A>B?B:A,c.beginPath(),c.moveTo(w,x+A),c.lineTo(w,x+z-A),c.quadraticCurveTo(w,x+z,w+A,x+z),c.lineTo(w+y-A,x+z),c.quadraticCurveTo(w+y,x+z,w+y,x+z-A),c.lineTo(w+y,x+A),c.quadraticCurveTo(w+y,x,w+y-A,x),c.lineTo(w+A,x),c.quadraticCurveTo(w,x,w,x+A),c.closePath(),(f.fillColor||0===f.fillColor)&&(c.globalAlpha=f.fillAlpha*d,c.fillStyle="#"+("00000"+(0|h).toString(16)).substr(-6),c.fill()),f.lineWidth&&(c.globalAlpha=f.lineAlpha*d,c.strokeStyle="#"+("00000"+(0|i).toString(16)).substr(-6),c.stroke())}}},b.CanvasGraphics.renderGraphicsMask=function(a,c){var d=a.graphicsData.length;if(0!==d){d>1&&(d=1,window.console.log("Pixi.js warning: masks in canvas can only mask using the first path in the graphics object"));for(var e=0;1>e;e++){var f=a.graphicsData[e],g=f.shape;if(f.type===b.Graphics.POLY){c.beginPath();var h=g.points;c.moveTo(h[0],h[1]);for(var i=1;i<h.length/2;i++)c.lineTo(h[2*i],h[2*i+1]);h[0]===h[h.length-2]&&h[1]===h[h.length-1]&&c.closePath()}else if(f.type===b.Graphics.RECT)c.beginPath(),c.rect(g.x,g.y,g.width,g.height),c.closePath();else if(f.type===b.Graphics.CIRC)c.beginPath(),c.arc(g.x,g.y,g.radius,0,2*Math.PI),c.closePath();else if(f.type===b.Graphics.ELIP){var j=2*g.width,k=2*g.height,l=g.x-j/2,m=g.y-k/2;c.beginPath();var n=.5522848,o=j/2*n,p=k/2*n,q=l+j,r=m+k,s=l+j/2,t=m+k/2;c.moveTo(l,t),c.bezierCurveTo(l,t-p,s-o,m,s,m),c.bezierCurveTo(s+o,m,q,t-p,q,t),c.bezierCurveTo(q,t+p,s+o,r,s,r),c.bezierCurveTo(s-o,r,l,t+p,l,t),c.closePath()}else if(f.type===b.Graphics.RREC){var u=g.points,v=u[0],w=u[1],x=u[2],y=u[3],z=u[4],A=Math.min(x,y)/2|0;z=z>A?A:z,c.beginPath(),c.moveTo(v,w+z),c.lineTo(v,w+y-z),c.quadraticCurveTo(v,w+y,v+z,w+y),c.lineTo(v+x-z,w+y),c.quadraticCurveTo(v+x,w+y,v+x,w+y-z),c.lineTo(v+x,w+z),c.quadraticCurveTo(v+x,w,v+x-z,w),c.lineTo(v+z,w),c.quadraticCurveTo(v,w,v,w+z),c.closePath()}}}},b.CanvasGraphics.updateGraphicsTint=function(a){if(16777215!==a.tint)for(var b=(a.tint>>16&255)/255,c=(a.tint>>8&255)/255,d=(255&a.tint)/255,e=0;e<a.graphicsData.length;e++){var f=a.graphicsData[e],g=0|f.fillColor,h=0|f.lineColor;f._fillTint=((g>>16&255)/255*b*255<<16)+((g>>8&255)/255*c*255<<8)+(255&g)/255*d*255,f._lineTint=((h>>16&255)/255*b*255<<16)+((h>>8&255)/255*c*255<<8)+(255&h)/255*d*255}},b.Graphics=function(){b.DisplayObjectContainer.call(this),this.renderable=!0,this.fillAlpha=1,this.lineWidth=0,this.lineColor=0,this.graphicsData=[],this.tint=16777215,this.blendMode=b.blendModes.NORMAL,this.currentPath=null,this._webGL=[],this.isMask=!1,this.boundsPadding=0,this._localBounds=new b.Rectangle(0,0,1,1),this.dirty=!0,this.webGLDirty=!1,this.cachedSpriteDirty=!1},b.Graphics.prototype=Object.create(b.DisplayObjectContainer.prototype),b.Graphics.prototype.constructor=b.Graphics,Object.defineProperty(b.Graphics.prototype,"cacheAsBitmap",{get:function(){return this._cacheAsBitmap},set:function(a){this._cacheAsBitmap=a,this._cacheAsBitmap?this._generateCachedSprite():(this.destroyCachedSprite(),this.dirty=!0)}}),b.Graphics.prototype.lineStyle=function(a,c,d){if(this.lineWidth=a||0,this.lineColor=c||0,this.lineAlpha=arguments.length<3?1:d,this.currentPath){if(this.currentPath.shape.points.length)return this.drawShape(new b.Polygon(this.currentPath.shape.points.slice(-2))),this;this.currentPath.lineWidth=this.lineWidth,this.currentPath.lineColor=this.lineColor,this.currentPath.lineAlpha=this.lineAlpha}return this},b.Graphics.prototype.moveTo=function(a,c){return this.drawShape(new b.Polygon([a,c])),this},b.Graphics.prototype.lineTo=function(a,b){return this.currentPath.shape.points.push(a,b),this.dirty=!0,this},b.Graphics.prototype.quadraticCurveTo=function(a,b,c,d){this.currentPath?0===this.currentPath.shape.points.length&&(this.currentPath.shape.points=[0,0]):this.moveTo(0,0);var e,f,g=20,h=this.currentPath.shape.points;0===h.length&&this.moveTo(0,0);for(var i=h[h.length-2],j=h[h.length-1],k=0,l=1;g>=l;l++)k=l/g,e=i+(a-i)*k,f=j+(b-j)*k,h.push(e+(a+(c-a)*k-e)*k,f+(b+(d-b)*k-f)*k);return this.dirty=!0,this},b.Graphics.prototype.bezierCurveTo=function(a,b,c,d,e,f){this.currentPath?0===this.currentPath.shape.points.length&&(this.currentPath.shape.points=[0,0]):this.moveTo(0,0);for(var g,h,i,j,k,l=20,m=this.currentPath.shape.points,n=m[m.length-2],o=m[m.length-1],p=0,q=1;l>=q;q++)p=q/l,g=1-p,h=g*g,i=h*g,j=p*p,k=j*p,m.push(i*n+3*h*p*a+3*g*j*c+k*e,i*o+3*h*p*b+3*g*j*d+k*f);return this.dirty=!0,this},b.Graphics.prototype.arcTo=function(a,b,c,d,e){this.currentPath?0===this.currentPath.shape.points.length&&this.currentPath.shape.points.push(a,b):this.moveTo(a,b);var f=this.currentPath.shape.points,g=f[f.length-2],h=f[f.length-1],i=h-b,j=g-a,k=d-b,l=c-a,m=Math.abs(i*l-j*k);if(1e-8>m||0===e)(f[f.length-2]!==a||f[f.length-1]!==b)&&f.push(a,b);else{var n=i*i+j*j,o=k*k+l*l,p=i*k+j*l,q=e*Math.sqrt(n)/m,r=e*Math.sqrt(o)/m,s=q*p/n,t=r*p/o,u=q*l+r*j,v=q*k+r*i,w=j*(r+s),x=i*(r+s),y=l*(q+t),z=k*(q+t),A=Math.atan2(x-v,w-u),B=Math.atan2(z-v,y-u);this.arc(u+a,v+b,e,A,B,j*k>l*i)}return this.dirty=!0,this},b.Graphics.prototype.arc=function(a,b,c,d,e,f){var g,h=a+Math.cos(d)*c,i=b+Math.sin(d)*c;if(this.currentPath?(g=this.currentPath.shape.points,0===g.length?g.push(h,i):(g[g.length-2]!==h||g[g.length-1]!==i)&&g.push(h,i)):(this.moveTo(h,i),g=this.currentPath.shape.points),d===e)return this;!f&&d>=e?e+=2*Math.PI:f&&e>=d&&(d+=2*Math.PI);var j=f?-1*(d-e):e-d,k=Math.abs(j)/(2*Math.PI)*40;if(0===j)return this;for(var l=j/(2*k),m=2*l,n=Math.cos(l),o=Math.sin(l),p=k-1,q=p%1/p,r=0;p>=r;r++){var s=r+q*r,t=l+d+m*s,u=Math.cos(t),v=-Math.sin(t);g.push((n*u+o*v)*c+a,(n*-v+o*u)*c+b)}return this.dirty=!0,this},b.Graphics.prototype.beginFill=function(a,b){return this.filling=!0,this.fillColor=a||0,this.fillAlpha=void 0===b?1:b,this.currentPath&&this.currentPath.shape.points.length<=2&&(this.currentPath.fill=this.filling,this.currentPath.fillColor=this.fillColor,this.currentPath.fillAlpha=this.fillAlpha),this},b.Graphics.prototype.endFill=function(){return this.filling=!1,this.fillColor=null,this.fillAlpha=1,this},b.Graphics.prototype.drawRect=function(a,c,d,e){return this.drawShape(new b.Rectangle(a,c,d,e)),this},b.Graphics.prototype.drawRoundedRect=function(a,c,d,e,f){return this.drawShape(new b.RoundedRectangle(a,c,d,e,f)),this},b.Graphics.prototype.drawCircle=function(a,c,d){return this.drawShape(new b.Circle(a,c,d)),this},b.Graphics.prototype.drawEllipse=function(a,c,d,e){return this.drawShape(new b.Ellipse(a,c,d,e)),this},b.Graphics.prototype.drawPolygon=function(a){return a instanceof Array||(a=Array.prototype.slice.call(arguments)),this.drawShape(new b.Polygon(a)),this},b.Graphics.prototype.clear=function(){return this.lineWidth=0,this.filling=!1,this.dirty=!0,this.clearDirty=!0,this.graphicsData=[],this},b.Graphics.prototype.generateTexture=function(a,c){a=a||1;var d=this.getBounds(),e=new b.CanvasBuffer(d.width*a,d.height*a),f=b.Texture.fromCanvas(e.canvas,c);return f.baseTexture.resolution=a,e.context.scale(a,a),e.context.translate(-d.x,-d.y),b.CanvasGraphics.renderGraphics(this,e.context),f},b.Graphics.prototype._renderWebGL=function(a){if(this.visible!==!1&&0!==this.alpha&&this.isMask!==!0){if(this._cacheAsBitmap)return(this.dirty||this.cachedSpriteDirty)&&(this._generateCachedSprite(),this.updateCachedSpriteTexture(),this.cachedSpriteDirty=!1,this.dirty=!1),this._cachedSprite.worldAlpha=this.worldAlpha,void b.Sprite.prototype._renderWebGL.call(this._cachedSprite,a);if(a.spriteBatch.stop(),a.blendModeManager.setBlendMode(this.blendMode),this._mask&&a.maskManager.pushMask(this._mask,a),this._filters&&a.filterManager.pushFilter(this._filterBlock),this.blendMode!==a.spriteBatch.currentBlendMode){a.spriteBatch.currentBlendMode=this.blendMode;var c=b.blendModesWebGL[a.spriteBatch.currentBlendMode];a.spriteBatch.gl.blendFunc(c[0],c[1])}if(this.webGLDirty&&(this.dirty=!0,this.webGLDirty=!1),b.WebGLGraphics.renderGraphics(this,a),this.children.length){a.spriteBatch.start();for(var d=0,e=this.children.length;e>d;d++)this.children[d]._renderWebGL(a);a.spriteBatch.stop()}this._filters&&a.filterManager.popFilter(),this._mask&&a.maskManager.popMask(this.mask,a),a.drawCount++,a.spriteBatch.start()}},b.Graphics.prototype._renderCanvas=function(a){if(this.visible!==!1&&0!==this.alpha&&this.isMask!==!0){if(this._cacheAsBitmap)return(this.dirty||this.cachedSpriteDirty)&&(this._generateCachedSprite(),this.updateCachedSpriteTexture(),this.cachedSpriteDirty=!1,this.dirty=!1),this._cachedSprite.alpha=this.alpha,void b.Sprite.prototype._renderCanvas.call(this._cachedSprite,a);var c=a.context,d=this.worldTransform;this.blendMode!==a.currentBlendMode&&(a.currentBlendMode=this.blendMode,c.globalCompositeOperation=b.blendModesCanvas[a.currentBlendMode]),this._mask&&a.maskManager.pushMask(this._mask,a);var e=a.resolution;c.setTransform(d.a*e,d.b*e,d.c*e,d.d*e,d.tx*e,d.ty*e),b.CanvasGraphics.renderGraphics(this,c);for(var f=0,g=this.children.length;g>f;f++)this.children[f]._renderCanvas(a);this._mask&&a.maskManager.popMask(a)}},b.Graphics.prototype.getBounds=function(a){if(this.isMask)return b.EmptyRectangle;this.dirty&&(this.updateLocalBounds(),this.webGLDirty=!0,this.cachedSpriteDirty=!0,this.dirty=!1);var c=this._localBounds,d=c.x,e=c.width+c.x,f=c.y,g=c.height+c.y,h=a||this.worldTransform,i=h.a,j=h.b,k=h.c,l=h.d,m=h.tx,n=h.ty,o=i*e+k*g+m,p=l*g+j*e+n,q=i*d+k*g+m,r=l*g+j*d+n,s=i*d+k*f+m,t=l*f+j*d+n,u=i*e+k*f+m,v=l*f+j*e+n,w=o,x=p,y=o,z=p;return y=y>q?q:y,y=y>s?s:y,y=y>u?u:y,z=z>r?r:z,z=z>t?t:z,z=z>v?v:z,w=q>w?q:w,w=s>w?s:w,w=u>w?u:w,x=r>x?r:x,x=t>x?t:x,x=v>x?v:x,this._bounds.x=y,this._bounds.width=w-y,this._bounds.y=z,this._bounds.height=x-z,this._bounds},b.Graphics.prototype.updateLocalBounds=function(){var a=1/0,c=-1/0,d=1/0,e=-1/0;if(this.graphicsData.length)for(var f,g,h,i,j,k,l=0;l<this.graphicsData.length;l++){var m=this.graphicsData[l],n=m.type,o=m.lineWidth;if(f=m.shape,n===b.Graphics.RECT||n===b.Graphics.RREC)h=f.x-o/2,i=f.y-o/2,j=f.width+o,k=f.height+o,a=a>h?h:a,c=h+j>c?h+j:c,d=d>i?i:d,e=i+k>e?i+k:e;else if(n===b.Graphics.CIRC)h=f.x,i=f.y,j=f.radius+o/2,k=f.radius+o/2,a=a>h-j?h-j:a,c=h+j>c?h+j:c,d=d>i-k?i-k:d,e=i+k>e?i+k:e;else if(n===b.Graphics.ELIP)h=f.x,i=f.y,j=f.width+o/2,k=f.height+o/2,a=a>h-j?h-j:a,c=h+j>c?h+j:c,d=d>i-k?i-k:d,e=i+k>e?i+k:e;else{g=f.points;for(var p=0;p<g.length;p+=2)h=g[p],i=g[p+1],a=a>h-o?h-o:a,c=h+o>c?h+o:c,d=d>i-o?i-o:d,e=i+o>e?i+o:e}}else a=0,c=0,d=0,e=0;var q=this.boundsPadding;this._localBounds.x=a-q,this._localBounds.width=c-a+2*q,this._localBounds.y=d-q,this._localBounds.height=e-d+2*q},b.Graphics.prototype._generateCachedSprite=function(){var a=this.getLocalBounds();if(this._cachedSprite)this._cachedSprite.buffer.resize(a.width,a.height);else{var c=new b.CanvasBuffer(a.width,a.height),d=b.Texture.fromCanvas(c.canvas);this._cachedSprite=new b.Sprite(d),this._cachedSprite.buffer=c,this._cachedSprite.worldTransform=this.worldTransform}this._cachedSprite.anchor.x=-(a.x/a.width),this._cachedSprite.anchor.y=-(a.y/a.height),this._cachedSprite.buffer.context.translate(-a.x,-a.y),this.worldAlpha=1,b.CanvasGraphics.renderGraphics(this,this._cachedSprite.buffer.context),this._cachedSprite.alpha=this.alpha},b.Graphics.prototype.updateCachedSpriteTexture=function(){var a=this._cachedSprite,b=a.texture,c=a.buffer.canvas;b.baseTexture.width=c.width,b.baseTexture.height=c.height,b.crop.width=b.frame.width=c.width,b.crop.height=b.frame.height=c.height,a._width=c.width,a._height=c.height,b.baseTexture.dirty()},b.Graphics.prototype.destroyCachedSprite=function(){this._cachedSprite.texture.destroy(!0),this._cachedSprite=null},b.Graphics.prototype.drawShape=function(a){this.currentPath&&this.currentPath.shape.points.length<=2&&this.graphicsData.pop(),this.currentPath=null;var c=new b.GraphicsData(this.lineWidth,this.lineColor,this.lineAlpha,this.fillColor,this.fillAlpha,this.filling,a);return this.graphicsData.push(c),c.type===b.Graphics.POLY&&(c.shape.closed=this.filling,this.currentPath=c),this.dirty=!0,c},b.GraphicsData=function(a,b,c,d,e,f,g){this.lineWidth=a,this.lineColor=b,this.lineAlpha=c,this._lineTint=b,this.fillColor=d,this.fillAlpha=e,this._fillTint=d,this.fill=f,this.shape=g,this.type=g.type},b.Graphics.POLY=0,b.Graphics.RECT=1,b.Graphics.CIRC=2,b.Graphics.ELIP=3,b.Graphics.RREC=4,b.Polygon.prototype.type=b.Graphics.POLY,b.Rectangle.prototype.type=b.Graphics.RECT,b.Circle.prototype.type=b.Graphics.CIRC,b.Ellipse.prototype.type=b.Graphics.ELIP,b.RoundedRectangle.prototype.type=b.Graphics.RREC,b.Strip=function(a){b.DisplayObjectContainer.call(this),this.texture=a,this.uvs=new b.Float32Array([0,1,1,1,1,0,0,1]),this.vertices=new b.Float32Array([0,0,100,0,100,100,0,100]),this.colors=new b.Float32Array([1,1,1,1]),this.indices=new b.Uint16Array([0,1,2,3]),this.dirty=!0,this.blendMode=b.blendModes.NORMAL,this.canvasPadding=0,this.drawMode=b.Strip.DrawModes.TRIANGLE_STRIP},b.Strip.prototype=Object.create(b.DisplayObjectContainer.prototype),b.Strip.prototype.constructor=b.Strip,b.Strip.prototype._renderWebGL=function(a){!this.visible||this.alpha<=0||(a.spriteBatch.stop(),this._vertexBuffer||this._initWebGL(a),a.shaderManager.setShader(a.shaderManager.stripShader),this._renderStrip(a),a.spriteBatch.start())},b.Strip.prototype._initWebGL=function(a){var b=a.gl;this._vertexBuffer=b.createBuffer(),this._indexBuffer=b.createBuffer(),this._uvBuffer=b.createBuffer(),this._colorBuffer=b.createBuffer(),b.bindBuffer(b.ARRAY_BUFFER,this._vertexBuffer),b.bufferData(b.ARRAY_BUFFER,this.vertices,b.DYNAMIC_DRAW),b.bindBuffer(b.ARRAY_BUFFER,this._uvBuffer),b.bufferData(b.ARRAY_BUFFER,this.uvs,b.STATIC_DRAW),b.bindBuffer(b.ARRAY_BUFFER,this._colorBuffer),b.bufferData(b.ARRAY_BUFFER,this.colors,b.STATIC_DRAW),b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,this._indexBuffer),b.bufferData(b.ELEMENT_ARRAY_BUFFER,this.indices,b.STATIC_DRAW)},b.Strip.prototype._renderStrip=function(a){var c=a.gl,d=a.projection,e=a.offset,f=a.shaderManager.stripShader,g=this.drawMode===b.Strip.DrawModes.TRIANGLE_STRIP?c.TRIANGLE_STRIP:c.TRIANGLES;a.blendModeManager.setBlendMode(this.blendMode),c.uniformMatrix3fv(f.translationMatrix,!1,this.worldTransform.toArray(!0)),c.uniform2f(f.projectionVector,d.x,-d.y),c.uniform2f(f.offsetVector,-e.x,-e.y),c.uniform1f(f.alpha,this.worldAlpha),this.dirty?(this.dirty=!1,c.bindBuffer(c.ARRAY_BUFFER,this._vertexBuffer),c.bufferData(c.ARRAY_BUFFER,this.vertices,c.STATIC_DRAW),c.vertexAttribPointer(f.aVertexPosition,2,c.FLOAT,!1,0,0),c.bindBuffer(c.ARRAY_BUFFER,this._uvBuffer),c.bufferData(c.ARRAY_BUFFER,this.uvs,c.STATIC_DRAW),c.vertexAttribPointer(f.aTextureCoord,2,c.FLOAT,!1,0,0),c.activeTexture(c.TEXTURE0),this.texture.baseTexture._dirty[c.id]?a.renderer.updateTexture(this.texture.baseTexture):c.bindTexture(c.TEXTURE_2D,this.texture.baseTexture._glTextures[c.id]),c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,this._indexBuffer),c.bufferData(c.ELEMENT_ARRAY_BUFFER,this.indices,c.STATIC_DRAW)):(c.bindBuffer(c.ARRAY_BUFFER,this._vertexBuffer),c.bufferSubData(c.ARRAY_BUFFER,0,this.vertices),c.vertexAttribPointer(f.aVertexPosition,2,c.FLOAT,!1,0,0),c.bindBuffer(c.ARRAY_BUFFER,this._uvBuffer),c.vertexAttribPointer(f.aTextureCoord,2,c.FLOAT,!1,0,0),c.activeTexture(c.TEXTURE0),this.texture.baseTexture._dirty[c.id]?a.renderer.updateTexture(this.texture.baseTexture):c.bindTexture(c.TEXTURE_2D,this.texture.baseTexture._glTextures[c.id]),c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,this._indexBuffer)),c.drawElements(g,this.indices.length,c.UNSIGNED_SHORT,0)},b.Strip.prototype._renderCanvas=function(a){var c=a.context,d=this.worldTransform;a.roundPixels?c.setTransform(d.a,d.b,d.c,d.d,0|d.tx,0|d.ty):c.setTransform(d.a,d.b,d.c,d.d,d.tx,d.ty),this.drawMode===b.Strip.DrawModes.TRIANGLE_STRIP?this._renderCanvasTriangleStrip(c):this._renderCanvasTriangles(c)},b.Strip.prototype._renderCanvasTriangleStrip=function(a){var b=this.vertices,c=this.uvs,d=b.length/2;this.count++;for(var e=0;d-2>e;e++){var f=2*e;this._renderCanvasDrawTriangle(a,b,c,f,f+2,f+4)}},b.Strip.prototype._renderCanvasTriangles=function(a){var b=this.vertices,c=this.uvs,d=this.indices,e=d.length;this.count++;for(var f=0;e>f;f+=3){var g=2*d[f],h=2*d[f+1],i=2*d[f+2];this._renderCanvasDrawTriangle(a,b,c,g,h,i)}},b.Strip.prototype._renderCanvasDrawTriangle=function(a,b,c,d,e,f){var g=this.texture.baseTexture.source,h=this.texture.width,i=this.texture.height,j=b[d],k=b[e],l=b[f],m=b[d+1],n=b[e+1],o=b[f+1],p=c[d]*h,q=c[e]*h,r=c[f]*h,s=c[d+1]*i,t=c[e+1]*i,u=c[f+1]*i;if(this.canvasPadding>0){var v=this.canvasPadding/this.worldTransform.a,w=this.canvasPadding/this.worldTransform.d,x=(j+k+l)/3,y=(m+n+o)/3,z=j-x,A=m-y,B=Math.sqrt(z*z+A*A);j=x+z/B*(B+v),m=y+A/B*(B+w),z=k-x,A=n-y,B=Math.sqrt(z*z+A*A),k=x+z/B*(B+v),n=y+A/B*(B+w),z=l-x,A=o-y,B=Math.sqrt(z*z+A*A),l=x+z/B*(B+v),o=y+A/B*(B+w)}a.save(),a.beginPath(),a.moveTo(j,m),a.lineTo(k,n),a.lineTo(l,o),a.closePath(),a.clip();var C=p*t+s*r+q*u-t*r-s*q-p*u,D=j*t+s*l+k*u-t*l-s*k-j*u,E=p*k+j*r+q*l-k*r-j*q-p*l,F=p*t*l+s*k*r+j*q*u-j*t*r-s*q*l-p*k*u,G=m*t+s*o+n*u-t*o-s*n-m*u,H=p*n+m*r+q*o-n*r-m*q-p*o,I=p*t*o+s*n*r+m*q*u-m*t*r-s*q*o-p*n*u;a.transform(D/C,G/C,E/C,H/C,F/C,I/C),a.drawImage(g,0,0),a.restore()},b.Strip.prototype.renderStripFlat=function(a){var b=this.context,c=a.vertices,d=c.length/2;this.count++,b.beginPath();for(var e=1;d-2>e;e++){var f=2*e,g=c[f],h=c[f+2],i=c[f+4],j=c[f+1],k=c[f+3],l=c[f+5];b.moveTo(g,j),b.lineTo(h,k),b.lineTo(i,l)}b.fillStyle="#FF0000",b.fill(),b.closePath()},b.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},b.Strip.prototype.getBounds=function(a){for(var c=a||this.worldTransform,d=c.a,e=c.b,f=c.c,g=c.d,h=c.tx,i=c.ty,j=-1/0,k=-1/0,l=1/0,m=1/0,n=this.vertices,o=0,p=n.length;p>o;o+=2){var q=n[o],r=n[o+1],s=d*q+f*r+h,t=g*r+e*q+i;l=l>s?s:l,m=m>t?t:m,j=s>j?s:j,k=t>k?t:k}if(l===-1/0||1/0===k)return b.EmptyRectangle;var u=this._bounds;return u.x=l,u.width=j-l,u.y=m,u.height=k-m,this._currentBounds=u,u},b.Strip.DrawModes={TRIANGLE_STRIP:0,TRIANGLES:1},b.Rope=function(a,c){b.Strip.call(this,a),this.points=c,this.vertices=new b.Float32Array(4*c.length),this.uvs=new b.Float32Array(4*c.length),this.colors=new b.Float32Array(2*c.length),this.indices=new b.Uint16Array(2*c.length),this.refresh()},b.Rope.prototype=Object.create(b.Strip.prototype),b.Rope.prototype.constructor=b.Rope,b.Rope.prototype.refresh=function(){var a=this.points;if(!(a.length<1)){var b=this.uvs,c=a[0],d=this.indices,e=this.colors;this.count-=.2,b[0]=0,b[1]=0,b[2]=0,b[3]=1,e[0]=1,e[1]=1,d[0]=0,d[1]=1;for(var f,g,h,i=a.length,j=1;i>j;j++)f=a[j],g=4*j,h=j/(i-1),j%2?(b[g]=h,b[g+1]=0,b[g+2]=h,b[g+3]=1):(b[g]=h,b[g+1]=0,b[g+2]=h,b[g+3]=1),g=2*j,e[g]=1,e[g+1]=1,g=2*j,d[g]=g,d[g+1]=g+1,c=f}},b.Rope.prototype.updateTransform=function(){var a=this.points;if(!(a.length<1)){var c,d=a[0],e={x:0,y:0};this.count-=.2;for(var f,g,h,i,j,k=this.vertices,l=a.length,m=0;l>m;m++)f=a[m],g=4*m,c=m<a.length-1?a[m+1]:f,e.y=-(c.x-d.x),e.x=c.y-d.y,h=10*(1-m/(l-1)),h>1&&(h=1),i=Math.sqrt(e.x*e.x+e.y*e.y),j=this.texture.height/2,e.x/=i,e.y/=i,e.x*=j,e.y*=j,k[g]=f.x+e.x,k[g+1]=f.y+e.y,k[g+2]=f.x-e.x,k[g+3]=f.y-e.y,d=f;b.DisplayObjectContainer.prototype.updateTransform.call(this)}},b.Rope.prototype.setTexture=function(a){this.texture=a},b.TilingSprite=function(a,c,d){b.Sprite.call(this,a),this._width=c||100,this._height=d||100,this.tileScale=new b.Point(1,1),this.tileScaleOffset=new b.Point(1,1),this.tilePosition=new b.Point(0,0),this.renderable=!0,this.tint=16777215,this.blendMode=b.blendModes.NORMAL},b.TilingSprite.prototype=Object.create(b.Sprite.prototype),b.TilingSprite.prototype.constructor=b.TilingSprite,Object.defineProperty(b.TilingSprite.prototype,"width",{get:function(){return this._width},set:function(a){this._width=a}}),Object.defineProperty(b.TilingSprite.prototype,"height",{get:function(){return this._height},set:function(a){this._height=a}}),b.TilingSprite.prototype.setTexture=function(a){this.texture!==a&&(this.texture=a,this.refreshTexture=!0,this.cachedTint=16777215)},b.TilingSprite.prototype._renderWebGL=function(a){if(this.visible!==!1&&0!==this.alpha){var b,c;for(this._mask&&(a.spriteBatch.stop(),a.maskManager.pushMask(this.mask,a),a.spriteBatch.start()),this._filters&&(a.spriteBatch.flush(),a.filterManager.pushFilter(this._filterBlock)),!this.tilingTexture||this.refreshTexture?(this.generateTilingTexture(!0),this.tilingTexture&&this.tilingTexture.needsUpdate&&(a.renderer.updateTexture(this.tilingTexture.baseTexture),this.tilingTexture.needsUpdate=!1)):a.spriteBatch.renderTilingSprite(this),b=0,c=this.children.length;c>b;b++)this.children[b]._renderWebGL(a);a.spriteBatch.stop(),this._filters&&a.filterManager.popFilter(),this._mask&&a.maskManager.popMask(this._mask,a),a.spriteBatch.start()}},b.TilingSprite.prototype._renderCanvas=function(a){if(this.visible!==!1&&0!==this.alpha){var c=a.context;this._mask&&a.maskManager.pushMask(this._mask,c),c.globalAlpha=this.worldAlpha;var d,e,f=this.worldTransform,g=a.resolution;if(c.setTransform(f.a*g,f.b*g,f.c*g,f.d*g,f.tx*g,f.ty*g),!this.__tilePattern||this.refreshTexture){if(this.generateTilingTexture(!1),!this.tilingTexture)return;this.__tilePattern=c.createPattern(this.tilingTexture.baseTexture.source,"repeat")}this.blendMode!==a.currentBlendMode&&(a.currentBlendMode=this.blendMode,c.globalCompositeOperation=b.blendModesCanvas[a.currentBlendMode]);var h=this.tilePosition,i=this.tileScale;for(h.x%=this.tilingTexture.baseTexture.width,h.y%=this.tilingTexture.baseTexture.height,c.scale(i.x,i.y),c.translate(h.x+this.anchor.x*-this._width,h.y+this.anchor.y*-this._height),c.fillStyle=this.__tilePattern,c.fillRect(-h.x,-h.y,this._width/i.x,this._height/i.y),c.scale(1/i.x,1/i.y),c.translate(-h.x+this.anchor.x*this._width,-h.y+this.anchor.y*this._height),this._mask&&a.maskManager.popMask(a.context),d=0,e=this.children.length;e>d;d++)this.children[d]._renderCanvas(a)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16604
}},b.TilingSprite.prototype.getBounds=function(){var a=this._width,b=this._height,c=a*(1-this.anchor.x),d=a*-this.anchor.x,e=b*(1-this.anchor.y),f=b*-this.anchor.y,g=this.worldTransform,h=g.a,i=g.b,j=g.c,k=g.d,l=g.tx,m=g.ty,n=h*d+j*f+l,o=k*f+i*d+m,p=h*c+j*f+l,q=k*f+i*c+m,r=h*c+j*e+l,s=k*e+i*c+m,t=h*d+j*e+l,u=k*e+i*d+m,v=-1/0,w=-1/0,x=1/0,y=1/0;x=x>n?n:x,x=x>p?p:x,x=x>r?r:x,x=x>t?t:x,y=y>o?o:y,y=y>q?q:y,y=y>s?s:y,y=y>u?u:y,v=n>v?n:v,v=p>v?p:v,v=r>v?r:v,v=t>v?t:v,w=o>w?o:w,w=q>w?q:w,w=s>w?s:w,w=u>w?u:w;var z=this._bounds;return z.x=x,z.width=v-x,z.y=y,z.height=w-y,this._currentBounds=z,z},b.TilingSprite.prototype.onTextureUpdate=function(){},b.TilingSprite.prototype.generateTilingTexture=function(a){if(this.texture.baseTexture.hasLoaded){var c,d,e=this.originalTexture||this.texture,f=e.frame,g=f.width!==e.baseTexture.width||f.height!==e.baseTexture.height,h=!1;if(a?(c=b.getNextPowerOfTwo(f.width),d=b.getNextPowerOfTwo(f.height),(f.width!==c||f.height!==d||e.baseTexture.width!==c||e.baseTexture.height||d)&&(h=!0)):g&&(c=f.width,d=f.height,h=!0),h){var i;this.tilingTexture&&this.tilingTexture.isTiling?(i=this.tilingTexture.canvasBuffer,i.resize(c,d),this.tilingTexture.baseTexture.width=c,this.tilingTexture.baseTexture.height=d,this.tilingTexture.needsUpdate=!0):(i=new b.CanvasBuffer(c,d),this.tilingTexture=b.Texture.fromCanvas(i.canvas),this.tilingTexture.canvasBuffer=i,this.tilingTexture.isTiling=!0),i.context.drawImage(e.baseTexture.source,e.crop.x,e.crop.y,e.crop.width,e.crop.height,0,0,c,d),this.tileScaleOffset.x=f.width/c,this.tileScaleOffset.y=f.height/d}else this.tilingTexture&&this.tilingTexture.isTiling&&this.tilingTexture.destroy(!0),this.tileScaleOffset.x=1,this.tileScaleOffset.y=1,this.tilingTexture=e;this.refreshTexture=!1,this.originalTexture=this.texture,this.texture=this.tilingTexture,this.tilingTexture.baseTexture._powerOf2=!0}};var c={radDeg:180/Math.PI,degRad:Math.PI/180,temp:[],Float32Array:"undefined"==typeof Float32Array?Array:Float32Array,Uint16Array:"undefined"==typeof Uint16Array?Array:Uint16Array};c.BoneData=function(a,b){this.name=a,this.parent=b},c.BoneData.prototype={length:0,x:0,y:0,rotation:0,scaleX:1,scaleY:1,inheritScale:!0,inheritRotation:!0,flipX:!1,flipY:!1},c.SlotData=function(a,b){this.name=a,this.boneData=b},c.SlotData.prototype={r:1,g:1,b:1,a:1,attachmentName:null,additiveBlending:!1},c.IkConstraintData=function(a){this.name=a,this.bones=[]},c.IkConstraintData.prototype={target:null,bendDirection:1,mix:1},c.Bone=function(a,b,c){this.data=a,this.skeleton=b,this.parent=c,this.setToSetupPose()},c.Bone.yDown=!1,c.Bone.prototype={x:0,y:0,rotation:0,rotationIK:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,m00:0,m01:0,worldX:0,m10:0,m11:0,worldY:0,worldRotation:0,worldScaleX:1,worldScaleY:1,worldFlipX:!1,worldFlipY:!1,updateWorldTransform:function(){var a=this.parent;if(a)this.worldX=this.x*a.m00+this.y*a.m01+a.worldX,this.worldY=this.x*a.m10+this.y*a.m11+a.worldY,this.data.inheritScale?(this.worldScaleX=a.worldScaleX*this.scaleX,this.worldScaleY=a.worldScaleY*this.scaleY):(this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY),this.worldRotation=this.data.inheritRotation?a.worldRotation+this.rotationIK:this.rotationIK,this.worldFlipX=a.worldFlipX!=this.flipX,this.worldFlipY=a.worldFlipY!=this.flipY;else{var b=this.skeleton.flipX,d=this.skeleton.flipY;this.worldX=b?-this.x:this.x,this.worldY=d!=c.Bone.yDown?-this.y:this.y,this.worldScaleX=this.scaleX,this.worldScaleY=this.scaleY,this.worldRotation=this.rotationIK,this.worldFlipX=b!=this.flipX,this.worldFlipY=d!=this.flipY}var e=this.worldRotation*c.degRad,f=Math.cos(e),g=Math.sin(e);this.worldFlipX?(this.m00=-f*this.worldScaleX,this.m01=g*this.worldScaleY):(this.m00=f*this.worldScaleX,this.m01=-g*this.worldScaleY),this.worldFlipY!=c.Bone.yDown?(this.m10=-g*this.worldScaleX,this.m11=-f*this.worldScaleY):(this.m10=g*this.worldScaleX,this.m11=f*this.worldScaleY)},setToSetupPose:function(){var a=this.data;this.x=a.x,this.y=a.y,this.rotation=a.rotation,this.rotationIK=this.rotation,this.scaleX=a.scaleX,this.scaleY=a.scaleY,this.flipX=a.flipX,this.flipY=a.flipY},worldToLocal:function(a){var b=a[0]-this.worldX,d=a[1]-this.worldY,e=this.m00,f=this.m10,g=this.m01,h=this.m11;this.worldFlipX!=(this.worldFlipY!=c.Bone.yDown)&&(e=-e,h=-h);var i=1/(e*h-g*f);a[0]=b*e*i-d*g*i,a[1]=d*h*i-b*f*i},localToWorld:function(a){var b=a[0],c=a[1];a[0]=b*this.m00+c*this.m01+this.worldX,a[1]=b*this.m10+c*this.m11+this.worldY}},c.Slot=function(a,b){this.data=a,this.bone=b,this.setToSetupPose()},c.Slot.prototype={r:1,g:1,b:1,a:1,_attachmentTime:0,attachment:null,attachmentVertices:[],setAttachment:function(a){this.attachment=a,this._attachmentTime=this.bone.skeleton.time,this.attachmentVertices.length=0},setAttachmentTime:function(a){this._attachmentTime=this.bone.skeleton.time-a},getAttachmentTime:function(){return this.bone.skeleton.time-this._attachmentTime},setToSetupPose:function(){var a=this.data;this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a;for(var b=this.bone.skeleton.data.slots,c=0,d=b.length;d>c;c++)if(b[c]==a){this.setAttachment(a.attachmentName?this.bone.skeleton.getAttachmentBySlotIndex(c,a.attachmentName):null);break}}},c.IkConstraint=function(a,b){this.data=a,this.mix=a.mix,this.bendDirection=a.bendDirection,this.bones=[];for(var c=0,d=a.bones.length;d>c;c++)this.bones.push(b.findBone(a.bones[c].name));this.target=b.findBone(a.target.name)},c.IkConstraint.prototype={apply:function(){var a=this.target,b=this.bones;switch(b.length){case 1:c.IkConstraint.apply1(b[0],a.worldX,a.worldY,this.mix);break;case 2:c.IkConstraint.apply2(b[0],b[1],a.worldX,a.worldY,this.bendDirection,this.mix)}}},c.IkConstraint.apply1=function(a,b,d,e){var f=a.data.inheritRotation&&a.parent?a.parent.worldRotation:0,g=a.rotation,h=Math.atan2(d-a.worldY,b-a.worldX)*c.radDeg-f;a.rotationIK=g+(h-g)*e},c.IkConstraint.apply2=function(a,b,d,e,f,g){var h=b.rotation,i=a.rotation;if(!g)return b.rotationIK=h,void(a.rotationIK=i);var j,k,l=c.temp,m=a.parent;m?(l[0]=d,l[1]=e,m.worldToLocal(l),d=(l[0]-a.x)*m.worldScaleX,e=(l[1]-a.y)*m.worldScaleY):(d-=a.x,e-=a.y),b.parent==a?(j=b.x,k=b.y):(l[0]=b.x,l[1]=b.y,b.parent.localToWorld(l),a.worldToLocal(l),j=l[0],k=l[1]);var n=j*a.worldScaleX,o=k*a.worldScaleY,p=Math.atan2(o,n),q=Math.sqrt(n*n+o*o),r=b.data.length*b.worldScaleX,s=2*q*r;if(1e-4>s)return void(b.rotationIK=h+(Math.atan2(e,d)*c.radDeg-i-h)*g);var t=(d*d+e*e-q*q-r*r)/s;-1>t?t=-1:t>1&&(t=1);var u=Math.acos(t)*f,v=q+r*t,w=r*Math.sin(u),x=Math.atan2(e*v-d*w,d*v+e*w),y=(x-p)*c.radDeg-i;y>180?y-=360:-180>y&&(y+=360),a.rotationIK=i+y*g,y=(u+p)*c.radDeg-h,y>180?y-=360:-180>y&&(y+=360),b.rotationIK=h+(y+a.worldRotation-b.parent.worldRotation)*g},c.Skin=function(a){this.name=a,this.attachments={}},c.Skin.prototype={addAttachment:function(a,b,c){this.attachments[a+":"+b]=c},getAttachment:function(a,b){return this.attachments[a+":"+b]},_attachAll:function(a,b){for(var c in b.attachments){var d=c.indexOf(":"),e=parseInt(c.substring(0,d)),f=c.substring(d+1),g=a.slots[e];if(g.attachment&&g.attachment.name==f){var h=this.getAttachment(e,f);h&&g.setAttachment(h)}}}},c.Animation=function(a,b,c){this.name=a,this.timelines=b,this.duration=c},c.Animation.prototype={apply:function(a,b,c,d,e){d&&0!=this.duration&&(c%=this.duration,b%=this.duration);for(var f=this.timelines,g=0,h=f.length;h>g;g++)f[g].apply(a,b,c,e,1)},mix:function(a,b,c,d,e,f){d&&0!=this.duration&&(c%=this.duration,b%=this.duration);for(var g=this.timelines,h=0,i=g.length;i>h;h++)g[h].apply(a,b,c,e,f)}},c.Animation.binarySearch=function(a,b,c){var d=0,e=Math.floor(a.length/c)-2;if(!e)return c;for(var f=e>>>1;;){if(a[(f+1)*c]<=b?d=f+1:e=f,d==e)return(d+1)*c;f=d+e>>>1}},c.Animation.binarySearch1=function(a,b){var c=0,d=a.length-2;if(!d)return 1;for(var e=d>>>1;;){if(a[e+1]<=b?c=e+1:d=e,c==d)return c+1;e=c+d>>>1}},c.Animation.linearSearch=function(a,b,c){for(var d=0,e=a.length-c;e>=d;d+=c)if(a[d]>b)return d;return-1},c.Curves=function(){this.curves=[]},c.Curves.prototype={setLinear:function(a){this.curves[19*a]=0},setStepped:function(a){this.curves[19*a]=1},setCurve:function(a,b,c,d,e){var f=.1,g=f*f,h=g*f,i=3*f,j=3*g,k=6*g,l=6*h,m=2*-b+d,n=2*-c+e,o=3*(b-d)+1,p=3*(c-e)+1,q=b*i+m*j+o*h,r=c*i+n*j+p*h,s=m*k+o*l,t=n*k+p*l,u=o*l,v=p*l,w=19*a,x=this.curves;x[w++]=2;for(var y=q,z=r,A=w+19-1;A>w;w+=2)x[w]=y,x[w+1]=z,q+=s,r+=t,s+=u,t+=v,y+=q,z+=r},getCurvePercent:function(a,b){b=0>b?0:b>1?1:b;var c=this.curves,d=19*a,e=c[d];if(0===e)return b;if(1==e)return 0;d++;for(var f=0,g=d,h=d+19-1;h>d;d+=2)if(f=c[d],f>=b){var i,j;return d==g?(i=0,j=0):(i=c[d-2],j=c[d-1]),j+(c[d+1]-j)*(b-i)/(f-i)}var k=c[d-1];return k+(1-k)*(b-f)/(1-f)}},c.RotateTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=2*a},c.RotateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(a,b,c){a*=2,this.frames[a]=b,this.frames[a+1]=c},apply:function(a,b,d,e,f){var g=this.frames;if(!(d<g[0])){var h=a.bones[this.boneIndex];if(d>=g[g.length-2]){for(var i=h.data.rotation+g[g.length-1]-h.rotation;i>180;)i-=360;for(;-180>i;)i+=360;return void(h.rotation+=i*f)}var j=c.Animation.binarySearch(g,d,2),k=g[j-1],l=g[j],m=1-(d-l)/(g[j-2]-l);m=this.curves.getCurvePercent(j/2-1,m);for(var i=g[j+1]-k;i>180;)i-=360;for(;-180>i;)i+=360;for(i=h.data.rotation+(k+i*m)-h.rotation;i>180;)i-=360;for(;-180>i;)i+=360;h.rotation+=i*f}}},c.TranslateTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=3*a},c.TranslateTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(a,b,c,d){a*=3,this.frames[a]=b,this.frames[a+1]=c,this.frames[a+2]=d},apply:function(a,b,d,e,f){var g=this.frames;if(!(d<g[0])){var h=a.bones[this.boneIndex];if(d>=g[g.length-3])return h.x+=(h.data.x+g[g.length-2]-h.x)*f,void(h.y+=(h.data.y+g[g.length-1]-h.y)*f);var i=c.Animation.binarySearch(g,d,3),j=g[i-2],k=g[i-1],l=g[i],m=1-(d-l)/(g[i+-3]-l);m=this.curves.getCurvePercent(i/3-1,m),h.x+=(h.data.x+j+(g[i+1]-j)*m-h.x)*f,h.y+=(h.data.y+k+(g[i+2]-k)*m-h.y)*f}}},c.ScaleTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=3*a},c.ScaleTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(a,b,c,d){a*=3,this.frames[a]=b,this.frames[a+1]=c,this.frames[a+2]=d},apply:function(a,b,d,e,f){var g=this.frames;if(!(d<g[0])){var h=a.bones[this.boneIndex];if(d>=g[g.length-3])return h.scaleX+=(h.data.scaleX*g[g.length-2]-h.scaleX)*f,void(h.scaleY+=(h.data.scaleY*g[g.length-1]-h.scaleY)*f);var i=c.Animation.binarySearch(g,d,3),j=g[i-2],k=g[i-1],l=g[i],m=1-(d-l)/(g[i+-3]-l);m=this.curves.getCurvePercent(i/3-1,m),h.scaleX+=(h.data.scaleX*(j+(g[i+1]-j)*m)-h.scaleX)*f,h.scaleY+=(h.data.scaleY*(k+(g[i+2]-k)*m)-h.scaleY)*f}}},c.ColorTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=5*a},c.ColorTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length/5},setFrame:function(a,b,c,d,e,f){a*=5,this.frames[a]=b,this.frames[a+1]=c,this.frames[a+2]=d,this.frames[a+3]=e,this.frames[a+4]=f},apply:function(a,b,d,e,f){var g=this.frames;if(!(d<g[0])){var h,i,j,k;if(d>=g[g.length-5]){var l=g.length-1;h=g[l-3],i=g[l-2],j=g[l-1],k=g[l]}else{var m=c.Animation.binarySearch(g,d,5),n=g[m-4],o=g[m-3],p=g[m-2],q=g[m-1],r=g[m],s=1-(d-r)/(g[m-5]-r);s=this.curves.getCurvePercent(m/5-1,s),h=n+(g[m+1]-n)*s,i=o+(g[m+2]-o)*s,j=p+(g[m+3]-p)*s,k=q+(g[m+4]-q)*s}var t=a.slots[this.slotIndex];1>f?(t.r+=(h-t.r)*f,t.g+=(i-t.g)*f,t.b+=(j-t.b)*f,t.a+=(k-t.a)*f):(t.r=h,t.g=i,t.b=j,t.a=k)}}},c.AttachmentTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=a,this.attachmentNames=[],this.attachmentNames.length=a},c.AttachmentTimeline.prototype={slotIndex:0,getFrameCount:function(){return this.frames.length},setFrame:function(a,b,c){this.frames[a]=b,this.attachmentNames[a]=c},apply:function(a,b,d){var e=this.frames;if(d<e[0])return void(b>d&&this.apply(a,b,Number.MAX_VALUE,null,0));b>d&&(b=-1);var f=d>=e[e.length-1]?e.length-1:c.Animation.binarySearch1(e,d)-1;if(!(e[f]<b)){var g=this.attachmentNames[f];a.slots[this.slotIndex].setAttachment(g?a.getAttachmentBySlotIndex(this.slotIndex,g):null)}}},c.EventTimeline=function(a){this.frames=[],this.frames.length=a,this.events=[],this.events.length=a},c.EventTimeline.prototype={getFrameCount:function(){return this.frames.length},setFrame:function(a,b,c){this.frames[a]=b,this.events[a]=c},apply:function(a,b,d,e,f){if(e){var g=this.frames,h=g.length;if(b>d)this.apply(a,b,Number.MAX_VALUE,e,f),b=-1;else if(b>=g[h-1])return;if(!(d<g[0])){var i;if(b<g[0])i=0;else{i=c.Animation.binarySearch1(g,b);for(var j=g[i];i>0&&g[i-1]==j;)i--}for(var k=this.events;h>i&&d>=g[i];i++)e.push(k[i])}}}},c.DrawOrderTimeline=function(a){this.frames=[],this.frames.length=a,this.drawOrders=[],this.drawOrders.length=a},c.DrawOrderTimeline.prototype={getFrameCount:function(){return this.frames.length},setFrame:function(a,b,c){this.frames[a]=b,this.drawOrders[a]=c},apply:function(a,b,d){var e=this.frames;if(!(d<e[0])){var f;f=d>=e[e.length-1]?e.length-1:c.Animation.binarySearch1(e,d)-1;var g=a.drawOrder,h=a.slots,i=this.drawOrders[f];if(i)for(var j=0,k=i.length;k>j;j++)g[j]=a.slots[i[j]];else for(var j=0,k=h.length;k>j;j++)g[j]=h[j]}}},c.FfdTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=a,this.frameVertices=[],this.frameVertices.length=a},c.FfdTimeline.prototype={slotIndex:0,attachment:0,getFrameCount:function(){return this.frames.length},setFrame:function(a,b,c){this.frames[a]=b,this.frameVertices[a]=c},apply:function(a,b,d,e,f){var g=a.slots[this.slotIndex];if(g.attachment==this.attachment){var h=this.frames;if(!(d<h[0])){var i=this.frameVertices,j=i[0].length,k=g.attachmentVertices;if(k.length!=j&&(f=1),k.length=j,d>=h[h.length-1]){var l=i[h.length-1];if(1>f)for(var m=0;j>m;m++)k[m]+=(l[m]-k[m])*f;else for(var m=0;j>m;m++)k[m]=l[m]}else{var n=c.Animation.binarySearch1(h,d),o=h[n],p=1-(d-o)/(h[n-1]-o);p=this.curves.getCurvePercent(n-1,0>p?0:p>1?1:p);var q=i[n-1],r=i[n];if(1>f)for(var m=0;j>m;m++){var s=q[m];k[m]+=(s+(r[m]-s)*p-k[m])*f}else for(var m=0;j>m;m++){var s=q[m];k[m]=s+(r[m]-s)*p}}}}}},c.IkConstraintTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=3*a},c.IkConstraintTimeline.prototype={ikConstraintIndex:0,getFrameCount:function(){return this.frames.length/3},setFrame:function(a,b,c,d){a*=3,this.frames[a]=b,this.frames[a+1]=c,this.frames[a+2]=d},apply:function(a,b,d,e,f){var g=this.frames;if(!(d<g[0])){var h=a.ikConstraints[this.ikConstraintIndex];if(d>=g[g.length-3])return h.mix+=(g[g.length-2]-h.mix)*f,void(h.bendDirection=g[g.length-1]);var i=c.Animation.binarySearch(g,d,3),j=g[i+-2],k=g[i],l=1-(d-k)/(g[i+-3]-k);l=this.curves.getCurvePercent(i/3-1,l);var m=j+(g[i+1]-j)*l;h.mix+=(m-h.mix)*f,h.bendDirection=g[i+-1]}}},c.FlipXTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=2*a},c.FlipXTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(a,b,c){a*=2,this.frames[a]=b,this.frames[a+1]=c?1:0},apply:function(a,b,d){var e=this.frames;if(d<e[0])return void(b>d&&this.apply(a,b,Number.MAX_VALUE,null,0));b>d&&(b=-1);var f=(d>=e[e.length-2]?e.length:c.Animation.binarySearch(e,d,2))-2;e[f]<b||(a.bones[boneIndex].flipX=0!=e[f+1])}},c.FlipYTimeline=function(a){this.curves=new c.Curves(a),this.frames=[],this.frames.length=2*a},c.FlipYTimeline.prototype={boneIndex:0,getFrameCount:function(){return this.frames.length/2},setFrame:function(a,b,c){a*=2,this.frames[a]=b,this.frames[a+1]=c?1:0},apply:function(a,b,d){var e=this.frames;if(d<e[0])return void(b>d&&this.apply(a,b,Number.MAX_VALUE,null,0));b>d&&(b=-1);var f=(d>=e[e.length-2]?e.length:c.Animation.binarySearch(e,d,2))-2;e[f]<b||(a.bones[boneIndex].flipY=0!=e[f+1])}},c.SkeletonData=function(){this.bones=[],this.slots=[],this.skins=[],this.events=[],this.animations=[],this.ikConstraints=[]},c.SkeletonData.prototype={name:null,defaultSkin:null,width:0,height:0,version:null,hash:null,findBone:function(a){for(var b=this.bones,c=0,d=b.length;d>c;c++)if(b[c].name==a)return b[c];return null},findBoneIndex:function(a){for(var b=this.bones,c=0,d=b.length;d>c;c++)if(b[c].name==a)return c;return-1},findSlot:function(a){for(var b=this.slots,c=0,d=b.length;d>c;c++)if(b[c].name==a)return slot[c];return null},findSlotIndex:function(a){for(var b=this.slots,c=0,d=b.length;d>c;c++)if(b[c].name==a)return c;return-1},findSkin:function(a){for(var b=this.skins,c=0,d=b.length;d>c;c++)if(b[c].name==a)return b[c];return null},findEvent:function(a){for(var b=this.events,c=0,d=b.length;d>c;c++)if(b[c].name==a)return b[c];return null},findAnimation:function(a){for(var b=this.animations,c=0,d=b.length;d>c;c++)if(b[c].name==a)return b[c];return null},findIkConstraint:function(a){for(var b=this.ikConstraints,c=0,d=b.length;d>c;c++)if(b[c].name==a)return b[c];return null}},c.Skeleton=function(a){this.data=a,this.bones=[];for(var b=0,d=a.bones.length;d>b;b++){var e=a.bones[b],f=e.parent?this.bones[a.bones.indexOf(e.parent)]:null;this.bones.push(new c.Bone(e,this,f))}this.slots=[],this.drawOrder=[];for(var b=0,d=a.slots.length;d>b;b++){var g=a.slots[b],h=this.bones[a.bones.indexOf(g.boneData)],i=new c.Slot(g,h);this.slots.push(i),this.drawOrder.push(i)}this.ikConstraints=[];for(var b=0,d=a.ikConstraints.length;d>b;b++)this.ikConstraints.push(new c.IkConstraint(a.ikConstraints[b],this));this.boneCache=[],this.updateCache()},c.Skeleton.prototype={x:0,y:0,skin:null,r:1,g:1,b:1,a:1,time:0,flipX:!1,flipY:!1,updateCache:function(){var a=this.ikConstraints,b=a.length,c=b+1,d=this.boneCache;d.length>c&&(d.length=c);for(var e=0,f=d.length;f>e;e++)d[e].length=0;for(;d.length<c;)d[d.length]=[];var g=d[0],h=this.bones;a:for(var e=0,f=h.length;f>e;e++){var i=h[e],j=i;do{for(var k=0;b>k;k++)for(var l=a[k],m=l.bones[0],n=l.bones[l.bones.length-1];;){if(j==n){d[k].push(i),d[k+1].push(i);continue a}if(n==m)break;n=n.parent}j=j.parent}while(j);g[g.length]=i}},updateWorldTransform:function(){for(var a=this.bones,b=0,c=a.length;c>b;b++){var d=a[b];d.rotationIK=d.rotation}for(var b=0,e=this.boneCache.length-1;;){for(var f=this.boneCache[b],g=0,h=f.length;h>g;g++)f[g].updateWorldTransform();if(b==e)break;this.ikConstraints[b].apply(),b++}},setToSetupPose:function(){this.setBonesToSetupPose(),this.setSlotsToSetupPose()},setBonesToSetupPose:function(){for(var a=this.bones,b=0,c=a.length;c>b;b++)a[b].setToSetupPose();for(var d=this.ikConstraints,b=0,c=d.length;c>b;b++){var e=d[b];e.bendDirection=e.data.bendDirection,e.mix=e.data.mix}},setSlotsToSetupPose:function(){for(var a=this.slots,b=this.drawOrder,c=0,d=a.length;d>c;c++)b[c]=a[c],a[c].setToSetupPose(c)},getRootBone:function(){return this.bones.length?this.bones[0]:null},findBone:function(a){for(var b=this.bones,c=0,d=b.length;d>c;c++)if(b[c].data.name==a)return b[c];return null},findBoneIndex:function(a){for(var b=this.bones,c=0,d=b.length;d>c;c++)if(b[c].data.name==a)return c;return-1},findSlot:function(a){for(var b=this.slots,c=0,d=b.length;d>c;c++)if(b[c].data.name==a)return b[c];return null},findSlotIndex:function(a){for(var b=this.slots,c=0,d=b.length;d>c;c++)if(b[c].data.name==a)return c;return-1},setSkinByName:function(a){var b=this.data.findSkin(a);if(!b)throw"Skin not found: "+a;this.setSkin(b)},setSkin:function(a){if(a)if(this.skin)a._attachAll(this,this.skin);else for(var b=this.slots,c=0,d=b.length;d>c;c++){var e=b[c],f=e.data.attachmentName;if(f){var g=a.getAttachment(c,f);g&&e.setAttachment(g)}}this.skin=a},getAttachmentBySlotName:function(a,b){return this.getAttachmentBySlotIndex(this.data.findSlotIndex(a),b)},getAttachmentBySlotIndex:function(a,b){if(this.skin){var c=this.skin.getAttachment(a,b);if(c)return c}return this.data.defaultSkin?this.data.defaultSkin.getAttachment(a,b):null},setAttachment:function(a,b){for(var c=this.slots,d=0,e=c.length;e>d;d++){var f=c[d];if(f.data.name==a){var g=null;if(b&&(g=this.getAttachmentBySlotIndex(d,b),!g))throw"Attachment not found: "+b+", for slot: "+a;return void f.setAttachment(g)}}throw"Slot not found: "+a},findIkConstraint:function(a){for(var b=this.ikConstraints,c=0,d=b.length;d>c;c++)if(b[c].data.name==a)return b[c];return null},update:function(a){this.time+=a}},c.EventData=function(a){this.name=a},c.EventData.prototype={intValue:0,floatValue:0,stringValue:null},c.Event=function(a){this.data=a},c.Event.prototype={intValue:0,floatValue:0,stringValue:null},c.AttachmentType={region:0,boundingbox:1,mesh:2,skinnedmesh:3},c.RegionAttachment=function(a){this.name=a,this.offset=[],this.offset.length=8,this.uvs=[],this.uvs.length=8},c.RegionAttachment.prototype={type:c.AttachmentType.region,x:0,y:0,rotation:0,scaleX:1,scaleY:1,width:0,height:0,r:1,g:1,b:1,a:1,path:null,rendererObject:null,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,setUVs:function(a,b,c,d,e){var f=this.uvs;e?(f[2]=a,f[3]=d,f[4]=a,f[5]=b,f[6]=c,f[7]=b,f[0]=c,f[1]=d):(f[0]=a,f[1]=d,f[2]=a,f[3]=b,f[4]=c,f[5]=b,f[6]=c,f[7]=d)},updateOffset:function(){var a=this.width/this.regionOriginalWidth*this.scaleX,b=this.height/this.regionOriginalHeight*this.scaleY,d=-this.width/2*this.scaleX+this.regionOffsetX*a,e=-this.height/2*this.scaleY+this.regionOffsetY*b,f=d+this.regionWidth*a,g=e+this.regionHeight*b,h=this.rotation*c.degRad,i=Math.cos(h),j=Math.sin(h),k=d*i+this.x,l=d*j,m=e*i+this.y,n=e*j,o=f*i+this.x,p=f*j,q=g*i+this.y,r=g*j,s=this.offset;s[0]=k-n,s[1]=m+l,s[2]=k-r,s[3]=q+l,s[4]=o-r,s[5]=q+p,s[6]=o-n,s[7]=m+p},computeVertices:function(a,b,c,d){a+=c.worldX,b+=c.worldY;var e=c.m00,f=c.m01,g=c.m10,h=c.m11,i=this.offset;d[0]=i[0]*e+i[1]*f+a,d[1]=i[0]*g+i[1]*h+b,d[2]=i[2]*e+i[3]*f+a,d[3]=i[2]*g+i[3]*h+b,d[4]=i[4]*e+i[5]*f+a,d[5]=i[4]*g+i[5]*h+b,d[6]=i[6]*e+i[7]*f+a,d[7]=i[6]*g+i[7]*h+b}},c.MeshAttachment=function(a){this.name=a},c.MeshAttachment.prototype={type:c.AttachmentType.mesh,vertices:null,uvs:null,regionUVs:null,triangles:null,hullLength:0,r:1,g:1,b:1,a:1,path:null,rendererObject:null,regionU:0,regionV:0,regionU2:0,regionV2:0,regionRotate:!1,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,edges:null,width:0,height:0,updateUVs:function(){var a=this.regionU2-this.regionU,b=this.regionV2-this.regionV,d=this.regionUVs.length;if(this.uvs&&this.uvs.length==d||(this.uvs=new c.Float32Array(d)),this.regionRotate)for(var e=0;d>e;e+=2)this.uvs[e]=this.regionU+this.regionUVs[e+1]*a,this.uvs[e+1]=this.regionV+b-this.regionUVs[e]*b;else for(var e=0;d>e;e+=2)this.uvs[e]=this.regionU+this.regionUVs[e]*a,this.uvs[e+1]=this.regionV+this.regionUVs[e+1]*b},computeWorldVertices:function(a,b,c,d){var e=c.bone;a+=e.worldX,b+=e.worldY;var f=e.m00,g=e.m01,h=e.m10,i=e.m11,j=this.vertices,k=j.length;c.attachmentVertices.length==k&&(j=c.attachmentVertices);for(var l=0;k>l;l+=2){var m=j[l],n=j[l+1];d[l]=m*f+n*g+a,d[l+1]=m*h+n*i+b}}},c.SkinnedMeshAttachment=function(a){this.name=a},c.SkinnedMeshAttachment.prototype={type:c.AttachmentType.skinnedmesh,bones:null,weights:null,uvs:null,regionUVs:null,triangles:null,hullLength:0,r:1,g:1,b:1,a:1,path:null,rendererObject:null,regionU:0,regionV:0,regionU2:0,regionV2:0,regionRotate:!1,regionOffsetX:0,regionOffsetY:0,regionWidth:0,regionHeight:0,regionOriginalWidth:0,regionOriginalHeight:0,edges:null,width:0,height:0,updateUVs:function(){var a=this.regionU2-this.regionU,b=this.regionV2-this.regionV,d=this.regionUVs.length;if(this.uvs&&this.uvs.length==d||(this.uvs=new c.Float32Array(d)),this.regionRotate)for(var e=0;d>e;e+=2)this.uvs[e]=this.regionU+this.regionUVs[e+1]*a,this.uvs[e+1]=this.regionV+b-this.regionUVs[e]*b;else for(var e=0;d>e;e+=2)this.uvs[e]=this.regionU+this.regionUVs[e]*a,this.uvs[e+1]=this.regionV+this.regionUVs[e+1]*b},computeWorldVertices:function(a,b,c,d){var e,f,g,h,i,j,k,l=c.bone.skeleton.bones,m=this.weights,n=this.bones,o=0,p=0,q=0,r=0,s=n.length;if(c.attachmentVertices.length)for(var t=c.attachmentVertices;s>p;o+=2){for(f=0,g=0,e=n[p++]+p;e>p;p++,q+=3,r+=2)h=l[n[p]],i=m[q]+t[r],j=m[q+1]+t[r+1],k=m[q+2],f+=(i*h.m00+j*h.m01+h.worldX)*k,g+=(i*h.m10+j*h.m11+h.worldY)*k;d[o]=f+a,d[o+1]=g+b}else for(;s>p;o+=2){for(f=0,g=0,e=n[p++]+p;e>p;p++,q+=3)h=l[n[p]],i=m[q],j=m[q+1],k=m[q+2],f+=(i*h.m00+j*h.m01+h.worldX)*k,g+=(i*h.m10+j*h.m11+h.worldY)*k;d[o]=f+a,d[o+1]=g+b}}},c.BoundingBoxAttachment=function(a){this.name=a,this.vertices=[]},c.BoundingBoxAttachment.prototype={type:c.AttachmentType.boundingbox,computeWorldVertices:function(a,b,c,d){a+=c.worldX,b+=c.worldY;for(var e=c.m00,f=c.m01,g=c.m10,h=c.m11,i=this.vertices,j=0,k=i.length;k>j;j+=2){var l=i[j],m=i[j+1];d[j]=l*e+m*f+a,d[j+1]=l*g+m*h+b}}},c.AnimationStateData=function(a){this.skeletonData=a,this.animationToMixTime={}},c.AnimationStateData.prototype={defaultMix:0,setMixByName:function(a,b,c){var d=this.skeletonData.findAnimation(a);if(!d)throw"Animation not found: "+a;var e=this.skeletonData.findAnimation(b);if(!e)throw"Animation not found: "+b;this.setMix(d,e,c)},setMix:function(a,b,c){this.animationToMixTime[a.name+":"+b.name]=c},getMix:function(a,b){var c=a.name+":"+b.name;return this.animationToMixTime.hasOwnProperty(c)?this.animationToMixTime[c]:this.defaultMix}},c.TrackEntry=function(){},c.TrackEntry.prototype={next:null,previous:null,animation:null,loop:!1,delay:0,time:0,lastTime:-1,endTime:0,timeScale:1,mixTime:0,mixDuration:0,mix:1,onStart:null,onEnd:null,onComplete:null,onEvent:null},c.AnimationState=function(a){this.data=a,this.tracks=[],this.events=[]},c.AnimationState.prototype={onStart:null,onEnd:null,onComplete:null,onEvent:null,timeScale:1,update:function(a){a*=this.timeScale;for(var b=0;b<this.tracks.length;b++){var c=this.tracks[b];if(c){if(c.time+=a*c.timeScale,c.previous){var d=a*c.previous.timeScale;c.previous.time+=d,c.mixTime+=d}var e=c.next;e?(e.time=c.lastTime-e.delay,e.time>=0&&this.setCurrent(b,e)):!c.loop&&c.lastTime>=c.endTime&&this.clearTrack(b)}}},apply:function(a){for(var b=0;b<this.tracks.length;b++){var c=this.tracks[b];if(c){this.events.length=0;var d=c.time,e=c.lastTime,f=c.endTime,g=c.loop;!g&&d>f&&(d=f);var h=c.previous;if(h){var i=h.time;!h.loop&&i>h.endTime&&(i=h.endTime),h.animation.apply(a,i,i,h.loop,null);var j=c.mixTime/c.mixDuration*c.mix;j>=1&&(j=1,c.previous=null),c.animation.mix(a,c.lastTime,d,g,this.events,j)}else 1==c.mix?c.animation.apply(a,c.lastTime,d,g,this.events):c.animation.mix(a,c.lastTime,d,g,this.events,c.mix);for(var k=0,l=this.events.length;l>k;k++){var m=this.events[k];c.onEvent&&c.onEvent(b,m),this.onEvent&&this.onEvent(b,m)}if(g?e%f>d%f:f>e&&d>=f){var n=Math.floor(d/f);c.onComplete&&c.onComplete(b,n),this.onComplete&&this.onComplete(b,n)}c.lastTime=c.time}}},clearTracks:function(){for(var a=0,b=this.tracks.length;b>a;a++)this.clearTrack(a);this.tracks.length=0},clearTrack:function(a){if(!(a>=this.tracks.length)){var b=this.tracks[a];b&&(b.onEnd&&b.onEnd(a),this.onEnd&&this.onEnd(a),this.tracks[a]=null)}},_expandToIndex:function(a){if(a<this.tracks.length)return this.tracks[a];for(;a>=this.tracks.length;)this.tracks.push(null);return null},setCurrent:function(a,b){var c=this._expandToIndex(a);if(c){var d=c.previous;c.previous=null,c.onEnd&&c.onEnd(a),this.onEnd&&this.onEnd(a),b.mixDuration=this.data.getMix(c.animation,b.animation),b.mixDuration>0&&(b.mixTime=0,b.previous=d&&c.mixTime/c.mixDuration<.5?d:c)}this.tracks[a]=b,b.onStart&&b.onStart(a),this.onStart&&this.onStart(a)},setAnimationByName:function(a,b,c){var d=this.data.skeletonData.findAnimation(b);if(!d)throw"Animation not found: "+b;return this.setAnimation(a,d,c)},setAnimation:function(a,b,d){var e=new c.TrackEntry;return e.animation=b,e.loop=d,e.endTime=b.duration,this.setCurrent(a,e),e},addAnimationByName:function(a,b,c,d){var e=this.data.skeletonData.findAnimation(b);if(!e)throw"Animation not found: "+b;return this.addAnimation(a,e,c,d)},addAnimation:function(a,b,d,e){var f=new c.TrackEntry;f.animation=b,f.loop=d,f.endTime=b.duration;var g=this._expandToIndex(a);if(g){for(;g.next;)g=g.next;g.next=f}else this.tracks[a]=f;return 0>=e&&(g?e+=g.endTime-this.data.getMix(g.animation,b):e=0),f.delay=e,f},getCurrent:function(a){return a>=this.tracks.length?null:this.tracks[a]}},c.SkeletonJson=function(a){this.attachmentLoader=a},c.SkeletonJson.prototype={scale:1,readSkeletonData:function(a,b){var d=new c.SkeletonData;d.name=b;var e=a.skeleton;e&&(d.hash=e.hash,d.version=e.spine,d.width=e.width||0,d.height=e.height||0);for(var f=a.bones,g=0,h=f.length;h>g;g++){var i=f[g],j=null;if(i.parent&&(j=d.findBone(i.parent),!j))throw"Parent bone not found: "+i.parent;var k=new c.BoneData(i.name,j);k.length=(i.length||0)*this.scale,k.x=(i.x||0)*this.scale,k.y=(i.y||0)*this.scale,k.rotation=i.rotation||0,k.scaleX=i.hasOwnProperty("scaleX")?i.scaleX:1,k.scaleY=i.hasOwnProperty("scaleY")?i.scaleY:1,k.inheritScale=i.hasOwnProperty("inheritScale")?i.inheritScale:!0,k.inheritRotation=i.hasOwnProperty("inheritRotation")?i.inheritRotation:!0,d.bones.push(k)}var l=a.ik;if(l)for(var g=0,h=l.length;h>g;g++){for(var m=l[g],n=new c.IkConstraintData(m.name),f=m.bones,o=0,p=f.length;p>o;o++){var q=d.findBone(f[o]);if(!q)throw"IK bone not found: "+f[o];n.bones.push(q)}if(n.target=d.findBone(m.target),!n.target)throw"Target bone not found: "+m.target;n.bendDirection=!m.hasOwnProperty("bendPositive")||m.bendPositive?1:-1,n.mix=m.hasOwnProperty("mix")?m.mix:1,d.ikConstraints.push(n)}for(var r=a.slots,g=0,h=r.length;h>g;g++){var s=r[g],k=d.findBone(s.bone);if(!k)throw"Slot bone not found: "+s.bone;var t=new c.SlotData(s.name,k),u=s.color;u&&(t.r=this.toColor(u,0),t.g=this.toColor(u,1),t.b=this.toColor(u,2),t.a=this.toColor(u,3)),t.attachmentName=s.attachment,t.additiveBlending=s.additive&&"true"==s.additive,d.slots.push(t)}var v=a.skins;for(var w in v)if(v.hasOwnProperty(w)){var x=v[w],y=new c.Skin(w);for(var z in x)if(x.hasOwnProperty(z)){var A=d.findSlotIndex(z),B=x[z];for(var C in B)if(B.hasOwnProperty(C)){var D=this.readAttachment(y,C,B[C]);D&&y.addAttachment(A,C,D)}}d.skins.push(y),"default"==y.name&&(d.defaultSkin=y)}var E=a.events;for(var F in E)if(E.hasOwnProperty(F)){var G=E[F],H=new c.EventData(F);H.intValue=G["int"]||0,H.floatValue=G["float"]||0,H.stringValue=G.string||null,d.events.push(H)}var I=a.animations;for(var J in I)I.hasOwnProperty(J)&&this.readAnimation(J,I[J],d);return d},readAttachment:function(a,b,d){b=d.name||b;var e=c.AttachmentType[d.type||"region"],f=d.path||b,g=this.scale;if(e==c.AttachmentType.region){var h=this.attachmentLoader.newRegionAttachment(a,b,f);if(!h)return null;h.path=f,h.x=(d.x||0)*g,h.y=(d.y||0)*g,h.scaleX=d.hasOwnProperty("scaleX")?d.scaleX:1,h.scaleY=d.hasOwnProperty("scaleY")?d.scaleY:1,h.rotation=d.rotation||0,h.width=(d.width||0)*g,h.height=(d.height||0)*g;var i=d.color;return i&&(h.r=this.toColor(i,0),h.g=this.toColor(i,1),h.b=this.toColor(i,2),h.a=this.toColor(i,3)),h.updateOffset(),h}if(e==c.AttachmentType.mesh){var j=this.attachmentLoader.newMeshAttachment(a,b,f);return j?(j.path=f,j.vertices=this.getFloatArray(d,"vertices",g),j.triangles=this.getIntArray(d,"triangles"),j.regionUVs=this.getFloatArray(d,"uvs",1),j.updateUVs(),i=d.color,i&&(j.r=this.toColor(i,0),j.g=this.toColor(i,1),j.b=this.toColor(i,2),j.a=this.toColor(i,3)),j.hullLength=2*(d.hull||0),d.edges&&(j.edges=this.getIntArray(d,"edges")),j.width=(d.width||0)*g,j.height=(d.height||0)*g,j):null}if(e==c.AttachmentType.skinnedmesh){var j=this.attachmentLoader.newSkinnedMeshAttachment(a,b,f);if(!j)return null;j.path=f;for(var k=this.getFloatArray(d,"uvs",1),l=this.getFloatArray(d,"vertices",1),m=[],n=[],o=0,p=l.length;p>o;){var q=0|l[o++];n[n.length]=q;for(var r=o+4*q;r>o;)n[n.length]=l[o],m[m.length]=l[o+1]*g,m[m.length]=l[o+2]*g,m[m.length]=l[o+3],o+=4}return j.bones=n,j.weights=m,j.triangles=this.getIntArray(d,"triangles"),j.regionUVs=k,j.updateUVs(),i=d.color,i&&(j.r=this.toColor(i,0),j.g=this.toColor(i,1),j.b=this.toColor(i,2),j.a=this.toColor(i,3)),j.hullLength=2*(d.hull||0),d.edges&&(j.edges=this.getIntArray(d,"edges")),j.width=(d.width||0)*g,j.height=(d.height||0)*g,j
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16605
}if(e==c.AttachmentType.boundingbox){for(var s=this.attachmentLoader.newBoundingBoxAttachment(a,b),l=d.vertices,o=0,p=l.length;p>o;o++)s.vertices.push(l[o]*g);return s}throw"Unknown attachment type: "+e},readAnimation:function(a,b,d){var e=[],f=0,g=b.slots;for(var h in g)if(g.hasOwnProperty(h)){var i=g[h],j=d.findSlotIndex(h);for(var k in i)if(i.hasOwnProperty(k)){var l=i[k];if("color"==k){var m=new c.ColorTimeline(l.length);m.slotIndex=j;for(var n=0,o=0,p=l.length;p>o;o++){var q=l[o],r=q.color,s=this.toColor(r,0),t=this.toColor(r,1),u=this.toColor(r,2),v=this.toColor(r,3);m.setFrame(n,q.time,s,t,u,v),this.readCurve(m,n,q),n++}e.push(m),f=Math.max(f,m.frames[5*m.getFrameCount()-5])}else{if("attachment"!=k)throw"Invalid timeline type for a slot: "+k+" ("+h+")";var m=new c.AttachmentTimeline(l.length);m.slotIndex=j;for(var n=0,o=0,p=l.length;p>o;o++){var q=l[o];m.setFrame(n++,q.time,q.name)}e.push(m),f=Math.max(f,m.frames[m.getFrameCount()-1])}}}var w=b.bones;for(var x in w)if(w.hasOwnProperty(x)){var y=d.findBoneIndex(x);if(-1==y)throw"Bone not found: "+x;var z=w[x];for(var k in z)if(z.hasOwnProperty(k)){var l=z[k];if("rotate"==k){var m=new c.RotateTimeline(l.length);m.boneIndex=y;for(var n=0,o=0,p=l.length;p>o;o++){var q=l[o];m.setFrame(n,q.time,q.angle),this.readCurve(m,n,q),n++}e.push(m),f=Math.max(f,m.frames[2*m.getFrameCount()-2])}else if("translate"==k||"scale"==k){var m,A=1;"scale"==k?m=new c.ScaleTimeline(l.length):(m=new c.TranslateTimeline(l.length),A=this.scale),m.boneIndex=y;for(var n=0,o=0,p=l.length;p>o;o++){var q=l[o],B=(q.x||0)*A,C=(q.y||0)*A;m.setFrame(n,q.time,B,C),this.readCurve(m,n,q),n++}e.push(m),f=Math.max(f,m.frames[3*m.getFrameCount()-3])}else{if("flipX"!=k&&"flipY"!=k)throw"Invalid timeline type for a bone: "+k+" ("+x+")";var B="flipX"==k,m=B?new c.FlipXTimeline(l.length):new c.FlipYTimeline(l.length);m.boneIndex=y;for(var D=B?"x":"y",n=0,o=0,p=l.length;p>o;o++){var q=l[o];m.setFrame(n,q.time,q[D]||!1),n++}e.push(m),f=Math.max(f,m.frames[2*m.getFrameCount()-2])}}}var E=b.ik;for(var F in E)if(E.hasOwnProperty(F)){var G=d.findIkConstraint(F),l=E[F],m=new c.IkConstraintTimeline(l.length);m.ikConstraintIndex=d.ikConstraints.indexOf(G);for(var n=0,o=0,p=l.length;p>o;o++){var q=l[o],H=q.hasOwnProperty("mix")?q.mix:1,I=!q.hasOwnProperty("bendPositive")||q.bendPositive?1:-1;m.setFrame(n,q.time,H,I),this.readCurve(m,n,q),n++}e.push(m),f=Math.max(f,m.frames[3*m.frameCount-3])}var J=b.ffd;for(var K in J){var L=d.findSkin(K),i=J[K];for(h in i){var j=d.findSlotIndex(h),M=i[h];for(var N in M){var l=M[N],m=new c.FfdTimeline(l.length),O=L.getAttachment(j,N);if(!O)throw"FFD attachment not found: "+N;m.slotIndex=j,m.attachment=O;var P,Q=O.type==c.AttachmentType.mesh;P=Q?O.vertices.length:O.weights.length/3*2;for(var n=0,o=0,p=l.length;p>o;o++){var R,q=l[o];if(q.vertices){var S=q.vertices,R=[];R.length=P;var T=q.offset||0,U=S.length;if(1==this.scale)for(var V=0;U>V;V++)R[V+T]=S[V];else for(var V=0;U>V;V++)R[V+T]=S[V]*this.scale;if(Q)for(var W=O.vertices,V=0,U=R.length;U>V;V++)R[V]+=W[V]}else Q?R=O.vertices:(R=[],R.length=P);m.setFrame(n,q.time,R),this.readCurve(m,n,q),n++}e[e.length]=m,f=Math.max(f,m.frames[m.frameCount-1])}}}var X=b.drawOrder;if(X||(X=b.draworder),X){for(var m=new c.DrawOrderTimeline(X.length),Y=d.slots.length,n=0,o=0,p=X.length;p>o;o++){var Z=X[o],$=null;if(Z.offsets){$=[],$.length=Y;for(var V=Y-1;V>=0;V--)$[V]=-1;var _=Z.offsets,ab=[];ab.length=Y-_.length;for(var bb=0,cb=0,V=0,U=_.length;U>V;V++){var db=_[V],j=d.findSlotIndex(db.slot);if(-1==j)throw"Slot not found: "+db.slot;for(;bb!=j;)ab[cb++]=bb++;$[bb+db.offset]=bb++}for(;Y>bb;)ab[cb++]=bb++;for(var V=Y-1;V>=0;V--)-1==$[V]&&($[V]=ab[--cb])}m.setFrame(n++,Z.time,$)}e.push(m),f=Math.max(f,m.frames[m.getFrameCount()-1])}var eb=b.events;if(eb){for(var m=new c.EventTimeline(eb.length),n=0,o=0,p=eb.length;p>o;o++){var fb=eb[o],gb=d.findEvent(fb.name);if(!gb)throw"Event not found: "+fb.name;var hb=new c.Event(gb);hb.intValue=fb.hasOwnProperty("int")?fb["int"]:gb.intValue,hb.floatValue=fb.hasOwnProperty("float")?fb["float"]:gb.floatValue,hb.stringValue=fb.hasOwnProperty("string")?fb.string:gb.stringValue,m.setFrame(n++,fb.time,hb)}e.push(m),f=Math.max(f,m.frames[m.getFrameCount()-1])}d.animations.push(new c.Animation(a,e,f))},readCurve:function(a,b,c){var d=c.curve;d?"stepped"==d?a.curves.setStepped(b):d instanceof Array&&a.curves.setCurve(b,d[0],d[1],d[2],d[3]):a.curves.setLinear(b)},toColor:function(a,b){if(8!=a.length)throw"Color hexidecimal length must be 8, recieved: "+a;return parseInt(a.substring(2*b,2*b+2),16)/255},getFloatArray:function(a,b,d){var e=a[b],f=new c.Float32Array(e.length),g=0,h=e.length;if(1==d)for(;h>g;g++)f[g]=e[g];else for(;h>g;g++)f[g]=e[g]*d;return f},getIntArray:function(a,b){for(var d=a[b],e=new c.Uint16Array(d.length),f=0,g=d.length;g>f;f++)e[f]=0|d[f];return e}},c.Atlas=function(a,b){this.textureLoader=b,this.pages=[],this.regions=[];var d=new c.AtlasReader(a),e=[];e.length=4;for(var f=null;;){var g=d.readLine();if(null===g)break;if(g=d.trim(g),g.length)if(f){var h=new c.AtlasRegion;h.name=g,h.page=f,h.rotate="true"==d.readValue(),d.readTuple(e);var i=parseInt(e[0]),j=parseInt(e[1]);d.readTuple(e);var k=parseInt(e[0]),l=parseInt(e[1]);h.u=i/f.width,h.v=j/f.height,h.rotate?(h.u2=(i+l)/f.width,h.v2=(j+k)/f.height):(h.u2=(i+k)/f.width,h.v2=(j+l)/f.height),h.x=i,h.y=j,h.width=Math.abs(k),h.height=Math.abs(l),4==d.readTuple(e)&&(h.splits=[parseInt(e[0]),parseInt(e[1]),parseInt(e[2]),parseInt(e[3])],4==d.readTuple(e)&&(h.pads=[parseInt(e[0]),parseInt(e[1]),parseInt(e[2]),parseInt(e[3])],d.readTuple(e))),h.originalWidth=parseInt(e[0]),h.originalHeight=parseInt(e[1]),d.readTuple(e),h.offsetX=parseInt(e[0]),h.offsetY=parseInt(e[1]),h.index=parseInt(d.readValue()),this.regions.push(h)}else{f=new c.AtlasPage,f.name=g,2==d.readTuple(e)&&(f.width=parseInt(e[0]),f.height=parseInt(e[1]),d.readTuple(e)),f.format=c.Atlas.Format[e[0]],d.readTuple(e),f.minFilter=c.Atlas.TextureFilter[e[0]],f.magFilter=c.Atlas.TextureFilter[e[1]];var m=d.readValue();f.uWrap=c.Atlas.TextureWrap.clampToEdge,f.vWrap=c.Atlas.TextureWrap.clampToEdge,"x"==m?f.uWrap=c.Atlas.TextureWrap.repeat:"y"==m?f.vWrap=c.Atlas.TextureWrap.repeat:"xy"==m&&(f.uWrap=f.vWrap=c.Atlas.TextureWrap.repeat),b.load(f,g,this),this.pages.push(f)}else f=null}},c.Atlas.prototype={findRegion:function(a){for(var b=this.regions,c=0,d=b.length;d>c;c++)if(b[c].name==a)return b[c];return null},dispose:function(){for(var a=this.pages,b=0,c=a.length;c>b;b++)this.textureLoader.unload(a[b].rendererObject)},updateUVs:function(a){for(var b=this.regions,c=0,d=b.length;d>c;c++){var e=b[c];e.page==a&&(e.u=e.x/a.width,e.v=e.y/a.height,e.rotate?(e.u2=(e.x+e.height)/a.width,e.v2=(e.y+e.width)/a.height):(e.u2=(e.x+e.width)/a.width,e.v2=(e.y+e.height)/a.height))}}},c.Atlas.Format={alpha:0,intensity:1,luminanceAlpha:2,rgb565:3,rgba4444:4,rgb888:5,rgba8888:6},c.Atlas.TextureFilter={nearest:0,linear:1,mipMap:2,mipMapNearestNearest:3,mipMapLinearNearest:4,mipMapNearestLinear:5,mipMapLinearLinear:6},c.Atlas.TextureWrap={mirroredRepeat:0,clampToEdge:1,repeat:2},c.AtlasPage=function(){},c.AtlasPage.prototype={name:null,format:null,minFilter:null,magFilter:null,uWrap:null,vWrap:null,rendererObject:null,width:0,height:0},c.AtlasRegion=function(){},c.AtlasRegion.prototype={page:null,name:null,x:0,y:0,width:0,height:0,u:0,v:0,u2:0,v2:0,offsetX:0,offsetY:0,originalWidth:0,originalHeight:0,index:0,rotate:!1,splits:null,pads:null},c.AtlasReader=function(a){this.lines=a.split(/\r\n|\r|\n/)},c.AtlasReader.prototype={index:0,trim:function(a){return a.replace(/^\s+|\s+$/g,"")},readLine:function(){return this.index>=this.lines.length?null:this.lines[this.index++]},readValue:function(){var a=this.readLine(),b=a.indexOf(":");if(-1==b)throw"Invalid line: "+a;return this.trim(a.substring(b+1))},readTuple:function(a){var b=this.readLine(),c=b.indexOf(":");if(-1==c)throw"Invalid line: "+b;for(var d=0,e=c+1;3>d;d++){var f=b.indexOf(",",e);if(-1==f)break;a[d]=this.trim(b.substr(e,f-e)),e=f+1}return a[d]=this.trim(b.substring(e)),d+1}},c.AtlasAttachmentLoader=function(a){this.atlas=a},c.AtlasAttachmentLoader.prototype={newRegionAttachment:function(a,b,d){var e=this.atlas.findRegion(d);if(!e)throw"Region not found in atlas: "+d+" (region attachment: "+b+")";var f=new c.RegionAttachment(b);return f.rendererObject=e,f.setUVs(e.u,e.v,e.u2,e.v2,e.rotate),f.regionOffsetX=e.offsetX,f.regionOffsetY=e.offsetY,f.regionWidth=e.width,f.regionHeight=e.height,f.regionOriginalWidth=e.originalWidth,f.regionOriginalHeight=e.originalHeight,f},newMeshAttachment:function(a,b,d){var e=this.atlas.findRegion(d);if(!e)throw"Region not found in atlas: "+d+" (mesh attachment: "+b+")";var f=new c.MeshAttachment(b);return f.rendererObject=e,f.regionU=e.u,f.regionV=e.v,f.regionU2=e.u2,f.regionV2=e.v2,f.regionRotate=e.rotate,f.regionOffsetX=e.offsetX,f.regionOffsetY=e.offsetY,f.regionWidth=e.width,f.regionHeight=e.height,f.regionOriginalWidth=e.originalWidth,f.regionOriginalHeight=e.originalHeight,f},newSkinnedMeshAttachment:function(a,b,d){var e=this.atlas.findRegion(d);if(!e)throw"Region not found in atlas: "+d+" (skinned mesh attachment: "+b+")";var f=new c.SkinnedMeshAttachment(b);return f.rendererObject=e,f.regionU=e.u,f.regionV=e.v,f.regionU2=e.u2,f.regionV2=e.v2,f.regionRotate=e.rotate,f.regionOffsetX=e.offsetX,f.regionOffsetY=e.offsetY,f.regionWidth=e.width,f.regionHeight=e.height,f.regionOriginalWidth=e.originalWidth,f.regionOriginalHeight=e.originalHeight,f},newBoundingBoxAttachment:function(a,b){return new c.BoundingBoxAttachment(b)}},c.SkeletonBounds=function(){this.polygonPool=[],this.polygons=[],this.boundingBoxes=[]},c.SkeletonBounds.prototype={minX:0,minY:0,maxX:0,maxY:0,update:function(a,b){var d=a.slots,e=d.length,f=a.x,g=a.y,h=this.boundingBoxes,i=this.polygonPool,j=this.polygons;h.length=0;for(var k=0,l=j.length;l>k;k++)i.push(j[k]);j.length=0;for(var k=0;e>k;k++){var m=d[k],n=m.attachment;if(n.type==c.AttachmentType.boundingbox){h.push(n);var o,p=i.length;p>0?(o=i[p-1],i.splice(p-1,1)):o=[],j.push(o),o.length=n.vertices.length,n.computeWorldVertices(f,g,m.bone,o)}}b&&this.aabbCompute()},aabbCompute:function(){for(var a=this.polygons,b=Number.MAX_VALUE,c=Number.MAX_VALUE,d=Number.MIN_VALUE,e=Number.MIN_VALUE,f=0,g=a.length;g>f;f++)for(var h=a[f],i=0,j=h.length;j>i;i+=2){var k=h[i],l=h[i+1];b=Math.min(b,k),c=Math.min(c,l),d=Math.max(d,k),e=Math.max(e,l)}this.minX=b,this.minY=c,this.maxX=d,this.maxY=e},aabbContainsPoint:function(a,b){return a>=this.minX&&a<=this.maxX&&b>=this.minY&&b<=this.maxY},aabbIntersectsSegment:function(a,b,c,d){var e=this.minX,f=this.minY,g=this.maxX,h=this.maxY;if(e>=a&&e>=c||f>=b&&f>=d||a>=g&&c>=g||b>=h&&d>=h)return!1;var i=(d-b)/(c-a),j=i*(e-a)+b;if(j>f&&h>j)return!0;if(j=i*(g-a)+b,j>f&&h>j)return!0;var k=(f-b)/i+a;return k>e&&g>k?!0:(k=(h-b)/i+a,k>e&&g>k?!0:!1)},aabbIntersectsSkeleton:function(a){return this.minX<a.maxX&&this.maxX>a.minX&&this.minY<a.maxY&&this.maxY>a.minY},containsPoint:function(a,b){for(var c=this.polygons,d=0,e=c.length;e>d;d++)if(this.polygonContainsPoint(c[d],a,b))return this.boundingBoxes[d];return null},intersectsSegment:function(a,b,c,d){for(var e=this.polygons,f=0,g=e.length;g>f;f++)if(e[f].intersectsSegment(a,b,c,d))return this.boundingBoxes[f];return null},polygonContainsPoint:function(a,b,c){for(var d=a.length,e=d-2,f=!1,g=0;d>g;g+=2){var h=a[g+1],i=a[e+1];if(c>h&&i>=c||c>i&&h>=c){var j=a[g];j+(c-h)/(i-h)*(a[e]-j)<b&&(f=!f)}e=g}return f},polygonIntersectsSegment:function(a,b,c,d,e){for(var f=a.length,g=b-d,h=c-e,i=b*e-c*d,j=a[f-2],k=a[f-1],l=0;f>l;l+=2){var m=a[l],n=a[l+1],o=j*n-k*m,p=j-m,q=k-n,r=g*q-h*p,s=(i*p-g*o)/r;if((s>=j&&m>=s||s>=m&&j>=s)&&(s>=b&&d>=s||s>=d&&b>=s)){var t=(i*q-h*o)/r;if((t>=k&&n>=t||t>=n&&k>=t)&&(t>=c&&e>=t||t>=e&&c>=t))return!0}j=m,k=n}return!1},getPolygon:function(a){var b=this.boundingBoxes.indexOf(a);return-1==b?null:this.polygons[b]},getWidth:function(){return this.maxX-this.minX},getHeight:function(){return this.maxY-this.minY}},c.Bone.yDown=!0,b.AnimCache={},b.SpineTextureLoader=function(a,c){b.EventTarget.call(this),this.basePath=a,this.crossorigin=c,this.loadingCount=0},b.SpineTextureLoader.prototype=b.SpineTextureLoader,b.SpineTextureLoader.prototype.load=function(a,c){if(a.rendererObject=b.BaseTexture.fromImage(this.basePath+"/"+c,this.crossorigin),!a.rendererObject.hasLoaded){var d=this;++d.loadingCount,a.rendererObject.addEventListener("loaded",function(){--d.loadingCount,d.dispatchEvent({type:"loadedBaseTexture",content:d})})}},b.SpineTextureLoader.prototype.unload=function(a){a.destroy(!0)},b.Spine=function(a){if(b.DisplayObjectContainer.call(this),this.spineData=b.AnimCache[a],!this.spineData)throw new Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: "+a);this.skeleton=new c.Skeleton(this.spineData),this.skeleton.updateWorldTransform(),this.stateData=new c.AnimationStateData(this.spineData),this.state=new c.AnimationState(this.stateData),this.slotContainers=[];for(var d=0,e=this.skeleton.drawOrder.length;e>d;d++){var f=this.skeleton.drawOrder[d],g=f.attachment,h=new b.DisplayObjectContainer;if(this.slotContainers.push(h),this.addChild(h),g instanceof c.RegionAttachment){var i=g.rendererObject.name,j=this.createSprite(f,g);f.currentSprite=j,f.currentSpriteName=i,h.addChild(j)}else{if(!(g instanceof c.MeshAttachment))continue;var k=this.createMesh(f,g);f.currentMesh=k,f.currentMeshName=g.name,h.addChild(k)}}this.autoUpdate=!0},b.Spine.prototype=Object.create(b.DisplayObjectContainer.prototype),b.Spine.prototype.constructor=b.Spine,Object.defineProperty(b.Spine.prototype,"autoUpdate",{get:function(){return this.updateTransform===b.Spine.prototype.autoUpdateTransform},set:function(a){this.updateTransform=a?b.Spine.prototype.autoUpdateTransform:b.DisplayObjectContainer.prototype.updateTransform}}),b.Spine.prototype.update=function(a){this.state.update(a),this.state.apply(this.skeleton),this.skeleton.updateWorldTransform();for(var d=this.skeleton.drawOrder,e=0,f=d.length;f>e;e++){var g=d[e],h=g.attachment,i=this.slotContainers[e];if(h){var j=h.type;if(j===c.AttachmentType.region){if(h.rendererObject&&(!g.currentSpriteName||g.currentSpriteName!==h.name)){var k=h.rendererObject.name;if(void 0!==g.currentSprite&&(g.currentSprite.visible=!1),g.sprites=g.sprites||{},void 0!==g.sprites[k])g.sprites[k].visible=!0;else{var l=this.createSprite(g,h);i.addChild(l)}g.currentSprite=g.sprites[k],g.currentSpriteName=k}var m=g.bone;i.position.x=m.worldX+h.x*m.m00+h.y*m.m01,i.position.y=m.worldY+h.x*m.m10+h.y*m.m11,i.scale.x=m.worldScaleX,i.scale.y=m.worldScaleY,i.rotation=-(g.bone.worldRotation*c.degRad),g.currentSprite.tint=b.rgb2hex([g.r,g.g,g.b])}else{if(j!==c.AttachmentType.skinnedmesh){i.visible=!1;continue}if(!g.currentMeshName||g.currentMeshName!==h.name){var n=h.name;if(void 0!==g.currentMesh&&(g.currentMesh.visible=!1),g.meshes=g.meshes||{},void 0!==g.meshes[n])g.meshes[n].visible=!0;else{var o=this.createMesh(g,h);i.addChild(o)}g.currentMesh=g.meshes[n],g.currentMeshName=n}h.computeWorldVertices(g.bone.skeleton.x,g.bone.skeleton.y,g,g.currentMesh.vertices)}i.visible=!0,i.alpha=g.a}else i.visible=!1}},b.Spine.prototype.autoUpdateTransform=function(){this.lastTime=this.lastTime||Date.now();var a=.001*(Date.now()-this.lastTime);this.lastTime=Date.now(),this.update(a),b.DisplayObjectContainer.prototype.updateTransform.call(this)},b.Spine.prototype.createSprite=function(a,d){var e=d.rendererObject,f=e.page.rendererObject,g=new b.Rectangle(e.x,e.y,e.rotate?e.height:e.width,e.rotate?e.width:e.height),h=new b.Texture(f,g),i=new b.Sprite(h),j=e.rotate?.5*Math.PI:0;return i.scale.set(e.width/e.originalWidth,e.height/e.originalHeight),i.rotation=j-d.rotation*c.degRad,i.anchor.x=i.anchor.y=.5,a.sprites=a.sprites||{},a.sprites[e.name]=i,i},b.Spine.prototype.createMesh=function(a,c){var d=c.rendererObject,e=d.page.rendererObject,f=new b.Texture(e),g=new b.Strip(f);return g.drawMode=b.Strip.DrawModes.TRIANGLES,g.canvasPadding=1.5,g.vertices=new b.Float32Array(c.uvs.length),g.uvs=c.uvs,g.indices=c.triangles,a.meshes=a.meshes||{},a.meshes[c.name]=g,g},b.BaseTextureCache={},b.BaseTextureCacheIdGenerator=0,b.BaseTexture=function(a,c){if(this.resolution=1,this.width=100,this.height=100,this.scaleMode=c||b.scaleModes.DEFAULT,this.hasLoaded=!1,this.source=a,this._UID=b._UID++,this.premultipliedAlpha=!0,this._glTextures=[],this.mipmap=!1,this._dirty=[!0,!0,!0,!0],a){if((this.source.complete||this.source.getContext)&&this.source.width&&this.source.height)this.hasLoaded=!0,this.width=this.source.naturalWidth||this.source.width,this.height=this.source.naturalHeight||this.source.height,this.dirty();else{var d=this;this.source.onload=function(){d.hasLoaded=!0,d.width=d.source.naturalWidth||d.source.width,d.height=d.source.naturalHeight||d.source.height,d.dirty(),d.dispatchEvent({type:"loaded",content:d})},this.source.onerror=function(){d.dispatchEvent({type:"error",content:d})}}this.imageUrl=null,this._powerOf2=!1}},b.BaseTexture.prototype.constructor=b.BaseTexture,b.EventTarget.mixin(b.BaseTexture.prototype),b.BaseTexture.prototype.destroy=function(){this.imageUrl?(delete b.BaseTextureCache[this.imageUrl],delete b.TextureCache[this.imageUrl],this.imageUrl=null,navigator.isCocoonJS||(this.source.src="")):this.source&&this.source._pixiId&&delete b.BaseTextureCache[this.source._pixiId],this.source=null,this.unloadFromGPU()},b.BaseTexture.prototype.updateSourceImage=function(a){this.hasLoaded=!1,this.source.src=null,this.source.src=a},b.BaseTexture.prototype.dirty=function(){for(var a=0;a<this._glTextures.length;a++)this._dirty[a]=!0},b.BaseTexture.prototype.unloadFromGPU=function(){this.dirty();for(var a=this._glTextures.length-1;a>=0;a--){var c=this._glTextures[a],d=b.glContexts[a];d&&c&&d.deleteTexture(c)}this._glTextures.length=0,this.dirty()},b.BaseTexture.fromImage=function(a,c,d){var e=b.BaseTextureCache[a];if(void 0===c&&-1===a.indexOf("data:")&&(c=!0),!e){var f=new Image;c&&(f.crossOrigin=""),f.src=a,e=new b.BaseTexture(f,d),e.imageUrl=a,b.BaseTextureCache[a]=e,-1!==a.indexOf(b.RETINA_PREFIX+".")&&(e.resolution=2)}return e},b.BaseTexture.fromCanvas=function(a,c){a._pixiId||(a._pixiId="canvas_"+b.TextureCacheIdGenerator++);var d=b.BaseTextureCache[a._pixiId];return d||(d=new b.BaseTexture(a,c),b.BaseTextureCache[a._pixiId]=d),d},b.TextureCache={},b.FrameCache={},b.TextureCacheIdGenerator=0,b.Texture=function(a,c,d,e){this.noFrame=!1,c||(this.noFrame=!0,c=new b.Rectangle(0,0,1,1)),a instanceof b.Texture&&(a=a.baseTexture),this.baseTexture=a,this.frame=c,this.trim=e,this.valid=!1,this.requiresUpdate=!1,this._uvs=null,this.width=0,this.height=0,this.crop=d||new b.Rectangle(0,0,1,1),a.hasLoaded?(this.noFrame&&(c=new b.Rectangle(0,0,a.width,a.height)),this.setFrame(c)):a.addEventListener("loaded",this.onBaseTextureLoaded.bind(this))},b.Texture.prototype.constructor=b.Texture,b.EventTarget.mixin(b.Texture.prototype),b.Texture.prototype.onBaseTextureLoaded=function(){var a=this.baseTexture;a.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new b.Rectangle(0,0,a.width,a.height)),this.setFrame(this.frame),this.dispatchEvent({type:"update",content:this})},b.Texture.prototype.destroy=function(a){a&&this.baseTexture.destroy(),this.valid=!1},b.Texture.prototype.setFrame=function(a){if(this.noFrame=!1,this.frame=a,this.width=a.width,this.height=a.height,this.crop.x=a.x,this.crop.y=a.y,this.crop.width=a.width,this.crop.height=a.height,!this.trim&&(a.x+a.width>this.baseTexture.width||a.y+a.height>this.baseTexture.height))throw new Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.valid=a&&a.width&&a.height&&this.baseTexture.source&&this.baseTexture.hasLoaded,this.trim&&(this.width=this.trim.width,this.height=this.trim.height,this.frame.width=this.trim.width,this.frame.height=this.trim.height),this.valid&&this._updateUvs()},b.Texture.prototype._updateUvs=function(){this._uvs||(this._uvs=new b.TextureUvs);var a=this.crop,c=this.baseTexture.width,d=this.baseTexture.height;this._uvs.x0=a.x/c,this._uvs.y0=a.y/d,this._uvs.x1=(a.x+a.width)/c,this._uvs.y1=a.y/d,this._uvs.x2=(a.x+a.width)/c,this._uvs.y2=(a.y+a.height)/d,this._uvs.x3=a.x/c,this._uvs.y3=(a.y+a.height)/d},b.Texture.fromImage=function(a,c,d){var e=b.TextureCache[a];return e||(e=new b.Texture(b.BaseTexture.fromImage(a,c,d)),b.TextureCache[a]=e),e},b.Texture.fromFrame=function(a){var c=b.TextureCache[a];if(!c)throw new Error('The frameId "'+a+'" does not exist in the texture cache ');return c},b.Texture.fromCanvas=function(a,c){var d=b.BaseTexture.fromCanvas(a,c);return new b.Texture(d)},b.Texture.addTextureToCache=function(a,c){b.TextureCache[c]=a},b.Texture.removeTextureFromCache=function(a){var c=b.TextureCache[a];return delete b.TextureCache[a],delete b.BaseTextureCache[a],c},b.TextureUvs=function(){this.x0=0,this.y0=0,this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.x3=0,this.y3=0},b.Texture.emptyTexture=new b.Texture(new b.BaseTexture),b.RenderTexture=function(a,c,d,e,f){if(this.width=a||100,this.height=c||100,this.resolution=f||1,this.frame=new b.Rectangle(0,0,this.width*this.resolution,this.height*this.resolution),this.crop=new b.Rectangle(0,0,this.width*this.resolution,this.height*this.resolution),this.baseTexture=new b.BaseTexture,this.baseTexture.width=this.width*this.resolution,this.baseTexture.height=this.height*this.resolution,this.baseTexture._glTextures=[],this.baseTexture.resolution=this.resolution,this.baseTexture.scaleMode=e||b.scaleModes.DEFAULT,this.baseTexture.hasLoaded=!0,b.Texture.call(this,this.baseTexture,new b.Rectangle(0,0,this.width,this.height)),this.renderer=d||b.defaultRenderer,this.renderer.type===b.WEBGL_RENDERER){var g=this.renderer.gl;this.baseTexture._dirty[g.id]=!1,this.textureBuffer=new b.FilterTexture(g,this.width*this.resolution,this.height*this.resolution,this.baseTexture.scaleMode),this.baseTexture._glTextures[g.id]=this.textureBuffer.texture,this.render=this.renderWebGL,this.projection=new b.Point(.5*this.width,.5*-this.height)}else this.render=this.renderCanvas,this.textureBuffer=new b.CanvasBuffer(this.width*this.resolution,this.height*this.resolution),this.baseTexture.source=this.textureBuffer.canvas;this.valid=!0,this._updateUvs()},b.RenderTexture.prototype=Object.create(b.Texture.prototype),b.RenderTexture.prototype.constructor=b.RenderTexture,b.RenderTexture.prototype.resize=function(a,c,d){(a!==this.width||c!==this.height)&&(this.valid=a>0&&c>0,this.width=this.frame.width=this.crop.width=a,this.height=this.frame.height=this.crop.height=c,d&&(this.baseTexture.width=this.width,this.baseTexture.height=this.height),this.renderer.type===b.WEBGL_RENDERER&&(this.projection.x=this.width/2,this.projection.y=-this.height/2),this.valid&&this.textureBuffer.resize(this.width*this.resolution,this.height*this.resolution))},b.RenderTexture.prototype.clear=function(){this.valid&&(this.renderer.type===b.WEBGL_RENDERER&&this.renderer.gl.bindFramebuffer(this.renderer.gl.FRAMEBUFFER,this.textureBuffer.frameBuffer),this.textureBuffer.clear())},b.RenderTexture.prototype.renderWebGL=function(a,b,c){if(this.valid){var d=a.worldTransform;d.identity(),d.translate(0,2*this.projection.y),b&&d.append(b),d.scale(1,-1),a.worldAlpha=1;for(var e=a.children,f=0,g=e.length;g>f;f++)e[f].updateTransform();var h=this.renderer.gl;h.viewport(0,0,this.width*this.resolution,this.height*this.resolution),h.bindFramebuffer(h.FRAMEBUFFER,this.textureBuffer.frameBuffer),c&&this.textureBuffer.clear(),this.renderer.spriteBatch.dirty=!0,this.renderer.renderDisplayObject(a,this.projection,this.textureBuffer.frameBuffer),this.renderer.spriteBatch.dirty=!0}},b.RenderTexture.prototype.renderCanvas=function(a,b,c){if(this.valid){var d=a.worldTransform;d.identity(),b&&d.append(b),a.worldAlpha=1;for(var e=a.children,f=0,g=e.length;g>f;f++)e[f].updateTransform();c&&this.textureBuffer.clear();var h=this.textureBuffer.context,i=this.renderer.resolution;this.renderer.resolution=this.resolution,this.renderer.renderDisplayObject(a,h),this.renderer.resolution=i}},b.RenderTexture.prototype.getImage=function(){var a=new Image;return a.src=this.getBase64(),a},b.RenderTexture.prototype.getBase64=function(){return this.getCanvas().toDataURL()},b.RenderTexture.prototype.getCanvas=function(){if(this.renderer.type===b.WEBGL_RENDERER){var a=this.renderer.gl,c=this.textureBuffer.width,d=this.textureBuffer.height,e=new Uint8Array(4*c*d);a.bindFramebuffer(a.FRAMEBUFFER,this.textureBuffer.frameBuffer),a.readPixels(0,0,c,d,a.RGBA,a.UNSIGNED_BYTE,e),a.bindFramebuffer(a.FRAMEBUFFER,null);var f=new b.CanvasBuffer(c,d),g=f.context.getImageData(0,0,c,d);return g.data.set(e),f.context.putImageData(g,0,0),f.canvas}return this.textureBuffer.canvas},b.RenderTexture.tempMatrix=new b.Matrix,b.VideoTexture=function(a,c){if(!a)throw new Error("No video source element specified.");(a.readyState===a.HAVE_ENOUGH_DATA||a.readyState===a.HAVE_FUTURE_DATA)&&a.width&&a.height&&(a.complete=!0),b.BaseTexture.call(this,a,c),this.autoUpdate=!1,this.updateBound=this._onUpdate.bind(this),a.complete||(this._onCanPlay=this.onCanPlay.bind(this),a.addEventListener("canplay",this._onCanPlay),a.addEventListener("canplaythrough",this._onCanPlay),a.addEventListener("play",this.onPlayStart.bind(this)),a.addEventListener("pause",this.onPlayStop.bind(this)))},b.VideoTexture.prototype=Object.create(b.BaseTexture.prototype),b.VideoTexture.constructor=b.VideoTexture,b.VideoTexture.prototype._onUpdate=function(){this.autoUpdate&&(window.requestAnimationFrame(this.updateBound),this.dirty())},b.VideoTexture.prototype.onPlayStart=function(){this.autoUpdate||(window.requestAnimationFrame(this.updateBound),this.autoUpdate=!0)},b.VideoTexture.prototype.onPlayStop=function(){this.autoUpdate=!1},b.VideoTexture.prototype.onCanPlay=function(){"canplaythrough"===event.type&&(this.hasLoaded=!0,this.source&&(this.source.removeEventListener("canplay",this._onCanPlay),this.source.removeEventListener("canplaythrough",this._onCanPlay),this.width=this.source.videoWidth,this.height=this.source.videoHeight,this.__loaded||(this.__loaded=!0,this.dispatchEvent({type:"loaded",content:this}))))},b.VideoTexture.prototype.destroy=function(){this.source&&this.source._pixiId&&(b.BaseTextureCache[this.source._pixiId]=null,delete b.BaseTextureCache[this.source._pixiId],this.source._pixiId=null,delete this.source._pixiId),b.BaseTexture.prototype.destroy.call(this)},b.VideoTexture.baseTextureFromVideo=function(a,c){a._pixiId||(a._pixiId="video_"+b.TextureCacheIdGenerator++);var d=b.BaseTextureCache[a._pixiId];return d||(d=new b.VideoTexture(a,c),b.BaseTextureCache[a._pixiId]=d),d},b.VideoTexture.textureFromVideo=function(a,c){var d=b.VideoTexture.baseTextureFromVideo(a,c);return new b.Texture(d)},b.VideoTexture.fromUrl=function(a,c){var d=document.createElement("video");return d.src=a,d.autoPlay=!0,d.play(),b.VideoTexture.textureFromVideo(d,c)},b.AssetLoader=function(a,c){this.assetURLs=a,this.crossorigin=c,this.loadersByType={jpg:b.ImageLoader,jpeg:b.ImageLoader,png:b.ImageLoader,gif:b.ImageLoader,webp:b.ImageLoader,json:b.JsonLoader,atlas:b.AtlasLoader,anim:b.SpineLoader,xml:b.BitmapFontLoader,fnt:b.BitmapFontLoader}},b.EventTarget.mixin(b.AssetLoader.prototype),b.AssetLoader.prototype.constructor=b.AssetLoader,b.AssetLoader.prototype._getDataType=function(a){var b="data:",c=a.slice(0,b.length).toLowerCase();if(c===b){var d=a.slice(b.length),e=d.indexOf(",");if(-1===e)return null;var f=d.slice(0,e).split(";")[0];return f&&"text/plain"!==f.toLowerCase()?f.split("/").pop().toLowerCase():"txt"}return null},b.AssetLoader.prototype.load=function(){function a(a){b.onAssetLoaded(a.data.content)}var b=this;this.loadCount=this.assetURLs.length;for(var c=0;c<this.assetURLs.length;c++){var d=this.assetURLs[c],e=this._getDataType(d);e||(e=d.split("?").shift().split(".").pop().toLowerCase());var f=this.loadersByType[e];if(!f)throw new Error(e+" is an unsupported file type");var g=new f(d,this.crossorigin);g.on("loaded",a),g.load()}},b.AssetLoader.prototype.onAssetLoaded=function(a){this.loadCount--,this.emit("onProgress",{content:this,loader:a}),this.onProgress&&this.onProgress(a),this.loadCount||(this.emit("onComplete",{content:this}),this.onComplete&&this.onComplete())},b.JsonLoader=function(a,b){this.url=a,this.crossorigin=b,this.baseUrl=a.replace(/[^\/]*$/,""),this.loaded=!1},b.JsonLoader.prototype.constructor=b.JsonLoader,b.EventTarget.mixin(b.JsonLoader.prototype),b.JsonLoader.prototype.load=function(){window.XDomainRequest&&this.crossorigin?(this.ajaxRequest=new window.XDomainRequest,this.ajaxRequest.timeout=3e3,this.ajaxRequest.onerror=this.onError.bind(this),this.ajaxRequest.ontimeout=this.onError.bind(this),this.ajaxRequest.onprogress=function(){},this.ajaxRequest.onload=this.onJSONLoaded.bind(this)):(this.ajaxRequest=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP"),this.ajaxRequest.onreadystatechange=this.onReadyStateChanged.bind(this)),this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.send()},b.JsonLoader.prototype.onReadyStateChanged=function(){4!==this.ajaxRequest.readyState||200!==this.ajaxRequest.status&&-1!==window.location.href.indexOf("http")||this.onJSONLoaded()},b.JsonLoader.prototype.onJSONLoaded=function(){if(!this.ajaxRequest.responseText)return void this.onError();if(this.json=JSON.parse(this.ajaxRequest.responseText),this.json.frames&&this.json.meta&&this.json.meta.image){var a=this.baseUrl+this.json.meta.image,d=new b.ImageLoader(a,this.crossorigin),e=this.json.frames;this.texture=d.texture.baseTexture,d.addEventListener("loaded",this.onLoaded.bind(this));for(var f in e){var g=e[f].frame;if(g){var h=new b.Rectangle(g.x,g.y,g.w,g.h),i=h.clone(),j=null;if(e[f].trimmed){var k=e[f].sourceSize,l=e[f].spriteSourceSize;j=new b.Rectangle(l.x,l.y,k.w,k.h)}b.TextureCache[f]=new b.Texture(this.texture,h,i,j)}}d.load()}else if(this.json.bones)if(b.AnimCache[this.url])this.onLoaded();else{var m=this.url.substr(0,this.url.lastIndexOf("."))+".atlas",n=new b.JsonLoader(m,this.crossorigin),o=this;n.onJSONLoaded=function(){if(!this.ajaxRequest.responseText)return void this.onError();var a=new b.SpineTextureLoader(this.url.substring(0,this.url.lastIndexOf("/"))),d=new c.Atlas(this.ajaxRequest.responseText,a),e=new c.AtlasAttachmentLoader(d),f=new c.SkeletonJson(e),g=f.readSkeletonData(o.json);b.AnimCache[o.url]=g,o.spine=g,o.spineAtlas=d,o.spineAtlasLoader=n,a.loadingCount>0?a.addEventListener("loadedBaseTexture",function(a){a.content.content.loadingCount<=0&&o.onLoaded()}):o.onLoaded()},n.load()}else this.onLoaded()},b.JsonLoader.prototype.onLoaded=function(){this.loaded=!0,this.dispatchEvent({type:"loaded",content:this})},b.JsonLoader.prototype.onError=function(){this.dispatchEvent({type:"error",content:this})},b.AtlasLoader=function(a,b){this.url=a,this.baseUrl=a.replace(/[^\/]*$/,""),this.crossorigin=b,this.loaded=!1},b.AtlasLoader.constructor=b.AtlasLoader,b.EventTarget.mixin(b.AtlasLoader.prototype),b.AtlasLoader.prototype.load=function(){this.ajaxRequest=new b.AjaxRequest,this.ajaxRequest.onreadystatechange=this.onAtlasLoaded.bind(this),this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},b.AtlasLoader.prototype.onAtlasLoaded=function(){if(4===this.ajaxRequest.readyState)if(200===this.ajaxRequest.status||-1===window.location.href.indexOf("http")){this.atlas={meta:{image:[]},frames:[]};var a=this.ajaxRequest.responseText.split(/\r?\n/),c=-3,d=0,e=null,f=!1,g=0,h=0,i=this.onLoaded.bind(this);for(g=0;g<a.length;g++)if(a[g]=a[g].replace(/^\s+|\s+$/g,""),""===a[g]&&(f=g+1),a[g].length>0){if(f===g)this.atlas.meta.image.push(a[g]),d=this.atlas.meta.image.length-1,this.atlas.frames.push({}),c=-3;else if(c>0)if(c%7===1)null!=e&&(this.atlas.frames[d][e.name]=e),e={name:a[g],frame:{}};else{var j=a[g].split(" ");if(c%7===3)e.frame.x=Number(j[1].replace(",","")),e.frame.y=Number(j[2]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16606
else if(c%7===4)e.frame.w=Number(j[1].replace(",","")),e.frame.h=Number(j[2]);else if(c%7===5){var k={x:0,y:0,w:Number(j[1].replace(",","")),h:Number(j[2])};k.w>e.frame.w||k.h>e.frame.h?(e.trimmed=!0,e.realSize=k):e.trimmed=!1}}c++}if(null!=e&&(this.atlas.frames[d][e.name]=e),this.atlas.meta.image.length>0){for(this.images=[],h=0;h<this.atlas.meta.image.length;h++){var l=this.baseUrl+this.atlas.meta.image[h],m=this.atlas.frames[h];this.images.push(new b.ImageLoader(l,this.crossorigin));for(g in m){var n=m[g].frame;n&&(b.TextureCache[g]=new b.Texture(this.images[h].texture.baseTexture,{x:n.x,y:n.y,width:n.w,height:n.h}),m[g].trimmed&&(b.TextureCache[g].realSize=m[g].realSize,b.TextureCache[g].trim.x=0,b.TextureCache[g].trim.y=0))}}for(this.currentImageId=0,h=0;h<this.images.length;h++)this.images[h].on("loaded",i);this.images[this.currentImageId].load()}else this.onLoaded()}else this.onError()},b.AtlasLoader.prototype.onLoaded=function(){this.images.length-1>this.currentImageId?(this.currentImageId++,this.images[this.currentImageId].load()):(this.loaded=!0,this.emit("loaded",{content:this}))},b.AtlasLoader.prototype.onError=function(){this.emit("error",{content:this})},b.SpriteSheetLoader=function(a,b){this.url=a,this.crossorigin=b,this.baseUrl=a.replace(/[^\/]*$/,""),this.texture=null,this.frames={}},b.SpriteSheetLoader.prototype.constructor=b.SpriteSheetLoader,b.EventTarget.mixin(b.SpriteSheetLoader.prototype),b.SpriteSheetLoader.prototype.load=function(){var a=this,c=new b.JsonLoader(this.url,this.crossorigin);c.on("loaded",function(b){a.json=b.data.content.json,a.onLoaded()}),c.load()},b.SpriteSheetLoader.prototype.onLoaded=function(){this.emit("loaded",{content:this})},b.ImageLoader=function(a,c){this.texture=b.Texture.fromImage(a,c),this.frames=[]},b.ImageLoader.prototype.constructor=b.ImageLoader,b.EventTarget.mixin(b.ImageLoader.prototype),b.ImageLoader.prototype.load=function(){this.texture.baseTexture.hasLoaded?this.onLoaded():this.texture.baseTexture.on("loaded",this.onLoaded.bind(this))},b.ImageLoader.prototype.onLoaded=function(){this.emit("loaded",{content:this})},b.ImageLoader.prototype.loadFramedSpriteSheet=function(a,c,d){this.frames=[];for(var e=Math.floor(this.texture.width/a),f=Math.floor(this.texture.height/c),g=0,h=0;f>h;h++)for(var i=0;e>i;i++,g++){var j=new b.Texture(this.texture.baseTexture,{x:i*a,y:h*c,width:a,height:c});this.frames.push(j),d&&(b.TextureCache[d+"-"+g]=j)}this.load()},b.BitmapFontLoader=function(a,b){this.url=a,this.crossorigin=b,this.baseUrl=a.replace(/[^\/]*$/,""),this.texture=null},b.BitmapFontLoader.prototype.constructor=b.BitmapFontLoader,b.EventTarget.mixin(b.BitmapFontLoader.prototype),b.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new b.AjaxRequest,this.ajaxRequest.onreadystatechange=this.onXMLLoaded.bind(this),this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},b.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4===this.ajaxRequest.readyState&&(200===this.ajaxRequest.status||-1===window.location.protocol.indexOf("http"))){var a=this.ajaxRequest.responseXML;if(!a||/MSIE 9/i.test(navigator.userAgent)||navigator.isCocoonJS)if("function"==typeof window.DOMParser){var c=new DOMParser;a=c.parseFromString(this.ajaxRequest.responseText,"text/xml")}else{var d=document.createElement("div");d.innerHTML=this.ajaxRequest.responseText,a=d}var e=this.baseUrl+a.getElementsByTagName("page")[0].getAttribute("file"),f=new b.ImageLoader(e,this.crossorigin);this.texture=f.texture.baseTexture;var g={},h=a.getElementsByTagName("info")[0],i=a.getElementsByTagName("common")[0];g.font=h.getAttribute("face"),g.size=parseInt(h.getAttribute("size"),10),g.lineHeight=parseInt(i.getAttribute("lineHeight"),10),g.chars={};for(var j=a.getElementsByTagName("char"),k=0;k<j.length;k++){var l=parseInt(j[k].getAttribute("id"),10),m=new b.Rectangle(parseInt(j[k].getAttribute("x"),10),parseInt(j[k].getAttribute("y"),10),parseInt(j[k].getAttribute("width"),10),parseInt(j[k].getAttribute("height"),10));g.chars[l]={xOffset:parseInt(j[k].getAttribute("xoffset"),10),yOffset:parseInt(j[k].getAttribute("yoffset"),10),xAdvance:parseInt(j[k].getAttribute("xadvance"),10),kerning:{},texture:b.TextureCache[l]=new b.Texture(this.texture,m)}}var n=a.getElementsByTagName("kerning");for(k=0;k<n.length;k++){var o=parseInt(n[k].getAttribute("first"),10),p=parseInt(n[k].getAttribute("second"),10),q=parseInt(n[k].getAttribute("amount"),10);g.chars[p].kerning[o]=q}b.BitmapText.fonts[g.font]=g,f.addEventListener("loaded",this.onLoaded.bind(this)),f.load()}},b.BitmapFontLoader.prototype.onLoaded=function(){this.emit("loaded",{content:this})},b.SpineLoader=function(a,b){this.url=a,this.crossorigin=b,this.loaded=!1},b.SpineLoader.prototype.constructor=b.SpineLoader,b.EventTarget.mixin(b.SpineLoader.prototype),b.SpineLoader.prototype.load=function(){var a=this,c=new b.JsonLoader(this.url,this.crossorigin);c.on("loaded",function(b){a.json=b.data.content.json,a.onLoaded()}),c.load()},b.SpineLoader.prototype.onLoaded=function(){this.loaded=!0,this.emit("loaded",{content:this})},b.AbstractFilter=function(a,b){this.passes=[this],this.shaders=[],this.dirty=!0,this.padding=0,this.uniforms=b||{},this.fragmentSrc=a||[]},b.AbstractFilter.prototype.constructor=b.AbstractFilter,b.AbstractFilter.prototype.syncUniforms=function(){for(var a=0,b=this.shaders.length;b>a;a++)this.shaders[a].dirty=!0},b.AlphaMaskFilter=function(a){b.AbstractFilter.call(this),this.passes=[this],a.baseTexture._powerOf2=!0,this.uniforms={mask:{type:"sampler2D",value:a},mapDimensions:{type:"2f",value:{x:1,y:5112}},dimensions:{type:"4fv",value:[0,0,0,0]}},a.baseTexture.hasLoaded?(this.uniforms.mask.value.x=a.width,this.uniforms.mask.value.y=a.height):(this.boundLoadedFunction=this.onTextureLoaded.bind(this),a.baseTexture.on("loaded",this.boundLoadedFunction)),this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform sampler2D mask;","uniform sampler2D uSampler;","uniform vec2 offset;","uniform vec4 dimensions;","uniform vec2 mapDimensions;","void main(void) {","   vec2 mapCords = vTextureCoord.xy;","   mapCords += (dimensions.zw + offset)/ dimensions.xy ;","   mapCords.y *= -1.0;","   mapCords.y += 1.0;","   mapCords *= dimensions.xy / mapDimensions;","   vec4 original =  texture2D(uSampler, vTextureCoord);","   float maskAlpha =  texture2D(mask, mapCords).r;","   original *= maskAlpha;","   gl_FragColor =  original;","}"]},b.AlphaMaskFilter.prototype=Object.create(b.AbstractFilter.prototype),b.AlphaMaskFilter.prototype.constructor=b.AlphaMaskFilter,b.AlphaMaskFilter.prototype.onTextureLoaded=function(){this.uniforms.mapDimensions.value.x=this.uniforms.mask.value.width,this.uniforms.mapDimensions.value.y=this.uniforms.mask.value.height,this.uniforms.mask.value.baseTexture.off("loaded",this.boundLoadedFunction)},Object.defineProperty(b.AlphaMaskFilter.prototype,"map",{get:function(){return this.uniforms.mask.value},set:function(a){this.uniforms.mask.value=a}}),b.ColorMatrixFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={matrix:{type:"mat4",value:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform float invert;","uniform mat4 matrix;","uniform sampler2D uSampler;","void main(void) {","   gl_FragColor = texture2D(uSampler, vTextureCoord) * matrix;","}"]},b.ColorMatrixFilter.prototype=Object.create(b.AbstractFilter.prototype),b.ColorMatrixFilter.prototype.constructor=b.ColorMatrixFilter,Object.defineProperty(b.ColorMatrixFilter.prototype,"matrix",{get:function(){return this.uniforms.matrix.value},set:function(a){this.uniforms.matrix.value=a}}),b.GrayFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={gray:{type:"1f",value:1}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform sampler2D uSampler;","uniform float gray;","void main(void) {","   gl_FragColor = texture2D(uSampler, vTextureCoord);","   gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);","}"]},b.GrayFilter.prototype=Object.create(b.AbstractFilter.prototype),b.GrayFilter.prototype.constructor=b.GrayFilter,Object.defineProperty(b.GrayFilter.prototype,"gray",{get:function(){return this.uniforms.gray.value},set:function(a){this.uniforms.gray.value=a}}),b.DisplacementFilter=function(a){b.AbstractFilter.call(this),this.passes=[this],a.baseTexture._powerOf2=!0,this.uniforms={displacementMap:{type:"sampler2D",value:a},scale:{type:"2f",value:{x:30,y:30}},offset:{type:"2f",value:{x:0,y:0}},mapDimensions:{type:"2f",value:{x:1,y:5112}},dimensions:{type:"4fv",value:[0,0,0,0]}},a.baseTexture.hasLoaded?(this.uniforms.mapDimensions.value.x=a.width,this.uniforms.mapDimensions.value.y=a.height):(this.boundLoadedFunction=this.onTextureLoaded.bind(this),a.baseTexture.on("loaded",this.boundLoadedFunction)),this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform sampler2D displacementMap;","uniform sampler2D uSampler;","uniform vec2 scale;","uniform vec2 offset;","uniform vec4 dimensions;","uniform vec2 mapDimensions;","void main(void) {","   vec2 mapCords = vTextureCoord.xy;","   mapCords += (dimensions.zw + offset)/ dimensions.xy ;","   mapCords.y *= -1.0;","   mapCords.y += 1.0;","   vec2 matSample = texture2D(displacementMap, mapCords).xy;","   matSample -= 0.5;","   matSample *= scale;","   matSample /= mapDimensions;","   gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + matSample.x, vTextureCoord.y + matSample.y));","   gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb, 1.0);","   vec2 cord = vTextureCoord;","}"]},b.DisplacementFilter.prototype=Object.create(b.AbstractFilter.prototype),b.DisplacementFilter.prototype.constructor=b.DisplacementFilter,b.DisplacementFilter.prototype.onTextureLoaded=function(){this.uniforms.mapDimensions.value.x=this.uniforms.displacementMap.value.width,this.uniforms.mapDimensions.value.y=this.uniforms.displacementMap.value.height,this.uniforms.displacementMap.value.baseTexture.off("loaded",this.boundLoadedFunction)},Object.defineProperty(b.DisplacementFilter.prototype,"map",{get:function(){return this.uniforms.displacementMap.value},set:function(a){this.uniforms.displacementMap.value=a}}),Object.defineProperty(b.DisplacementFilter.prototype,"scale",{get:function(){return this.uniforms.scale.value},set:function(a){this.uniforms.scale.value=a}}),Object.defineProperty(b.DisplacementFilter.prototype,"offset",{get:function(){return this.uniforms.offset.value},set:function(a){this.uniforms.offset.value=a}}),b.PixelateFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={invert:{type:"1f",value:0},dimensions:{type:"4fv",value:new b.Float32Array([1e4,100,10,10])},pixelSize:{type:"2f",value:{x:10,y:10}}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform vec2 testDim;","uniform vec4 dimensions;","uniform vec2 pixelSize;","uniform sampler2D uSampler;","void main(void) {","   vec2 coord = vTextureCoord;","   vec2 size = dimensions.xy/pixelSize;","   vec2 color = floor( ( vTextureCoord * size ) ) / size + pixelSize/dimensions.xy * 0.5;","   gl_FragColor = texture2D(uSampler, color);","}"]},b.PixelateFilter.prototype=Object.create(b.AbstractFilter.prototype),b.PixelateFilter.prototype.constructor=b.PixelateFilter,Object.defineProperty(b.PixelateFilter.prototype,"size",{get:function(){return this.uniforms.pixelSize.value},set:function(a){this.dirty=!0,this.uniforms.pixelSize.value=a}}),b.BlurXFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={blur:{type:"1f",value:1/512}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform float blur;","uniform sampler2D uSampler;","void main(void) {","   vec4 sum = vec4(0.0);","   sum += texture2D(uSampler, vec2(vTextureCoord.x - 4.0*blur, vTextureCoord.y)) * 0.05;","   sum += texture2D(uSampler, vec2(vTextureCoord.x - 3.0*blur, vTextureCoord.y)) * 0.09;","   sum += texture2D(uSampler, vec2(vTextureCoord.x - 2.0*blur, vTextureCoord.y)) * 0.12;","   sum += texture2D(uSampler, vec2(vTextureCoord.x - blur, vTextureCoord.y)) * 0.15;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;","   sum += texture2D(uSampler, vec2(vTextureCoord.x + blur, vTextureCoord.y)) * 0.15;","   sum += texture2D(uSampler, vec2(vTextureCoord.x + 2.0*blur, vTextureCoord.y)) * 0.12;","   sum += texture2D(uSampler, vec2(vTextureCoord.x + 3.0*blur, vTextureCoord.y)) * 0.09;","   sum += texture2D(uSampler, vec2(vTextureCoord.x + 4.0*blur, vTextureCoord.y)) * 0.05;","   gl_FragColor = sum;","}"]},b.BlurXFilter.prototype=Object.create(b.AbstractFilter.prototype),b.BlurXFilter.prototype.constructor=b.BlurXFilter,Object.defineProperty(b.BlurXFilter.prototype,"blur",{get:function(){return this.uniforms.blur.value/(1/7e3)},set:function(a){this.dirty=!0,this.uniforms.blur.value=1/7e3*a}}),b.BlurYFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={blur:{type:"1f",value:1/512}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform float blur;","uniform sampler2D uSampler;","void main(void) {","   vec4 sum = vec4(0.0);","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 4.0*blur)) * 0.05;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 3.0*blur)) * 0.09;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 2.0*blur)) * 0.12;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - blur)) * 0.15;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + blur)) * 0.15;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 2.0*blur)) * 0.12;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 3.0*blur)) * 0.09;","   sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 4.0*blur)) * 0.05;","   gl_FragColor = sum;","}"]},b.BlurYFilter.prototype=Object.create(b.AbstractFilter.prototype),b.BlurYFilter.prototype.constructor=b.BlurYFilter,Object.defineProperty(b.BlurYFilter.prototype,"blur",{get:function(){return this.uniforms.blur.value/(1/7e3)},set:function(a){this.uniforms.blur.value=1/7e3*a}}),b.BlurFilter=function(){this.blurXFilter=new b.BlurXFilter,this.blurYFilter=new b.BlurYFilter,this.passes=[this.blurXFilter,this.blurYFilter]},b.BlurFilter.prototype=Object.create(b.AbstractFilter.prototype),b.BlurFilter.prototype.constructor=b.BlurFilter,Object.defineProperty(b.BlurFilter.prototype,"blur",{get:function(){return this.blurXFilter.blur},set:function(a){this.blurXFilter.blur=this.blurYFilter.blur=a}}),Object.defineProperty(b.BlurFilter.prototype,"blurX",{get:function(){return this.blurXFilter.blur},set:function(a){this.blurXFilter.blur=a}}),Object.defineProperty(b.BlurFilter.prototype,"blurY",{get:function(){return this.blurYFilter.blur},set:function(a){this.blurYFilter.blur=a}}),b.InvertFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={invert:{type:"1f",value:1}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform float invert;","uniform sampler2D uSampler;","void main(void) {","   gl_FragColor = texture2D(uSampler, vTextureCoord);","   gl_FragColor.rgb = mix( (vec3(1)-gl_FragColor.rgb) * gl_FragColor.a, gl_FragColor.rgb, 1.0 - invert);","}"]},b.InvertFilter.prototype=Object.create(b.AbstractFilter.prototype),b.InvertFilter.prototype.constructor=b.InvertFilter,Object.defineProperty(b.InvertFilter.prototype,"invert",{get:function(){return this.uniforms.invert.value},set:function(a){this.uniforms.invert.value=a}}),b.SepiaFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={sepia:{type:"1f",value:1}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform float sepia;","uniform sampler2D uSampler;","const mat3 sepiaMatrix = mat3(0.3588, 0.7044, 0.1368, 0.2990, 0.5870, 0.1140, 0.2392, 0.4696, 0.0912);","void main(void) {","   gl_FragColor = texture2D(uSampler, vTextureCoord);","   gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb * sepiaMatrix, sepia);","}"]},b.SepiaFilter.prototype=Object.create(b.AbstractFilter.prototype),b.SepiaFilter.prototype.constructor=b.SepiaFilter,Object.defineProperty(b.SepiaFilter.prototype,"sepia",{get:function(){return this.uniforms.sepia.value},set:function(a){this.uniforms.sepia.value=a}}),b.TwistFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={radius:{type:"1f",value:.5},angle:{type:"1f",value:5},offset:{type:"2f",value:{x:.5,y:.5}}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform vec4 dimensions;","uniform sampler2D uSampler;","uniform float radius;","uniform float angle;","uniform vec2 offset;","void main(void) {","   vec2 coord = vTextureCoord - offset;","   float distance = length(coord);","   if (distance < radius) {","       float ratio = (radius - distance) / radius;","       float angleMod = ratio * ratio * angle;","       float s = sin(angleMod);","       float c = cos(angleMod);","       coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);","   }","   gl_FragColor = texture2D(uSampler, coord+offset);","}"]},b.TwistFilter.prototype=Object.create(b.AbstractFilter.prototype),b.TwistFilter.prototype.constructor=b.TwistFilter,Object.defineProperty(b.TwistFilter.prototype,"offset",{get:function(){return this.uniforms.offset.value},set:function(a){this.dirty=!0,this.uniforms.offset.value=a}}),Object.defineProperty(b.TwistFilter.prototype,"radius",{get:function(){return this.uniforms.radius.value},set:function(a){this.dirty=!0,this.uniforms.radius.value=a}}),Object.defineProperty(b.TwistFilter.prototype,"angle",{get:function(){return this.uniforms.angle.value},set:function(a){this.dirty=!0,this.uniforms.angle.value=a}}),b.ColorStepFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={step:{type:"1f",value:5}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform sampler2D uSampler;","uniform float step;","void main(void) {","   vec4 color = texture2D(uSampler, vTextureCoord);","   color = floor(color * step) / step;","   gl_FragColor = color;","}"]},b.ColorStepFilter.prototype=Object.create(b.AbstractFilter.prototype),b.ColorStepFilter.prototype.constructor=b.ColorStepFilter,Object.defineProperty(b.ColorStepFilter.prototype,"step",{get:function(){return this.uniforms.step.value},set:function(a){this.uniforms.step.value=a}}),b.DotScreenFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={scale:{type:"1f",value:1},angle:{type:"1f",value:5},dimensions:{type:"4fv",value:[0,0,0,0]}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform vec4 dimensions;","uniform sampler2D uSampler;","uniform float angle;","uniform float scale;","float pattern() {","   float s = sin(angle), c = cos(angle);","   vec2 tex = vTextureCoord * dimensions.xy;","   vec2 point = vec2(","       c * tex.x - s * tex.y,","       s * tex.x + c * tex.y","   ) * scale;","   return (sin(point.x) * sin(point.y)) * 4.0;","}","void main() {","   vec4 color = texture2D(uSampler, vTextureCoord);","   float average = (color.r + color.g + color.b) / 3.0;","   gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);","}"]},b.DotScreenFilter.prototype=Object.create(b.AbstractFilter.prototype),b.DotScreenFilter.prototype.constructor=b.DotScreenFilter,Object.defineProperty(b.DotScreenFilter.prototype,"scale",{get:function(){return this.uniforms.scale.value},set:function(a){this.dirty=!0,this.uniforms.scale.value=a}}),Object.defineProperty(b.DotScreenFilter.prototype,"angle",{get:function(){return this.uniforms.angle.value},set:function(a){this.dirty=!0,this.uniforms.angle.value=a}}),b.CrossHatchFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={blur:{type:"1f",value:1/512}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform float blur;","uniform sampler2D uSampler;","void main(void) {","    float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb);","    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);","    if (lum < 1.00) {","        if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {","            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);","        }","    }","    if (lum < 0.75) {","        if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {","            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);","        }","    }","    if (lum < 0.50) {","        if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {","            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);","        }","    }","    if (lum < 0.3) {","        if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {","            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);","        }","    }","}"]},b.CrossHatchFilter.prototype=Object.create(b.AbstractFilter.prototype),b.CrossHatchFilter.prototype.constructor=b.CrossHatchFilter,Object.defineProperty(b.CrossHatchFilter.prototype,"blur",{get:function(){return this.uniforms.blur.value/(1/7e3)},set:function(a){this.uniforms.blur.value=1/7e3*a}}),b.RGBSplitFilter=function(){b.AbstractFilter.call(this),this.passes=[this],this.uniforms={red:{type:"2f",value:{x:20,y:20}},green:{type:"2f",value:{x:-20,y:20}},blue:{type:"2f",value:{x:20,y:-20}},dimensions:{type:"4fv",value:[0,0,0,0]}},this.fragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying vec4 vColor;","uniform vec2 red;","uniform vec2 green;","uniform vec2 blue;","uniform vec4 dimensions;","uniform sampler2D uSampler;","void main(void) {","   gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/dimensions.xy).r;","   gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/dimensions.xy).g;","   gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/dimensions.xy).b;","   gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;","}"]},b.RGBSplitFilter.prototype=Object.create(b.AbstractFilter.prototype),b.RGBSplitFilter.prototype.constructor=b.RGBSplitFilter,Object.defineProperty(b.RGBSplitFilter.prototype,"red",{get:function(){return this.uniforms.red.value},set:function(a){this.uniforms.red.value=a}}),Object.defineProperty(b.RGBSplitFilter.prototype,"green",{get:function(){return this.uniforms.green.value},set:function(a){this.uniforms.green.value=a}}),Object.defineProperty(b.RGBSplitFilter.prototype,"blue",{get:function(){return this.uniforms.blue.value},set:function(a){this.uniforms.blue.value=a}}),"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=b),exports.PIXI=b):"undefined"!=typeof define&&define.amd?define(b):a.PIXI=b}).call(this);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16607
},{}],"randomColor":[function(require,module,exports){
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16608
;(function(root, factory) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16609
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16610
  // Support AMD
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16611
  if (typeof define === 'function' && define.amd) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16612
    define([], factory);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16613
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16614
  // Support CommonJS
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16615
  } else if (typeof exports === 'object') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16616
    var randomColor = factory();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16617
    
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16618
    // Support NodeJS & Component, which allow module.exports to be a function
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16619
    if (typeof module === 'object' && module && module.exports) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16620
      exports = module.exports = randomColor;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16621
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16622
    
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16623
    // Support CommonJS 1.1.1 spec
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16624
    exports.randomColor = randomColor;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16625
  
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16626
  // Support vanilla script loading
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16627
  } else {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16628
    root.randomColor = factory();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16629
  };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16630
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16631
}(this, function() {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16632
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16633
  // Shared color dictionary
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16634
  var colorDictionary = {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16635
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16636
  // Populate the color dictionary
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16637
  loadColorBounds();
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16638
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16639
  var randomColor = function(options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16640
    options = options || {};
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16641
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16642
    var H,S,B;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16643
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16644
    // Check if we need to generate multiple colors
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16645
    if (options.count) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16646
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16647
      var totalColors = options.count,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16648
          colors = [];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16649
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16650
      options.count = false;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16651
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16652
      while (totalColors > colors.length) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16653
        colors.push(randomColor(options));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16654
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16655
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16656
      return colors;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16657
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16658
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16659
    // First we pick a hue (H)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16660
    H = pickHue(options);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16661
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16662
    // Then use H to determine saturation (S)
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16663
    S = pickSaturation(H, options);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16664
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16665
    // Then use S and H to determine brightness (B).
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16666
    B = pickBrightness(H, S, options);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16667
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16668
    // Then we return the HSB color in the desired format
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16669
    return setFormat([H,S,B], options);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16670
  };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16671
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16672
  function pickHue (options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16673
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16674
    var hueRange = getHueRange(options.hue),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16675
        hue = randomWithin(hueRange);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16676
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16677
    // Instead of storing red as two seperate ranges,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16678
    // we group them, using negative numbers
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16679
    if (hue < 0) {hue = 360 + hue}
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16680
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16681
    return hue;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16682
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16683
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16684
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16685
  function pickSaturation (hue, options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16686
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16687
    if (options.luminosity === 'random') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16688
      return randomWithin([0,100]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16689
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16690
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16691
    if (options.hue === 'monochrome') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16692
      return 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16693
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16694
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16695
    var saturationRange = getSaturationRange(hue);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16696
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16697
    var sMin = saturationRange[0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16698
        sMax = saturationRange[1];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16699
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16700
    switch (options.luminosity) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16701
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16702
      case 'bright':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16703
        sMin = 55;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16704
        break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16705
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16706
      case 'dark':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16707
        sMin = sMax - 10;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16708
        break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16709
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16710
      case 'light':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16711
        sMax = 55;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16712
        break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16713
   }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16714
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16715
    return randomWithin([sMin, sMax]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16716
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16717
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16718
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16719
  function pickBrightness (H, S, options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16720
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16721
    var brightness,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16722
        bMin = getMinimumBrightness(H, S),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16723
        bMax = 100;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16724
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16725
    switch (options.luminosity) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16726
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16727
      case 'dark':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16728
        bMax = bMin + 20;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16729
        break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16730
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16731
      case 'light':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16732
        bMin = (bMax + bMin)/2;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16733
        break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16734
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16735
      case 'random':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16736
        bMin = 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16737
        bMax = 100;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16738
        break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16739
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16740
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16741
    return randomWithin([bMin, bMax]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16742
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16743
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16744
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16745
  function setFormat (hsv, options) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16746
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16747
    switch (options.format) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16748
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16749
      case 'hsvArray':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16750
        return hsv;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16751
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16752
      case 'hsv':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16753
        return colorString('hsv', hsv);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16754
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16755
      case 'rgbArray':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16756
        return HSVtoRGB(hsv);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16757
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16758
      case 'rgb':
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16759
        return colorString('rgb', HSVtoRGB(hsv));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16760
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16761
      default:
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16762
        return HSVtoHex(hsv);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16763
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16764
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16765
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16766
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16767
  function getMinimumBrightness(H, S) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16768
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16769
    var lowerBounds = getColorInfo(H).lowerBounds;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16770
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16771
    for (var i = 0; i < lowerBounds.length - 1; i++) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16772
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16773
      var s1 = lowerBounds[i][0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16774
          v1 = lowerBounds[i][1];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16775
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16776
      var s2 = lowerBounds[i+1][0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16777
          v2 = lowerBounds[i+1][1];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16778
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16779
      if (S >= s1 && S <= s2) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16780
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16781
         var m = (v2 - v1)/(s2 - s1),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16782
             b = v1 - m*s1;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16783
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16784
         return m*S + b;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16785
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16786
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16787
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16788
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16789
    return 0;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16790
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16791
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16792
  function getHueRange (colorInput) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16793
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16794
    if (typeof parseInt(colorInput) === 'number') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16795
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16796
      var number = parseInt(colorInput);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16797
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16798
      if (number < 360 && number > 0) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16799
        return [number, number];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16800
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16801
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16802
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16803
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16804
    if (typeof colorInput === 'string') {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16805
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16806
      if (colorDictionary[colorInput]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16807
        var color = colorDictionary[colorInput];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16808
        if (color.hueRange) {return color.hueRange}
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16809
      }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16810
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16811
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16812
    return [0,360];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16813
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16814
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16815
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16816
  function getSaturationRange (hue) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16817
    return getColorInfo(hue).saturationRange;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16818
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16819
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16820
  function getColorInfo (hue) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16821
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16822
    // Maps red colors to make picking hue easier
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16823
    if (hue >= 334 && hue <= 360) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16824
      hue-= 360;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16825
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16826
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16827
    for (var colorName in colorDictionary) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16828
       var color = colorDictionary[colorName];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16829
       if (color.hueRange &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16830
           hue >= color.hueRange[0] &&
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16831
           hue <= color.hueRange[1]) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16832
          return colorDictionary[colorName];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16833
       }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16834
    } return 'Color not found';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16835
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16836
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16837
  function randomWithin (range) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16838
    return Math.floor(range[0] + Math.random()*(range[1] + 1 - range[0]));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16839
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16840
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16841
  function shiftHue (h, degrees) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16842
    return (h + degrees)%360;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16843
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16844
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16845
  function HSVtoHex (hsv){
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16846
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16847
    var rgb = HSVtoRGB(hsv);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16848
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16849
    function componentToHex(c) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16850
        var hex = c.toString(16);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16851
        return hex.length == 1 ? "0" + hex : hex;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16852
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16853
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16854
    var hex = "#" + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16855
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16856
    return hex;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16857
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16858
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16859
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16860
  function defineColor (name, hueRange, lowerBounds) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16861
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16862
    var sMin = lowerBounds[0][0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16863
        sMax = lowerBounds[lowerBounds.length - 1][0],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16864
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16865
        bMin = lowerBounds[lowerBounds.length - 1][1],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16866
        bMax = lowerBounds[0][1];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16867
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16868
    colorDictionary[name] = {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16869
      hueRange: hueRange,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16870
      lowerBounds: lowerBounds,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16871
      saturationRange: [sMin, sMax],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16872
      brightnessRange: [bMin, bMax]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16873
    };
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16874
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16875
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16876
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16877
  function loadColorBounds () {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16878
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16879
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16880
      'monochrome',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16881
      null,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16882
      [[0,0],[100,0]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16883
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16884
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16885
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16886
      'red',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16887
      [-26,18],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16888
      [[20,100],[30,92],[40,89],[50,85],[60,78],[70,70],[80,60],[90,55],[100,50]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16889
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16890
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16891
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16892
      'orange',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16893
      [19,46],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16894
      [[20,100],[30,93],[40,88],[50,86],[60,85],[70,70],[100,70]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16895
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16896
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16897
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16898
      'yellow',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16899
      [47,62],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16900
      [[25,100],[40,94],[50,89],[60,86],[70,84],[80,82],[90,80],[100,75]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16901
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16902
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16903
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16904
      'green',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16905
      [63,158],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16906
      [[30,100],[40,90],[50,85],[60,81],[70,74],[80,64],[90,50],[100,40]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16907
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16908
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16909
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16910
      'blue',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16911
      [159, 257],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16912
      [[20,100],[30,86],[40,80],[50,74],[60,60],[70,52],[80,44],[90,39],[100,35]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16913
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16914
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16915
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16916
      'purple',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16917
      [258, 282],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16918
      [[20,100],[30,87],[40,79],[50,70],[60,65],[70,59],[80,52],[90,45],[100,42]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16919
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16920
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16921
    defineColor(
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16922
      'pink',
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16923
      [283, 334],
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16924
      [[20,100],[30,90],[40,86],[60,84],[80,80],[90,75],[100,73]]
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16925
    );
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16926
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16927
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16928
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16929
  function HSVtoRGB (hsv) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16930
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16931
    // this doesn't work for the values of 0 and 360
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16932
    // here's the hacky fix
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16933
    var h = hsv[0];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16934
    if (h === 0) {h = 1}
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16935
    if (h === 360) {h = 359}
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16936
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16937
    // Rebase the h,s,v values
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16938
    h = h/360;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16939
    var s = hsv[1]/100,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16940
        v = hsv[2]/100;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16941
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16942
    var h_i = Math.floor(h*6),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16943
      f = h * 6 - h_i,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16944
      p = v * (1 - s),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16945
      q = v * (1 - f*s),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16946
      t = v * (1 - (1 - f)*s),
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16947
      r = 256,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16948
      g = 256,
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16949
      b = 256;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16950
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16951
    switch(h_i) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16952
      case 0: r = v, g = t, b = p;  break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16953
      case 1: r = q, g = v, b = p;  break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16954
      case 2: r = p, g = v, b = t;  break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16955
      case 3: r = p, g = q, b = v;  break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16956
      case 4: r = t, g = p, b = v;  break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16957
      case 5: r = v, g = p, b = q;  break;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16958
    }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16959
    var result = [Math.floor(r*255), Math.floor(g*255), Math.floor(b*255)];
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16960
    return result;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16961
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16962
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16963
  function colorString (prefix, values) {
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16964
    return prefix + '(' + values.join(', ') + ')';
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16965
  }
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16966
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16967
  return randomColor;
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16968
}));
082b64a5c699 add vizualizations to server
ymh <ymh.work@gmail.com>
parents:
diff changeset
 16969
},{}]},{},[])
130
0a2b4991d48c publish new version to server
ymh <ymh.work@gmail.com>
parents: 108
diff changeset
 16970
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvbGliL2xvZGFzaC9kaXN0L2xvZGFzaC5qcyIsImFwcC9saWIvbW9tZW50L21pbi9tb21lbnQtd2l0aC1sb2NhbGVzLmpzIiwiLi9hcHAvbGliL3BpeGkvYmluL3BpeGkuanMiLCIuL2FwcC9saWIvcmFuZG9tQ29sb3IvcmFuZG9tQ29sb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoa1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyoqXG4gKiBAbGljZW5zZVxuICogTG8tRGFzaCAyLjQuMSAoQ3VzdG9tIEJ1aWxkKSA8aHR0cDovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kZXJuIC1vIC4vZGlzdC9sb2Rhc2guanNgXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDEzIFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjUuMiA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTMgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cDovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUgRVM1IGVudmlyb25tZW50cyAqL1xuICB2YXIgdW5kZWZpbmVkO1xuXG4gIC8qKiBVc2VkIHRvIHBvb2wgYXJyYXlzIGFuZCBvYmplY3RzIHVzZWQgaW50ZXJuYWxseSAqL1xuICB2YXIgYXJyYXlQb29sID0gW10sXG4gICAgICBvYmplY3RQb29sID0gW107XG5cbiAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcyAqL1xuICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAvKiogVXNlZCB0byBwcmVmaXgga2V5cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBgX19wcm90b19fYCBhbmQgcHJvcGVydGllcyBvbiBgT2JqZWN0LnByb3RvdHlwZWAgKi9cbiAgdmFyIGtleVByZWZpeCA9ICtuZXcgRGF0ZSArICcnO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzaXplIHdoZW4gb3B0aW1pemF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgbGFyZ2UgYXJyYXlzICovXG4gIHZhciBsYXJnZUFycmF5U2l6ZSA9IDc1O1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBtYXggc2l6ZSBvZiB0aGUgYGFycmF5UG9vbGAgYW5kIGBvYmplY3RQb29sYCAqL1xuICB2YXIgbWF4UG9vbFNpemUgPSA0MDtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYW5kIHRlc3Qgd2hpdGVzcGFjZSAqL1xuICB2YXIgd2hpdGVzcGFjZSA9IChcbiAgICAvLyB3aGl0ZXNwYWNlXG4gICAgJyBcXHRcXHgwQlxcZlxceEEwXFx1ZmVmZicgK1xuXG4gICAgLy8gbGluZSB0ZXJtaW5hdG9yc1xuICAgICdcXG5cXHJcXHUyMDI4XFx1MjAyOScgK1xuXG4gICAgLy8gdW5pY29kZSBjYXRlZ29yeSBcIlpzXCIgc3BhY2Ugc2VwYXJhdG9yc1xuICAgICdcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwJ1xuICApO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UgKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBFUzYgdGVtcGxhdGUgZGVsaW1pdGVyc1xuICAgKiBodHRwOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1saXRlcmFscy1zdHJpbmctbGl0ZXJhbHNcbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggcmVnZXhwIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3RlZCBuYW1lZCBmdW5jdGlvbnMgKi9cbiAgdmFyIHJlRnVuY05hbWUgPSAvXlxccypmdW5jdGlvblsgXFxuXFxyXFx0XStcXHcvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIFwiaW50ZXJwb2xhdGVcIiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzICovXG4gIHZhciByZUludGVycG9sYXRlID0gLzwlPShbXFxzXFxTXSs/KSU+L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCB6ZXJvcyB0byBiZSByZW1vdmVkICovXG4gIHZhciByZUxlYWRpbmdTcGFjZXNBbmRaZXJvcyA9IFJlZ0V4cCgnXlsnICsgd2hpdGVzcGFjZSArICddKjArKD89LiQpJyk7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzICovXG4gIHZhciByZU5vTWF0Y2ggPSAvKCReKS87XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGZ1bmN0aW9ucyBjb250YWluaW5nIGEgYHRoaXNgIHJlZmVyZW5jZSAqL1xuICB2YXIgcmVUaGlzID0gL1xcYnRoaXNcXGIvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscyAqL1xuICB2YXIgcmVVbmVzY2FwZWRTdHJpbmcgPSAvWydcXG5cXHJcXHRcXHUyMDI4XFx1MjAyOVxcXFxdL2c7XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzICovXG4gIHZhciBjb250ZXh0UHJvcHMgPSBbXG4gICAgJ0FycmF5JywgJ0Jvb2xlYW4nLCAnRGF0ZScsICdGdW5jdGlvbicsICdNYXRoJywgJ051bWJlcicsICdPYmplY3QnLFxuICAgICdSZWdFeHAnLCAnU3RyaW5nJywgJ18nLCAnYXR0YWNoRXZlbnQnLCAnY2xlYXJUaW1lb3V0JywgJ2lzRmluaXRlJywgJ2lzTmFOJyxcbiAgICAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5ICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAwO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgc2hvcnRjdXRzICovXG4gIHZhciBhcmdzQ2xhc3MgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5Q2xhc3MgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYm9vbENsYXNzID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgICAgZGF0ZUNsYXNzID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgICAgZnVuY0NsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICAgIG51bWJlckNsYXNzID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBvYmplY3RDbGFzcyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgICAgcmVnZXhwQ2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICAgIHN0cmluZ0NsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgb2JqZWN0IGNsYXNzaWZpY2F0aW9ucyB0aGF0IGBfLmNsb25lYCBzdXBwb3J0cyAqL1xuICB2YXIgY2xvbmVhYmxlQ2xhc3NlcyA9IHt9O1xuICBjbG9uZWFibGVDbGFzc2VzW2Z1bmNDbGFzc10gPSBmYWxzZTtcbiAgY2xvbmVhYmxlQ2xhc3Nlc1thcmdzQ2xhc3NdID0gY2xvbmVhYmxlQ2xhc3Nlc1thcnJheUNsYXNzXSA9XG4gIGNsb25lYWJsZUNsYXNzZXNbYm9vbENsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbZGF0ZUNsYXNzXSA9XG4gIGNsb25lYWJsZUNsYXNzZXNbbnVtYmVyQ2xhc3NdID0gY2xvbmVhYmxlQ2xhc3Nlc1tvYmplY3RDbGFzc10gPVxuICBjbG9uZWFibGVDbGFzc2VzW3JlZ2V4cENsYXNzXSA9IGNsb25lYWJsZUNsYXNzZXNbc3RyaW5nQ2xhc3NdID0gdHJ1ZTtcblxuICAvKiogVXNlZCBhcyBhbiBpbnRlcm5hbCBgXy5kZWJvdW5jZWAgb3B0aW9ucyBvYmplY3QgKi9cbiAgdmFyIGRlYm91bmNlT3B0aW9ucyA9IHtcbiAgICAnbGVhZGluZyc6IGZhbHNlLFxuICAgICdtYXhXYWl0JzogMCxcbiAgICAndHJhaWxpbmcnOiBmYWxzZVxuICB9O1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBgX19iaW5kRGF0YV9fYCAqL1xuICB2YXIgZGVzY3JpcHRvciA9IHtcbiAgICAnY29uZmlndXJhYmxlJzogZmFsc2UsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBudWxsLFxuICAgICd3cml0YWJsZSc6IGZhbHNlXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHZhbHVlcyBhcmUgb2YgdGhlIGxhbmd1YWdlIHR5cGUgT2JqZWN0ICovXG4gIHZhciBvYmplY3RUeXBlcyA9IHtcbiAgICAnYm9vbGVhbic6IGZhbHNlLFxuICAgICdmdW5jdGlvbic6IHRydWUsXG4gICAgJ29iamVjdCc6IHRydWUsXG4gICAgJ251bWJlcic6IGZhbHNlLFxuICAgICdzdHJpbmcnOiBmYWxzZSxcbiAgICAndW5kZWZpbmVkJzogZmFsc2VcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscyAqL1xuICB2YXIgc3RyaW5nRXNjYXBlcyA9IHtcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICBcIidcIjogXCInXCIsXG4gICAgJ1xcbic6ICduJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXHQnOiAndCcsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0ICovXG4gIHZhciByb290ID0gKG9iamVjdFR5cGVzW3R5cGVvZiB3aW5kb3ddICYmIHdpbmRvdykgfHwgdGhpcztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IG9iamVjdFR5cGVzW3R5cGVvZiBleHBvcnRzXSAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgICovXG4gIHZhciBmcmVlTW9kdWxlID0gb2JqZWN0VHlwZXNbdHlwZW9mIG1vZHVsZV0gJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4gIC8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AgKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHMgJiYgZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcyBvciBCcm93c2VyaWZpZWQgY29kZSBhbmQgdXNlIGl0IGFzIGByb290YCAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IG9iamVjdFR5cGVzW3R5cGVvZiBnbG9iYWxdICYmIGdsb2JhbDtcbiAgaWYgKGZyZWVHbG9iYWwgJiYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsKSkge1xuICAgIHJvb3QgPSBmcmVlR2xvYmFsO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYmluYXJ5IHNlYXJjaGVzXG4gICAqIG9yIGBmcm9tSW5kZXhgIGNvbnN0cmFpbnRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IChmcm9tSW5kZXggfHwgMCkgLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogQW4gaW1wbGVtZW50YXRpb24gb2YgYF8uY29udGFpbnNgIGZvciBjYWNoZSBvYmplY3RzIHRoYXQgbWltaWNzIHRoZSByZXR1cm5cbiAgICogc2lnbmF0dXJlIG9mIGBfLmluZGV4T2ZgIGJ5IHJldHVybmluZyBgMGAgaWYgdGhlIHZhbHVlIGlzIGZvdW5kLCBlbHNlIGAtMWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYDBgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSW5kZXhPZihjYWNoZSwgdmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICBjYWNoZSA9IGNhY2hlLmNhY2hlO1xuXG4gICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjYWNoZVt2YWx1ZV0gPyAwIDogLTE7XG4gICAgfVxuICAgIGlmICh0eXBlICE9ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHtcbiAgICAgIHR5cGUgPSAnb2JqZWN0JztcbiAgICB9XG4gICAgdmFyIGtleSA9IHR5cGUgPT0gJ251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZpeCArIHZhbHVlO1xuICAgIGNhY2hlID0gKGNhY2hlID0gY2FjaGVbdHlwZV0pICYmIGNhY2hlW2tleV07XG5cbiAgICByZXR1cm4gdHlwZSA9PSAnb2JqZWN0J1xuICAgICAgPyAoY2FjaGUgJiYgYmFzZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA+IC0xID8gMCA6IC0xKVxuICAgICAgOiAoY2FjaGUgPyAwIDogLTEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBnaXZlbiB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBvYmplY3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgY2FjaGUuXG4gICAqL1xuICBmdW5jdGlvbiBjYWNoZVB1c2godmFsdWUpIHtcbiAgICB2YXIgY2FjaGUgPSB0aGlzLmNhY2hlLFxuICAgICAgICB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gICAgaWYgKHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgIGNhY2hlW3ZhbHVlXSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlICE9ICdudW1iZXInICYmIHR5cGUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdvYmplY3QnO1xuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHR5cGUgPT0gJ251bWJlcicgPyB2YWx1ZSA6IGtleVByZWZpeCArIHZhbHVlLFxuICAgICAgICAgIHR5cGVDYWNoZSA9IGNhY2hlW3R5cGVdIHx8IChjYWNoZVt0eXBlXSA9IHt9KTtcblxuICAgICAgaWYgKHR5cGUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgKHR5cGVDYWNoZVtrZXldIHx8ICh0eXBlQ2FjaGVba2V5XSA9IFtdKSkucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlQ2FjaGVba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8ubWF4YCBhbmQgYF8ubWluYCBhcyB0aGUgZGVmYXVsdCBjYWxsYmFjayB3aGVuIGEgZ2l2ZW5cbiAgICogY29sbGVjdGlvbiBpcyBhIHN0cmluZyB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBjaGFyYWN0ZXIgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29kZSB1bml0IG9mIGdpdmVuIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJBdENhbGxiYWNrKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmNoYXJDb2RlQXQoMCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgc29ydEJ5YCB0byBjb21wYXJlIHRyYW5zZm9ybWVkIGBjb2xsZWN0aW9uYCBlbGVtZW50cywgc3RhYmxlIHNvcnRpbmdcbiAgICogdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gY29tcGFyZSB0byBgYmAuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29tcGFyZSB0byBgYWAuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIG9mIGAxYCBvciBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyhhLCBiKSB7XG4gICAgdmFyIGFjID0gYS5jcml0ZXJpYSxcbiAgICAgICAgYmMgPSBiLmNyaXRlcmlhLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhYy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYWNbaW5kZXhdLFxuICAgICAgICAgIG90aGVyID0gYmNbaW5kZXhdO1xuXG4gICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+IG90aGVyIHx8IHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IG90aGVyIHx8IHR5cGVvZiBvdGhlciA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGZvclxuICAgIC8vIGBhYCBhbmQgYGJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAgIC8vXG4gICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAvLyBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTBcbiAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNhY2hlIG9iamVjdCB0byBvcHRpbWl6ZSBsaW5lYXIgc2VhcmNoZXMgb2YgbGFyZ2UgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAqIEByZXR1cm5zIHtudWxsfE9iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgb2JqZWN0IG9yIGBudWxsYCBpZiBjYWNoaW5nIHNob3VsZCBub3QgYmUgdXNlZC5cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUNhY2hlKGFycmF5KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSBhcnJheVswXSxcbiAgICAgICAgbWlkID0gYXJyYXlbKGxlbmd0aCAvIDIpIHwgMF0sXG4gICAgICAgIGxhc3QgPSBhcnJheVtsZW5ndGggLSAxXTtcblxuICAgIGlmIChmaXJzdCAmJiB0eXBlb2YgZmlyc3QgPT0gJ29iamVjdCcgJiZcbiAgICAgICAgbWlkICYmIHR5cGVvZiBtaWQgPT0gJ29iamVjdCcgJiYgbGFzdCAmJiB0eXBlb2YgbGFzdCA9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBnZXRPYmplY3QoKTtcbiAgICBjYWNoZVsnZmFsc2UnXSA9IGNhY2hlWydudWxsJ10gPSBjYWNoZVsndHJ1ZSddID0gY2FjaGVbJ3VuZGVmaW5lZCddID0gZmFsc2U7XG5cbiAgICB2YXIgcmVzdWx0ID0gZ2V0T2JqZWN0KCk7XG4gICAgcmVzdWx0LmFycmF5ID0gYXJyYXk7XG4gICAgcmVzdWx0LmNhY2hlID0gY2FjaGU7XG4gICAgcmVzdWx0LnB1c2ggPSBjYWNoZVB1c2g7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaW5kZXhdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGB0ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZFxuICAgKiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIobWF0Y2gpIHtcbiAgICByZXR1cm4gJ1xcXFwnICsgc3RyaW5nRXNjYXBlc1ttYXRjaF07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBhcnJheSBmcm9tIHRoZSBhcnJheSBwb29sIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIHRoZSBwb29sIGlzIGVtcHR5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBmcm9tIHRoZSBwb29sLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXJyYXkoKSB7XG4gICAgcmV0dXJuIGFycmF5UG9vbC5wb3AoKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9iamVjdCBmcm9tIHRoZSBvYmplY3QgcG9vbCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiB0aGUgcG9vbCBpcyBlbXB0eS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIG9iamVjdCBmcm9tIHRoZSBwb29sLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T2JqZWN0KCkge1xuICAgIHJldHVybiBvYmplY3RQb29sLnBvcCgpIHx8IHtcbiAgICAgICdhcnJheSc6IG51bGwsXG4gICAgICAnY2FjaGUnOiBudWxsLFxuICAgICAgJ2NyaXRlcmlhJzogbnVsbCxcbiAgICAgICdmYWxzZSc6IGZhbHNlLFxuICAgICAgJ2luZGV4JzogMCxcbiAgICAgICdudWxsJzogZmFsc2UsXG4gICAgICAnbnVtYmVyJzogbnVsbCxcbiAgICAgICdvYmplY3QnOiBudWxsLFxuICAgICAgJ3B1c2gnOiBudWxsLFxuICAgICAgJ3N0cmluZyc6IG51bGwsXG4gICAgICAndHJ1ZSc6IGZhbHNlLFxuICAgICAgJ3VuZGVmaW5lZCc6IGZhbHNlLFxuICAgICAgJ3ZhbHVlJzogbnVsbFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIGdpdmVuIGFycmF5IGJhY2sgdG8gdGhlIGFycmF5IHBvb2wuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIHJlbGVhc2UuXG4gICAqL1xuICBmdW5jdGlvbiByZWxlYXNlQXJyYXkoYXJyYXkpIHtcbiAgICBhcnJheS5sZW5ndGggPSAwO1xuICAgIGlmIChhcnJheVBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgIGFycmF5UG9vbC5wdXNoKGFycmF5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIGdpdmVuIG9iamVjdCBiYWNrIHRvIHRoZSBvYmplY3QgcG9vbC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcmVsZWFzZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlbGVhc2VPYmplY3Qob2JqZWN0KSB7XG4gICAgdmFyIGNhY2hlID0gb2JqZWN0LmNhY2hlO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgcmVsZWFzZU9iamVjdChjYWNoZSk7XG4gICAgfVxuICAgIG9iamVjdC5hcnJheSA9IG9iamVjdC5jYWNoZSA9IG9iamVjdC5jcml0ZXJpYSA9IG9iamVjdC5vYmplY3QgPSBvYmplY3QubnVtYmVyID0gb2JqZWN0LnN0cmluZyA9IG9iamVjdC52YWx1ZSA9IG51bGw7XG4gICAgaWYgKG9iamVjdFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgIG9iamVjdFBvb2wucHVzaChvYmplY3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbGljZXMgdGhlIGBjb2xsZWN0aW9uYCBmcm9tIHRoZSBgc3RhcnRgIGluZGV4IHVwIHRvLCBidXQgbm90IGluY2x1ZGluZyxcbiAgICogdGhlIGBlbmRgIGluZGV4LlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBgQXJyYXkjc2xpY2VgIHRvIHN1cHBvcnQgbm9kZSBsaXN0c1xuICAgKiBpbiBJRSA8IDkgYW5kIHRvIGVuc3VyZSBkZW5zZSBhcnJheXMgYXJlIHJldHVybmVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2xpY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgaW5kZXguXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBpbmRleC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgIHN0YXJ0IHx8IChzdGFydCA9IDApO1xuICAgIGlmICh0eXBlb2YgZW5kID09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlbmQgPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG4gICAgfVxuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCB8fCAwLFxuICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGggPCAwID8gMCA6IGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbiB1c2luZyB0aGUgZ2l2ZW4gY29udGV4dCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQGNhdGVnb3J5IFV0aWxpdGllc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpIHtcbiAgICAvLyBBdm9pZCBpc3N1ZXMgd2l0aCBzb21lIEVTMyBlbnZpcm9ubWVudHMgdGhhdCBhdHRlbXB0IHRvIHVzZSB2YWx1ZXMsIG5hbWVkXG4gICAgLy8gYWZ0ZXIgYnVpbHQtaW4gY29uc3RydWN0b3JzIGxpa2UgYE9iamVjdGAsIGZvciB0aGUgY3JlYXRpb24gb2YgbGl0ZXJhbHMuXG4gICAgLy8gRVM1IGNsZWFycyB0aGlzIHVwIGJ5IHN0YXRpbmcgdGhhdCBsaXRlcmFscyBtdXN0IHVzZSBidWlsdC1pbiBjb25zdHJ1Y3RvcnMuXG4gICAgLy8gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTEuMS41LlxuICAgIGNvbnRleHQgPSBjb250ZXh0ID8gXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSkgOiByb290O1xuXG4gICAgLyoqIE5hdGl2ZSBjb25zdHJ1Y3RvciByZWZlcmVuY2VzICovXG4gICAgdmFyIEFycmF5ID0gY29udGV4dC5BcnJheSxcbiAgICAgICAgQm9vbGVhbiA9IGNvbnRleHQuQm9vbGVhbixcbiAgICAgICAgRGF0ZSA9IGNvbnRleHQuRGF0ZSxcbiAgICAgICAgRnVuY3Rpb24gPSBjb250ZXh0LkZ1bmN0aW9uLFxuICAgICAgICBNYXRoID0gY29udGV4dC5NYXRoLFxuICAgICAgICBOdW1iZXIgPSBjb250ZXh0Lk51bWJlcixcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBgQXJyYXlgIG1ldGhvZCByZWZlcmVuY2VzLlxuICAgICAqXG4gICAgICogTm9ybWFsbHkgYEFycmF5LnByb3RvdHlwZWAgd291bGQgc3VmZmljZSwgaG93ZXZlciwgdXNpbmcgYW4gYXJyYXkgbGl0ZXJhbFxuICAgICAqIGF2b2lkcyBpc3N1ZXMgaW4gTmFyd2hhbC5cbiAgICAgKi9cbiAgICB2YXIgYXJyYXlSZWYgPSBbXTtcblxuICAgIC8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgKi9cbiAgICB2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgbm9Db25mbGljdGAgKi9cbiAgICB2YXIgb2xkRGFzaCA9IGNvbnRleHQuXztcblxuICAgIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGludGVybmFsIFtbQ2xhc3NdXSBvZiB2YWx1ZXMgKi9cbiAgICB2YXIgdG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUgKi9cbiAgICB2YXIgcmVOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIFN0cmluZyh0b1N0cmluZylcbiAgICAgICAgLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJylcbiAgICAgICAgLnJlcGxhY2UoL3RvU3RyaW5nfCBmb3IgW15cXF1dKy9nLCAnLio/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIE5hdGl2ZSBtZXRob2Qgc2hvcnRjdXRzICovXG4gICAgdmFyIGNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIGNsZWFyVGltZW91dCA9IGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBmbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIGZuVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgICAgIGdldFByb3RvdHlwZU9mID0gaXNOYXRpdmUoZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YpICYmIGdldFByb3RvdHlwZU9mLFxuICAgICAgICBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5LFxuICAgICAgICBwdXNoID0gYXJyYXlSZWYucHVzaCxcbiAgICAgICAgc2V0VGltZW91dCA9IGNvbnRleHQuc2V0VGltZW91dCxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlSZWYuc3BsaWNlLFxuICAgICAgICB1bnNoaWZ0ID0gYXJyYXlSZWYudW5zaGlmdDtcblxuICAgIC8qKiBVc2VkIHRvIHNldCBtZXRhIGRhdGEgb24gZnVuY3Rpb25zICovXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgLy8gSUUgOCBvbmx5IGFjY2VwdHMgRE9NIGVsZW1lbnRzXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbyA9IHt9LFxuICAgICAgICAgICAgZnVuYyA9IGlzTmF0aXZlKGZ1bmMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkpICYmIGZ1bmMsXG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jKG8sIG8sIG8pICYmIGZ1bmM7XG4gICAgICB9IGNhdGNoKGUpIHsgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KCkpO1xuXG4gICAgLyogTmF0aXZlIG1ldGhvZCBzaG9ydGN1dHMgZm9yIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMgKi9cbiAgICB2YXIgbmF0aXZlQ3JlYXRlID0gaXNOYXRpdmUobmF0aXZlQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSkgJiYgbmF0aXZlQ3JlYXRlLFxuICAgICAgICBuYXRpdmVJc0FycmF5ID0gaXNOYXRpdmUobmF0aXZlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkpICYmIG5hdGl2ZUlzQXJyYXksXG4gICAgICAgIG5hdGl2ZUlzRmluaXRlID0gY29udGV4dC5pc0Zpbml0ZSxcbiAgICAgICAgbmF0aXZlSXNOYU4gPSBjb250ZXh0LmlzTmFOLFxuICAgICAgICBuYXRpdmVLZXlzID0gaXNOYXRpdmUobmF0aXZlS2V5cyA9IE9iamVjdC5rZXlzKSAmJiBuYXRpdmVLZXlzLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZVBhcnNlSW50ID0gY29udGV4dC5wYXJzZUludCxcbiAgICAgICAgbmF0aXZlUmFuZG9tID0gTWF0aC5yYW5kb207XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgYSBidWlsdC1pbiBjb25zdHJ1Y3RvciBieSBbW0NsYXNzXV0gKi9cbiAgICB2YXIgY3RvckJ5Q2xhc3MgPSB7fTtcbiAgICBjdG9yQnlDbGFzc1thcnJheUNsYXNzXSA9IEFycmF5O1xuICAgIGN0b3JCeUNsYXNzW2Jvb2xDbGFzc10gPSBCb29sZWFuO1xuICAgIGN0b3JCeUNsYXNzW2RhdGVDbGFzc10gPSBEYXRlO1xuICAgIGN0b3JCeUNsYXNzW2Z1bmNDbGFzc10gPSBGdW5jdGlvbjtcbiAgICBjdG9yQnlDbGFzc1tvYmplY3RDbGFzc10gPSBPYmplY3Q7XG4gICAgY3RvckJ5Q2xhc3NbbnVtYmVyQ2xhc3NdID0gTnVtYmVyO1xuICAgIGN0b3JCeUNsYXNzW3JlZ2V4cENsYXNzXSA9IFJlZ0V4cDtcbiAgICBjdG9yQnlDbGFzc1tzdHJpbmdDbGFzc10gPSBTdHJpbmc7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgdGhlIGdpdmVuIHZhbHVlIHRvIGVuYWJsZSBpbnR1aXRpdmVcbiAgICAgKiBtZXRob2QgY2hhaW5pbmcuXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBMby1EYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGFsc28gaGF2ZSB0aGUgZm9sbG93aW5nIGBBcnJheWAgbWV0aG9kczpcbiAgICAgKiBgY29uY2F0YCwgYGpvaW5gLCBgcG9wYCwgYHB1c2hgLCBgcmV2ZXJzZWAsIGBzaGlmdGAsIGBzbGljZWAsIGBzb3J0YCwgYHNwbGljZWAsXG4gICAgICogYW5kIGB1bnNoaWZ0YFxuICAgICAqXG4gICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYHZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLlxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIGZ1bmN0aW9ucyBhcmU6XG4gICAgICogYGFmdGVyYCwgYGFzc2lnbmAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjaGFpbmAsIGBjb21wYWN0YCxcbiAgICAgKiBgY29tcG9zZWAsIGBjb25jYXRgLCBgY291bnRCeWAsIGBjcmVhdGVgLCBgY3JlYXRlQ2FsbGJhY2tgLCBgY3VycnlgLFxuICAgICAqIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZlcmAsIGBkZWxheWAsIGBkaWZmZXJlbmNlYCwgYGZpbHRlcmAsIGBmbGF0dGVuYCxcbiAgICAgKiBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLCBgZm9ySW5gLCBgZm9ySW5SaWdodGAsIGBmb3JPd25gLCBgZm9yT3duUmlnaHRgLFxuICAgICAqIGBmdW5jdGlvbnNgLCBgZ3JvdXBCeWAsIGBpbmRleEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludmVydGAsXG4gICAgICogYGludm9rZWAsIGBrZXlzYCwgYG1hcGAsIGBtYXhgLCBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtaW5gLCBgb2JqZWN0YCwgYG9taXRgLFxuICAgICAqIGBvbmNlYCwgYHBhaXJzYCwgYHBhcnRpYWxgLCBgcGFydGlhbFJpZ2h0YCwgYHBpY2tgLCBgcGx1Y2tgLCBgcHVsbGAsIGBwdXNoYCxcbiAgICAgKiBgcmFuZ2VgLCBgcmVqZWN0YCwgYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2h1ZmZsZWAsIGBzbGljZWAsIGBzb3J0YCxcbiAgICAgKiBgc29ydEJ5YCwgYHNwbGljZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGltZXNgLCBgdG9BcnJheWAsIGB0cmFuc2Zvcm1gLFxuICAgICAqIGB1bmlvbmAsIGB1bmlxYCwgYHVuc2hpZnRgLCBgdW56aXBgLCBgdmFsdWVzYCwgYHdoZXJlYCwgYHdpdGhvdXRgLCBgd3JhcGAsXG4gICAgICogYW5kIGB6aXBgXG4gICAgICpcbiAgICAgKiBUaGUgbm9uLWNoYWluYWJsZSB3cmFwcGVyIGZ1bmN0aW9ucyBhcmU6XG4gICAgICogYGNsb25lYCwgYGNsb25lRGVlcGAsIGBjb250YWluc2AsIGBlc2NhcGVgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLFxuICAgICAqIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCwgYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgaGFzYCwgYGlkZW50aXR5YCxcbiAgICAgKiBgaW5kZXhPZmAsIGBpc0FyZ3VtZW50c2AsIGBpc0FycmF5YCwgYGlzQm9vbGVhbmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCxcbiAgICAgKiBgaXNFbXB0eWAsIGBpc0VxdWFsYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNOYU5gLCBgaXNOdWxsYCwgYGlzTnVtYmVyYCxcbiAgICAgKiBgaXNPYmplY3RgLCBgaXNQbGFpbk9iamVjdGAsIGBpc1JlZ0V4cGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBqb2luYCxcbiAgICAgKiBgbGFzdEluZGV4T2ZgLCBgbWl4aW5gLCBgbm9Db25mbGljdGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsXG4gICAgICogYHJlZHVjZVJpZ2h0YCwgYHJlc3VsdGAsIGBzaGlmdGAsIGBzaXplYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgcnVuSW5Db250ZXh0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBhbmQgYHZhbHVlYFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgZnVuY3Rpb25zIGBmaXJzdGAgYW5kIGBsYXN0YCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgd2hlbiBgbmAgaXNcbiAgICAgKiBwcm92aWRlZCwgb3RoZXJ3aXNlIHRoZXkgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBFeHBsaWNpdCBjaGFpbmluZyBjYW4gYmUgZW5hYmxlZCBieSB1c2luZyB0aGUgYF8uY2hhaW5gIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIHJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoZnVuY3Rpb24oc3VtLCBudW0pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBudW07XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogLy8gcmV0dXJucyBhIHdyYXBwZWQgdmFsdWVcbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKGZ1bmN0aW9uKG51bSkge1xuICAgICAqICAgcmV0dXJuIG51bSAqIG51bTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgLy8gZG9uJ3Qgd3JhcCBpZiBhbHJlYWR5IHdyYXBwZWQsIGV2ZW4gaWYgd3JhcHBlZCBieSBhIGRpZmZlcmVudCBgbG9kYXNoYCBjb25zdHJ1Y3RvclxuICAgICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgIWlzQXJyYXkodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKVxuICAgICAgID8gdmFsdWVcbiAgICAgICA6IG5ldyBsb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZhc3QgcGF0aCBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjaGFpbkFsbCBBIGZsYWcgdG8gZW5hYmxlIGNoYWluaW5nIGZvciBhbGwgbWV0aG9kc1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2hXcmFwcGVyKHZhbHVlLCBjaGFpbkFsbCkge1xuICAgICAgdGhpcy5fX2NoYWluX18gPSAhIWNoYWluQWxsO1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBlbnN1cmUgYG5ldyBsb2Rhc2hXcmFwcGVyYCBpcyBhbiBpbnN0YW5jZSBvZiBgbG9kYXNoYFxuICAgIGxvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gbG9kYXNoLnByb3RvdHlwZTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB1c2VkIHRvIGZsYWcgZW52aXJvbm1lbnRzIGZlYXR1cmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUgT2JqZWN0XG4gICAgICovXG4gICAgdmFyIHN1cHBvcnQgPSBsb2Rhc2guc3VwcG9ydCA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGlmIGZ1bmN0aW9ucyBjYW4gYmUgZGVjb21waWxlZCBieSBgRnVuY3Rpb24jdG9TdHJpbmdgXG4gICAgICogKGFsbCBidXQgUFMzIGFuZCBvbGRlciBPcGVyYSBtb2JpbGUgYnJvd3NlcnMgJiBhdm9pZGVkIGluIFdpbmRvd3MgOCBhcHBzKS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnRcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICovXG4gICAgc3VwcG9ydC5mdW5jRGVjb21wID0gIWlzTmF0aXZlKGNvbnRleHQuV2luUlRFcnJvcikgJiYgcmVUaGlzLnRlc3QocnVuSW5Db250ZXh0KTtcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBgRnVuY3Rpb24jbmFtZWAgaXMgc3VwcG9ydGVkIChhbGwgYnV0IElFKS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBfLnN1cHBvcnRcbiAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICovXG4gICAgc3VwcG9ydC5mdW5jTmFtZXMgPSB0eXBlb2YgRnVuY3Rpb24ubmFtZSA9PSAnc3RyaW5nJztcblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgTG8tRGFzaCBhcmUgc2ltaWxhciB0byB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikuIENoYW5nZSB0aGUgZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZVxuICAgICAqIGRlbGltaXRlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgKi9cbiAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSBSZWdFeHBcbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IC88JS0oW1xcc1xcU10rPyklPi9nLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIFJlZ0V4cFxuICAgICAgICovXG4gICAgICAnZXZhbHVhdGUnOiAvPCUoW1xcc1xcU10rPyklPi9nLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIFJlZ0V4cFxuICAgICAgICovXG4gICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICovXG4gICAgICAnaW1wb3J0cyc6IHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNcbiAgICAgICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgICdfJzogbG9kYXNoXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYmluZGAgdGhhdCBjcmVhdGVzIHRoZSBib3VuZCBmdW5jdGlvbiBhbmRcbiAgICAgKiBzZXRzIGl0cyBtZXRhIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGJpbmREYXRhIFRoZSBiaW5kIGRhdGEgYXJyYXkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUJpbmQoYmluZERhdGEpIHtcbiAgICAgIHZhciBmdW5jID0gYmluZERhdGFbMF0sXG4gICAgICAgICAgcGFydGlhbEFyZ3MgPSBiaW5kRGF0YVsyXSxcbiAgICAgICAgICB0aGlzQXJnID0gYmluZERhdGFbNF07XG5cbiAgICAgIGZ1bmN0aW9uIGJvdW5kKCkge1xuICAgICAgICAvLyBgRnVuY3Rpb24jYmluZGAgc3BlY1xuICAgICAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjMuNC41XG4gICAgICAgIGlmIChwYXJ0aWFsQXJncykge1xuICAgICAgICAgIC8vIGF2b2lkIGBhcmd1bWVudHNgIG9iamVjdCBkZW9wdGltaXphdGlvbnMgYnkgdXNpbmcgYHNsaWNlYCBpbnN0ZWFkXG4gICAgICAgICAgLy8gb2YgYEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsYCBhbmQgbm90IGFzc2lnbmluZyBgYXJndW1lbnRzYCB0byBhXG4gICAgICAgICAgLy8gdmFyaWFibGUgYXMgYSB0ZXJuYXJ5IGV4cHJlc3Npb25cbiAgICAgICAgICB2YXIgYXJncyA9IHNsaWNlKHBhcnRpYWxBcmdzKTtcbiAgICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWltaWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3JcbiAgICAgICAgLy8gaHR0cDovL2VzNS5naXRodWIuaW8vI3gxMy4yLjJcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgIC8vIGVuc3VyZSBgbmV3IGJvdW5kYCBpcyBhbiBpbnN0YW5jZSBvZiBgZnVuY2BcbiAgICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKGZ1bmMucHJvdG90eXBlKSxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQmluZGluZywgYXJncyB8fCBhcmd1bWVudHMpO1xuICAgICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyB8fCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgc2V0QmluZERhdGEoYm91bmQsIGJpbmREYXRhKTtcbiAgICAgIHJldHVybiBib3VuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgd2l0aG91dCBhcmd1bWVudCBqdWdnbGluZyBvciBzdXBwb3J0XG4gICAgICogZm9yIGB0aGlzQXJnYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXA9ZmFsc2VdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgY2xvbmVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCBjYWxsYmFjaywgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUpO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGluc3BlY3QgW1tDbGFzc11dXG4gICAgICB2YXIgaXNPYmogPSBpc09iamVjdCh2YWx1ZSk7XG4gICAgICBpZiAoaXNPYmopIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgICBpZiAoIWNsb25lYWJsZUNsYXNzZXNbY2xhc3NOYW1lXSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3RvciA9IGN0b3JCeUNsYXNzW2NsYXNzTmFtZV07XG4gICAgICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgICAgY2FzZSBib29sQ2xhc3M6XG4gICAgICAgICAgY2FzZSBkYXRlQ2xhc3M6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGN0b3IoK3ZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgbnVtYmVyQ2xhc3M6XG4gICAgICAgICAgY2FzZSBzdHJpbmdDbGFzczpcbiAgICAgICAgICAgIHJldHVybiBuZXcgY3Rvcih2YWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIHJlZ2V4cENsYXNzOlxuICAgICAgICAgICAgcmVzdWx0ID0gY3Rvcih2YWx1ZS5zb3VyY2UsIHJlRmxhZ3MuZXhlYyh2YWx1ZSkpO1xuICAgICAgICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHZhbHVlLmxhc3RJbmRleDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICAvLyBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGNvcnJlc3BvbmRpbmcgY2xvbmVcbiAgICAgICAgdmFyIGluaXRlZFN0YWNrID0gIXN0YWNrQTtcbiAgICAgICAgc3RhY2tBIHx8IChzdGFja0EgPSBnZXRBcnJheSgpKTtcbiAgICAgICAgc3RhY2tCIHx8IChzdGFja0IgPSBnZXRBcnJheSgpKTtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhY2tCW2xlbmd0aF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGlzQXJyID8gY3Rvcih2YWx1ZS5sZW5ndGgpIDoge307XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gaXNBcnIgPyBzbGljZSh2YWx1ZSkgOiBhc3NpZ24oe30sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vIGFkZCBhcnJheSBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2BcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2luZGV4JykpIHtcbiAgICAgICAgICByZXN1bHQuaW5kZXggPSB2YWx1ZS5pbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2lucHV0JykpIHtcbiAgICAgICAgICByZXN1bHQuaW5wdXQgPSB2YWx1ZS5pbnB1dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZXhpdCBmb3Igc2hhbGxvdyBjbG9uZVxuICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIGFkZCB0aGUgc291cmNlIHZhbHVlIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0c1xuICAgICAgLy8gYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGl0cyBjbG9uZVxuICAgICAgc3RhY2tBLnB1c2godmFsdWUpO1xuICAgICAgc3RhY2tCLnB1c2gocmVzdWx0KTtcblxuICAgICAgLy8gcmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKVxuICAgICAgKGlzQXJyID8gZm9yRWFjaCA6IGZvck93bikodmFsdWUsIGZ1bmN0aW9uKG9ialZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBiYXNlQ2xvbmUob2JqVmFsdWUsIGlzRGVlcCwgY2FsbGJhY2ssIHN0YWNrQSwgc3RhY2tCKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaW5pdGVkU3RhY2spIHtcbiAgICAgICAgcmVsZWFzZUFycmF5KHN0YWNrQSk7XG4gICAgICAgIHJlbGVhc2VBcnJheShzdGFja0IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KHByb3RvdHlwZSkgPyBuYXRpdmVDcmVhdGUocHJvdG90eXBlKSA6IHt9O1xuICAgIH1cbiAgICAvLyBmYWxsYmFjayBmb3IgYnJvd3NlcnMgd2l0aG91dCBgT2JqZWN0LmNyZWF0ZWBcbiAgICBpZiAoIW5hdGl2ZUNyZWF0ZSkge1xuICAgICAgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgZnVuY3Rpb24gT2JqZWN0KCkge31cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvdHlwZSkge1xuICAgICAgICAgIGlmIChpc09iamVjdChwcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBPYmplY3Q7XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBjb250ZXh0Lk9iamVjdCgpO1xuICAgICAgICB9O1xuICAgICAgfSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVDYWxsYmFja2Agd2l0aG91dCBzdXBwb3J0IGZvciBjcmVhdGluZ1xuICAgICAqIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbZnVuYz1pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIGNhbGxiYWNrIGFjY2VwdHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNyZWF0ZUNhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgICB9XG4gICAgICAvLyBleGl0IGVhcmx5IGZvciBubyBgdGhpc0FyZ2Agb3IgYWxyZWFkeSBib3VuZCBieSBgRnVuY3Rpb24jYmluZGBcbiAgICAgIGlmICh0eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyB8fCAhKCdwcm90b3R5cGUnIGluIGZ1bmMpKSB7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgfVxuICAgICAgdmFyIGJpbmREYXRhID0gZnVuYy5fX2JpbmREYXRhX187XG4gICAgICBpZiAodHlwZW9mIGJpbmREYXRhID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChzdXBwb3J0LmZ1bmNOYW1lcykge1xuICAgICAgICAgIGJpbmREYXRhID0gIWZ1bmMubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBiaW5kRGF0YSA9IGJpbmREYXRhIHx8ICFzdXBwb3J0LmZ1bmNEZWNvbXA7XG4gICAgICAgIGlmICghYmluZERhdGEpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gZm5Ub1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICAgIGlmICghc3VwcG9ydC5mdW5jTmFtZXMpIHtcbiAgICAgICAgICAgIGJpbmREYXRhID0gIXJlRnVuY05hbWUudGVzdChzb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWJpbmREYXRhKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgaWYgYGZ1bmNgIHJlZmVyZW5jZXMgdGhlIGB0aGlzYCBrZXl3b3JkIGFuZCBzdG9yZXMgdGhlIHJlc3VsdFxuICAgICAgICAgICAgYmluZERhdGEgPSByZVRoaXMudGVzdChzb3VyY2UpO1xuICAgICAgICAgICAgc2V0QmluZERhdGEoZnVuYywgYmluZERhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZXhpdCBlYXJseSBpZiB0aGVyZSBhcmUgbm8gYHRoaXNgIHJlZmVyZW5jZXMgb3IgYGZ1bmNgIGlzIGJvdW5kXG4gICAgICBpZiAoYmluZERhdGEgPT09IGZhbHNlIHx8IChiaW5kRGF0YSAhPT0gdHJ1ZSAmJiBiaW5kRGF0YVsxXSAmIDEpKSB7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChhcmdDb3VudCkge1xuICAgICAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhLCBiKTtcbiAgICAgICAgfTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICB9O1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiaW5kKGZ1bmMsIHRoaXNBcmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBjcmVhdGVXcmFwcGVyYCB0aGF0IGNyZWF0ZXMgdGhlIHdyYXBwZXIgYW5kXG4gICAgICogc2V0cyBpdHMgbWV0YSBkYXRhLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBiaW5kRGF0YSBUaGUgYmluZCBkYXRhIGFycmF5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDcmVhdGVXcmFwcGVyKGJpbmREYXRhKSB7XG4gICAgICB2YXIgZnVuYyA9IGJpbmREYXRhWzBdLFxuICAgICAgICAgIGJpdG1hc2sgPSBiaW5kRGF0YVsxXSxcbiAgICAgICAgICBwYXJ0aWFsQXJncyA9IGJpbmREYXRhWzJdLFxuICAgICAgICAgIHBhcnRpYWxSaWdodEFyZ3MgPSBiaW5kRGF0YVszXSxcbiAgICAgICAgICB0aGlzQXJnID0gYmluZERhdGFbNF0sXG4gICAgICAgICAgYXJpdHkgPSBiaW5kRGF0YVs1XTtcblxuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiAxLFxuICAgICAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiAyLFxuICAgICAgICAgIGlzQ3VycnkgPSBiaXRtYXNrICYgNCxcbiAgICAgICAgICBpc0N1cnJ5Qm91bmQgPSBiaXRtYXNrICYgOCxcbiAgICAgICAgICBrZXkgPSBmdW5jO1xuXG4gICAgICBmdW5jdGlvbiBib3VuZCgpIHtcbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gaXNCaW5kID8gdGhpc0FyZyA6IHRoaXM7XG4gICAgICAgIGlmIChwYXJ0aWFsQXJncykge1xuICAgICAgICAgIHZhciBhcmdzID0gc2xpY2UocGFydGlhbEFyZ3MpO1xuICAgICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbFJpZ2h0QXJncyB8fCBpc0N1cnJ5KSB7XG4gICAgICAgICAgYXJncyB8fCAoYXJncyA9IHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgIGlmIChwYXJ0aWFsUmlnaHRBcmdzKSB7XG4gICAgICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIHBhcnRpYWxSaWdodEFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNDdXJyeSAmJiBhcmdzLmxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgICBiaXRtYXNrIHw9IDE2ICYgfjMyO1xuICAgICAgICAgICAgcmV0dXJuIGJhc2VDcmVhdGVXcmFwcGVyKFtmdW5jLCAoaXNDdXJyeUJvdW5kID8gYml0bWFzayA6IGJpdG1hc2sgJiB+MyksIGFyZ3MsIG51bGwsIHRoaXNBcmcsIGFyaXR5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFyZ3MgfHwgKGFyZ3MgPSBhcmd1bWVudHMpO1xuICAgICAgICBpZiAoaXNCaW5kS2V5KSB7XG4gICAgICAgICAgZnVuYyA9IHRoaXNCaW5kaW5nW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShmdW5jLnByb3RvdHlwZSk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgc2V0QmluZERhdGEoYm91bmQsIGJpbmREYXRhKTtcbiAgICAgIHJldHVybiBib3VuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kaWZmZXJlbmNlYCB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgYXJyYXlcbiAgICAgKiBvZiB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIGFycmF5IG9mIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgaXNMYXJnZSA9IGxlbmd0aCA+PSBsYXJnZUFycmF5U2l6ZSAmJiBpbmRleE9mID09PSBiYXNlSW5kZXhPZixcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgaWYgKGlzTGFyZ2UpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gY3JlYXRlQ2FjaGUodmFsdWVzKTtcbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgaW5kZXhPZiA9IGNhY2hlSW5kZXhPZjtcbiAgICAgICAgICB2YWx1ZXMgPSBjYWNoZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpc0xhcmdlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGluZGV4T2YodmFsdWVzLCB2YWx1ZSkgPCAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNMYXJnZSkge1xuICAgICAgICByZWxlYXNlT2JqZWN0KHZhbHVlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIG9yIGB0aGlzQXJnYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1NoYWxsb3c9ZmFsc2VdIEEgZmxhZyB0byByZXN0cmljdCBmbGF0dGVuaW5nIHRvIGEgc2luZ2xlIGxldmVsLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0PWZhbHNlXSBBIGZsYWcgdG8gcmVzdHJpY3QgZmxhdHRlbmluZyB0byBhcnJheXMgYW5kIGBhcmd1bWVudHNgIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHN0YXJ0IGZyb20uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgaXNTaGFsbG93LCBpc1N0cmljdCwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgaW5kZXggPSAoZnJvbUluZGV4IHx8IDApIC0gMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT0gJ251bWJlcidcbiAgICAgICAgICAgICYmIChpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKVxuICAgICAgICAgIGlmICghaXNTaGFsbG93KSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VGbGF0dGVuKHZhbHVlLCBpc1NoYWxsb3csIGlzU3RyaWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHZhbEluZGV4ID0gLTEsXG4gICAgICAgICAgICAgIHZhbExlbmd0aCA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgcmVzSW5kZXggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICAgICAgcmVzdWx0Lmxlbmd0aCArPSB2YWxMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsrdmFsSW5kZXggPCB2YWxMZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlW3ZhbEluZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgLCB3aXRob3V0IHN1cHBvcnQgZm9yIGB0aGlzQXJnYCBiaW5kaW5nLFxuICAgICAqIHRoYXQgYWxsb3dzIHBhcnRpYWwgXCJfLndoZXJlXCIgc3R5bGUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gYSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IGIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2lzV2hlcmU9ZmFsc2VdIEEgZmxhZyB0byBpbmRpY2F0ZSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBgYWAgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCPVtdXSBUcmFja3MgdHJhdmVyc2VkIGBiYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWwoYSwgYiwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3RhY2tCKSB7XG4gICAgICAvLyB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2hlbiBjb21wYXJpbmcgb2JqZWN0cywgYGFgIGhhcyBhdCBsZWFzdCB0aGUgcHJvcGVydGllcyBvZiBgYmBcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soYSwgYik7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmV0dXJuICEhcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBleGl0IGVhcmx5IGZvciBpZGVudGljYWwgdmFsdWVzXG4gICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAvLyB0cmVhdCBgKzBgIHZzLiBgLTBgIGFzIG5vdCBlcXVhbFxuICAgICAgICByZXR1cm4gYSAhPT0gMCB8fCAoMSAvIGEgPT0gMSAvIGIpO1xuICAgICAgfVxuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgYSxcbiAgICAgICAgICBvdGhlclR5cGUgPSB0eXBlb2YgYjtcblxuICAgICAgLy8gZXhpdCBlYXJseSBmb3IgdW5saWtlIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICAgIGlmIChhID09PSBhICYmXG4gICAgICAgICAgIShhICYmIG9iamVjdFR5cGVzW3R5cGVdKSAmJlxuICAgICAgICAgICEoYiAmJiBvYmplY3RUeXBlc1tvdGhlclR5cGVdKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBleGl0IGVhcmx5IGZvciBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGF2b2lkaW5nIEVTMydzIEZ1bmN0aW9uI2NhbGwgYmVoYXZpb3JcbiAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMy40LjRcbiAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBhID09PSBiO1xuICAgICAgfVxuICAgICAgLy8gY29tcGFyZSBbW0NsYXNzXV0gbmFtZXNcbiAgICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKGEpLFxuICAgICAgICAgIG90aGVyQ2xhc3MgPSB0b1N0cmluZy5jYWxsKGIpO1xuXG4gICAgICBpZiAoY2xhc3NOYW1lID09IGFyZ3NDbGFzcykge1xuICAgICAgICBjbGFzc05hbWUgPSBvYmplY3RDbGFzcztcbiAgICAgIH1cbiAgICAgIGlmIChvdGhlckNsYXNzID09IGFyZ3NDbGFzcykge1xuICAgICAgICBvdGhlckNsYXNzID0gb2JqZWN0Q2xhc3M7XG4gICAgICB9XG4gICAgICBpZiAoY2xhc3NOYW1lICE9IG90aGVyQ2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSBib29sQ2xhc3M6XG4gICAgICAgIGNhc2UgZGF0ZUNsYXNzOlxuICAgICAgICAgIC8vIGNvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtYmVycywgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzIGFuZCBib29sZWFuc1xuICAgICAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbFxuICAgICAgICAgIHJldHVybiArYSA9PSArYjtcblxuICAgICAgICBjYXNlIG51bWJlckNsYXNzOlxuICAgICAgICAgIC8vIHRyZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbFxuICAgICAgICAgIHJldHVybiAoYSAhPSArYSlcbiAgICAgICAgICAgID8gYiAhPSArYlxuICAgICAgICAgICAgLy8gYnV0IHRyZWF0IGArMGAgdnMuIGAtMGAgYXMgbm90IGVxdWFsXG4gICAgICAgICAgICA6IChhID09IDAgPyAoMSAvIGEgPT0gMSAvIGIpIDogYSA9PSArYik7XG5cbiAgICAgICAgY2FzZSByZWdleHBDbGFzczpcbiAgICAgICAgY2FzZSBzdHJpbmdDbGFzczpcbiAgICAgICAgICAvLyBjb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIChodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEwLjYuNClcbiAgICAgICAgICAvLyB0cmVhdCBzdHJpbmcgcHJpbWl0aXZlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvYmplY3QgaW5zdGFuY2VzIGFzIGVxdWFsXG4gICAgICAgICAgcmV0dXJuIGEgPT0gU3RyaW5nKGIpO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gY2xhc3NOYW1lID09IGFycmF5Q2xhc3M7XG4gICAgICBpZiAoIWlzQXJyKSB7XG4gICAgICAgIC8vIHVud3JhcCBhbnkgYGxvZGFzaGAgd3JhcHBlZCB2YWx1ZXNcbiAgICAgICAgdmFyIGFXcmFwcGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChhLCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIGJXcmFwcGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChiLCAnX193cmFwcGVkX18nKTtcblxuICAgICAgICBpZiAoYVdyYXBwZWQgfHwgYldyYXBwZWQpIHtcbiAgICAgICAgICByZXR1cm4gYmFzZUlzRXF1YWwoYVdyYXBwZWQgPyBhLl9fd3JhcHBlZF9fIDogYSwgYldyYXBwZWQgPyBiLl9fd3JhcHBlZF9fIDogYiwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3RhY2tCKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleGl0IGZvciBmdW5jdGlvbnMgYW5kIERPTSBub2Rlc1xuICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG9iamVjdENsYXNzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluIG9sZGVyIHZlcnNpb25zIG9mIE9wZXJhLCBgYXJndW1lbnRzYCBvYmplY3RzIGhhdmUgYEFycmF5YCBjb25zdHJ1Y3RvcnNcbiAgICAgICAgdmFyIGN0b3JBID0gYS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIGN0b3JCID0gYi5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBub24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbFxuICAgICAgICBpZiAoY3RvckEgIT0gY3RvckIgJiZcbiAgICAgICAgICAgICAgIShpc0Z1bmN0aW9uKGN0b3JBKSAmJiBjdG9yQSBpbnN0YW5jZW9mIGN0b3JBICYmIGlzRnVuY3Rpb24oY3RvckIpICYmIGN0b3JCIGluc3RhbmNlb2YgY3RvckIpICYmXG4gICAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBpbiBiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBhc3N1bWUgY3ljbGljIHN0cnVjdHVyZXMgYXJlIGVxdWFsXG4gICAgICAvLyB0aGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljIHN0cnVjdHVyZXMgaXMgYWRhcHRlZCBmcm9tIEVTIDUuMVxuICAgICAgLy8gc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYCAoaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xMi4zKVxuICAgICAgdmFyIGluaXRlZFN0YWNrID0gIXN0YWNrQTtcbiAgICAgIHN0YWNrQSB8fCAoc3RhY2tBID0gZ2V0QXJyYXkoKSk7XG4gICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IGdldEFycmF5KCkpO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoc3RhY2tBW2xlbmd0aF0gPT0gYSkge1xuICAgICAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXSA9PSBiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgc2l6ZSA9IDA7XG4gICAgICByZXN1bHQgPSB0cnVlO1xuXG4gICAgICAvLyBhZGQgYGFgIGFuZCBgYmAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzXG4gICAgICBzdGFja0EucHVzaChhKTtcbiAgICAgIHN0YWNrQi5wdXNoKGIpO1xuXG4gICAgICAvLyByZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpXG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgLy8gY29tcGFyZSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnlcbiAgICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICAgIHNpemUgPSBiLmxlbmd0aDtcbiAgICAgICAgcmVzdWx0ID0gc2l6ZSA9PSBsZW5ndGg7XG5cbiAgICAgICAgaWYgKHJlc3VsdCB8fCBpc1doZXJlKSB7XG4gICAgICAgICAgLy8gZGVlcCBjb21wYXJlIHRoZSBjb250ZW50cywgaWdub3Jpbmcgbm9uLW51bWVyaWMgcHJvcGVydGllc1xuICAgICAgICAgIHdoaWxlIChzaXplLS0pIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGJbc2l6ZV07XG5cbiAgICAgICAgICAgIGlmIChpc1doZXJlKSB7XG4gICAgICAgICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSBiYXNlSXNFcXVhbChhW2luZGV4XSwgdmFsdWUsIGNhbGxiYWNrLCBpc1doZXJlLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIShyZXN1bHQgPSBiYXNlSXNFcXVhbChhW3NpemVdLCB2YWx1ZSwgY2FsbGJhY2ssIGlzV2hlcmUsIHN0YWNrQSwgc3RhY2tCKSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gZGVlcCBjb21wYXJlIG9iamVjdHMgdXNpbmcgYGZvckluYCwgaW5zdGVhZCBvZiBgZm9yT3duYCwgdG8gYXZvaWQgYE9iamVjdC5rZXlzYFxuICAgICAgICAvLyB3aGljaCwgaW4gdGhpcyBjYXNlLCBpcyBtb3JlIGNvc3RseVxuICAgICAgICBmb3JJbihiLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBiKSB7XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkge1xuICAgICAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgc2l6ZSsrO1xuICAgICAgICAgICAgLy8gZGVlcCBjb21wYXJlIGVhY2ggcHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAgICByZXR1cm4gKHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwoYSwga2V5KSAmJiBiYXNlSXNFcXVhbChhW2tleV0sIHZhbHVlLCBjYWxsYmFjaywgaXNXaGVyZSwgc3RhY2tBLCBzdGFja0IpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgIWlzV2hlcmUpIHtcbiAgICAgICAgICAvLyBlbnN1cmUgYm90aCBvYmplY3RzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHByb3BlcnRpZXNcbiAgICAgICAgICBmb3JJbihhLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBhKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhLCBrZXkpKSB7XG4gICAgICAgICAgICAgIC8vIGBzaXplYCB3aWxsIGJlIGAtMWAgaWYgYGFgIGhhcyBtb3JlIHByb3BlcnRpZXMgdGhhbiBgYmBcbiAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPSAtLXNpemUgPiAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YWNrQS5wb3AoKTtcbiAgICAgIHN0YWNrQi5wb3AoKTtcblxuICAgICAgaWYgKGluaXRlZFN0YWNrKSB7XG4gICAgICAgIHJlbGVhc2VBcnJheShzdGFja0EpO1xuICAgICAgICByZWxlYXNlQXJyYXkoc3RhY2tCKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgYXJndW1lbnQganVnZ2xpbmcgb3Igc3VwcG9ydFxuICAgICAqIGZvciBgdGhpc0FyZ2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdpbmcgcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgdmFsdWVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIGNhbGxiYWNrLCBzdGFja0EsIHN0YWNrQikge1xuICAgICAgKGlzQXJyYXkoc291cmNlKSA/IGZvckVhY2ggOiBmb3JPd24pKHNvdXJjZSwgZnVuY3Rpb24oc291cmNlLCBrZXkpIHtcbiAgICAgICAgdmFyIGZvdW5kLFxuICAgICAgICAgICAgaXNBcnIsXG4gICAgICAgICAgICByZXN1bHQgPSBzb3VyY2UsXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIGlmIChzb3VyY2UgJiYgKChpc0FyciA9IGlzQXJyYXkoc291cmNlKSkgfHwgaXNQbGFpbk9iamVjdChzb3VyY2UpKSkge1xuICAgICAgICAgIC8vIGF2b2lkIG1lcmdpbmcgcHJldmlvdXNseSBtZXJnZWQgY3ljbGljIHNvdXJjZXNcbiAgICAgICAgICB2YXIgc3RhY2tMZW5ndGggPSBzdGFja0EubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzdGFja0xlbmd0aC0tKSB7XG4gICAgICAgICAgICBpZiAoKGZvdW5kID0gc3RhY2tBW3N0YWNrTGVuZ3RoXSA9PSBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gc3RhY2tCW3N0YWNrTGVuZ3RoXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIHZhciBpc1NoYWxsb3c7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUsIHNvdXJjZSk7XG4gICAgICAgICAgICAgIGlmICgoaXNTaGFsbG93ID0gdHlwZW9mIHJlc3VsdCAhPSAndW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1NoYWxsb3cpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBpc0FyclxuICAgICAgICAgICAgICAgID8gKGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSlcbiAgICAgICAgICAgICAgICA6IChpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDoge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIGBzb3VyY2VgIGFuZCBhc3NvY2lhdGVkIGB2YWx1ZWAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzXG4gICAgICAgICAgICBzdGFja0EucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgc3RhY2tCLnB1c2godmFsdWUpO1xuXG4gICAgICAgICAgICAvLyByZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKVxuICAgICAgICAgICAgaWYgKCFpc1NoYWxsb3cpIHtcbiAgICAgICAgICAgICAgYmFzZU1lcmdlKHZhbHVlLCBzb3VyY2UsIGNhbGxiYWNrLCBzdGFja0EsIHN0YWNrQik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2sodmFsdWUsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmRvbWAgd2l0aG91dCBhcmd1bWVudCBqdWdnbGluZyBvciBzdXBwb3J0XG4gICAgICogZm9yIHJldHVybmluZyBmbG9hdGluZy1wb2ludCBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluIFRoZSBtaW5pbXVtIHBvc3NpYmxlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggVGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBhIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShtaW4sIG1heCkge1xuICAgICAgcmV0dXJuIG1pbiArIGZsb29yKG5hdGl2ZVJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrIHNob3J0aGFuZHNcbiAgICAgKiBvciBgdGhpc0FyZ2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTb3J0ZWQ9ZmFsc2VdIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGBhcnJheWAgaXMgc29ydGVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIGR1cGxpY2F0ZS12YWx1ZS1mcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpc1NvcnRlZCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4T2YgPSBnZXRJbmRleE9mKCksXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB2YXIgaXNMYXJnZSA9ICFpc1NvcnRlZCAmJiBsZW5ndGggPj0gbGFyZ2VBcnJheVNpemUgJiYgaW5kZXhPZiA9PT0gYmFzZUluZGV4T2YsXG4gICAgICAgICAgc2VlbiA9IChjYWxsYmFjayB8fCBpc0xhcmdlKSA/IGdldEFycmF5KCkgOiByZXN1bHQ7XG5cbiAgICAgIGlmIChpc0xhcmdlKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGNyZWF0ZUNhY2hlKHNlZW4pO1xuICAgICAgICBpbmRleE9mID0gY2FjaGVJbmRleE9mO1xuICAgICAgICBzZWVuID0gY2FjaGU7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGNhbGxiYWNrID8gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBhcnJheSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoaXNTb3J0ZWRcbiAgICAgICAgICAgICAgPyAhaW5kZXggfHwgc2VlbltzZWVuLmxlbmd0aCAtIDFdICE9PSBjb21wdXRlZFxuICAgICAgICAgICAgICA6IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQpIDwgMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrIHx8IGlzTGFyZ2UpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzTGFyZ2UpIHtcbiAgICAgICAgcmVsZWFzZUFycmF5KHNlZW4uYXJyYXkpO1xuICAgICAgICByZWxlYXNlT2JqZWN0KHNlZW4pO1xuICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykge1xuICAgICAgICByZWxlYXNlQXJyYXkoc2Vlbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFnZ3JlZ2F0ZXMgYSBjb2xsZWN0aW9uLCBjcmVhdGluZyBhbiBvYmplY3QgY29tcG9zZWRcbiAgICAgKiBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBjb2xsZWN0aW9uXG4gICAgICogdGhyb3VnaCBhIGNhbGxiYWNrLiBUaGUgZ2l2ZW4gYHNldHRlcmAgZnVuY3Rpb24gc2V0cyB0aGUga2V5cyBhbmQgdmFsdWVzXG4gICAgICogb2YgdGhlIGNvbXBvc2VkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBzZXR0ZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpO1xuXG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDtcblxuICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pLCBjb2xsZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBjYWxsYmFjayh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYFxuICAgICAqIHdpdGggYW4gb3B0aW9uYWwgYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBtZXRob2QgZmxhZ3MgdG8gY29tcG9zZS5cbiAgICAgKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6XG4gICAgICogIDEgLSBgXy5iaW5kYFxuICAgICAqICAyIC0gYF8uYmluZEtleWBcbiAgICAgKiAgNCAtIGBfLmN1cnJ5YFxuICAgICAqICA4IC0gYF8uY3VycnlgIChib3VuZClcbiAgICAgKiAgMTYgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAzMiAtIGBfLnBhcnRpYWxSaWdodGBcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbEFyZ3NdIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlXG4gICAgICogIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxSaWdodEFyZ3NdIEFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2VcbiAgICAgKiAgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcHBlcihmdW5jLCBiaXRtYXNrLCBwYXJ0aWFsQXJncywgcGFydGlhbFJpZ2h0QXJncywgdGhpc0FyZywgYXJpdHkpIHtcbiAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgMSxcbiAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgMixcbiAgICAgICAgICBpc0N1cnJ5ID0gYml0bWFzayAmIDQsXG4gICAgICAgICAgaXNDdXJyeUJvdW5kID0gYml0bWFzayAmIDgsXG4gICAgICAgICAgaXNQYXJ0aWFsID0gYml0bWFzayAmIDE2LFxuICAgICAgICAgIGlzUGFydGlhbFJpZ2h0ID0gYml0bWFzayAmIDMyO1xuXG4gICAgICBpZiAoIWlzQmluZEtleSAmJiAhaXNGdW5jdGlvbihmdW5jKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGFydGlhbCAmJiAhcGFydGlhbEFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfjE2O1xuICAgICAgICBpc1BhcnRpYWwgPSBwYXJ0aWFsQXJncyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGFydGlhbFJpZ2h0ICYmICFwYXJ0aWFsUmlnaHRBcmdzLmxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4zMjtcbiAgICAgICAgaXNQYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHRBcmdzID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgYmluZERhdGEgPSBmdW5jICYmIGZ1bmMuX19iaW5kRGF0YV9fO1xuICAgICAgaWYgKGJpbmREYXRhICYmIGJpbmREYXRhICE9PSB0cnVlKSB7XG4gICAgICAgIC8vIGNsb25lIGBiaW5kRGF0YWBcbiAgICAgICAgYmluZERhdGEgPSBzbGljZShiaW5kRGF0YSk7XG4gICAgICAgIGlmIChiaW5kRGF0YVsyXSkge1xuICAgICAgICAgIGJpbmREYXRhWzJdID0gc2xpY2UoYmluZERhdGFbMl0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaW5kRGF0YVszXSkge1xuICAgICAgICAgIGJpbmREYXRhWzNdID0gc2xpY2UoYmluZERhdGFbM10pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBgdGhpc0JpbmRpbmdgIGlzIG5vdCBwcmV2aW91c2x5IGJvdW5kXG4gICAgICAgIGlmIChpc0JpbmQgJiYgIShiaW5kRGF0YVsxXSAmIDEpKSB7XG4gICAgICAgICAgYmluZERhdGFbNF0gPSB0aGlzQXJnO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBpZiBwcmV2aW91c2x5IGJvdW5kIGJ1dCBub3QgY3VycmVudGx5IChzdWJzZXF1ZW50IGN1cnJpZWQgZnVuY3Rpb25zKVxuICAgICAgICBpZiAoIWlzQmluZCAmJiBiaW5kRGF0YVsxXSAmIDEpIHtcbiAgICAgICAgICBiaXRtYXNrIHw9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGN1cnJpZWQgYXJpdHkgaWYgbm90IHlldCBzZXRcbiAgICAgICAgaWYgKGlzQ3VycnkgJiYgIShiaW5kRGF0YVsxXSAmIDQpKSB7XG4gICAgICAgICAgYmluZERhdGFbNV0gPSBhcml0eTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcHBlbmQgcGFydGlhbCBsZWZ0IGFyZ3VtZW50c1xuICAgICAgICBpZiAoaXNQYXJ0aWFsKSB7XG4gICAgICAgICAgcHVzaC5hcHBseShiaW5kRGF0YVsyXSB8fCAoYmluZERhdGFbMl0gPSBbXSksIHBhcnRpYWxBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcHBlbmQgcGFydGlhbCByaWdodCBhcmd1bWVudHNcbiAgICAgICAgaWYgKGlzUGFydGlhbFJpZ2h0KSB7XG4gICAgICAgICAgdW5zaGlmdC5hcHBseShiaW5kRGF0YVszXSB8fCAoYmluZERhdGFbM10gPSBbXSksIHBhcnRpYWxSaWdodEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1lcmdlIGZsYWdzXG4gICAgICAgIGJpbmREYXRhWzFdIHw9IGJpdG1hc2s7XG4gICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyLmFwcGx5KG51bGwsIGJpbmREYXRhKTtcbiAgICAgIH1cbiAgICAgIC8vIGZhc3QgcGF0aCBmb3IgYF8uYmluZGBcbiAgICAgIHZhciBjcmVhdGVyID0gKGJpdG1hc2sgPT0gMSB8fCBiaXRtYXNrID09PSAxNykgPyBiYXNlQmluZCA6IGJhc2VDcmVhdGVXcmFwcGVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZXIoW2Z1bmMsIGJpdG1hc2ssIHBhcnRpYWxBcmdzLCBwYXJ0aWFsUmlnaHRBcmdzLCB0aGlzQXJnLCBhcml0eV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYGVzY2FwZWAgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZUh0bWxDaGFyKG1hdGNoKSB7XG4gICAgICByZXR1cm4gaHRtbEVzY2FwZXNbbWF0Y2hdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaW5kZXhPZlwiIGZ1bmN0aW9uLiBJZiB0aGUgYF8uaW5kZXhPZmAgbWV0aG9kIGlzXG4gICAgICogY3VzdG9taXplZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3VzdG9tIG1ldGhvZCwgb3RoZXJ3aXNlIGl0IHJldHVybnNcbiAgICAgKiB0aGUgYGJhc2VJbmRleE9mYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBcImluZGV4T2ZcIiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJbmRleE9mKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXN1bHQgPSBsb2Rhc2guaW5kZXhPZikgPT09IGluZGV4T2YgPyBiYXNlSW5kZXhPZiA6IHJlc3VsdDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgJiYgcmVOYXRpdmUudGVzdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBgdGhpc2AgYmluZGluZyBkYXRhIG9uIGEgZ2l2ZW4gZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHNldCBkYXRhIG9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIFRoZSBkYXRhIGFycmF5IHRvIHNldC5cbiAgICAgKi9cbiAgICB2YXIgc2V0QmluZERhdGEgPSAhZGVmaW5lUHJvcGVydHkgPyBub29wIDogZnVuY3Rpb24oZnVuYywgdmFsdWUpIHtcbiAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGRlZmluZVByb3BlcnR5KGZ1bmMsICdfX2JpbmREYXRhX18nLCBkZXNjcmlwdG9yKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiBgaXNQbGFpbk9iamVjdGAgd2hpY2ggY2hlY2tzIGlmIGEgZ2l2ZW4gdmFsdWVcbiAgICAgKiBpcyBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IsIGFzc3VtaW5nIG9iamVjdHMgY3JlYXRlZFxuICAgICAqIGJ5IHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3RvciBoYXZlIG5vIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYW5kIHRoYXRcbiAgICAgKiB0aGVyZSBhcmUgbm8gYE9iamVjdC5wcm90b3R5cGVgIGV4dGVuc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hpbUlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIHZhciBjdG9yLFxuICAgICAgICAgIHJlc3VsdDtcblxuICAgICAgLy8gYXZvaWQgbm9uIE9iamVjdCBvYmplY3RzLCBgYXJndW1lbnRzYCBvYmplY3RzLCBhbmQgRE9NIGVsZW1lbnRzXG4gICAgICBpZiAoISh2YWx1ZSAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBvYmplY3RDbGFzcykgfHxcbiAgICAgICAgICAoY3RvciA9IHZhbHVlLmNvbnN0cnVjdG9yLCBpc0Z1bmN0aW9uKGN0b3IpICYmICEoY3RvciBpbnN0YW5jZW9mIGN0b3IpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBJbiBtb3N0IGVudmlyb25tZW50cyBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcyBhcmUgaXRlcmF0ZWQgYmVmb3JlXG4gICAgICAvLyBpdHMgaW5oZXJpdGVkIHByb3BlcnRpZXMuIElmIHRoZSBsYXN0IGl0ZXJhdGVkIHByb3BlcnR5IGlzIGFuIG9iamVjdCdzXG4gICAgICAvLyBvd24gcHJvcGVydHkgdGhlbiB0aGVyZSBhcmUgbm8gaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgIGZvckluKHZhbHVlLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHJlc3VsdCA9IGtleTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT0gJ3VuZGVmaW5lZCcgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGB1bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaCBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZUh0bWxDaGFyKG1hdGNoKSB7XG4gICAgICByZXR1cm4gaHRtbFVuZXNjYXBlc1ttYXRjaF07XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy5pc0FyZ3VtZW50cyhhcmd1bWVudHMpOyB9KSgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09ICdudW1iZXInICYmXG4gICAgICAgIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NDbGFzcyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy5pc0FycmF5KGFyZ3VtZW50cyk7IH0pKCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheSA9IG5hdGl2ZUlzQXJyYXkgfHwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PSAnbnVtYmVyJyAmJlxuICAgICAgICB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcnJheUNsYXNzIHx8IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3Qua2V5c2Agd2hpY2ggcHJvZHVjZXMgYW4gYXJyYXkgb2YgdGhlXG4gICAgICogZ2l2ZW4gb2JqZWN0J3Mgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIHZhciBzaGltS2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IG9iamVjdCwgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgaWYgKCEob2JqZWN0VHlwZXNbdHlwZW9mIG9iamVjdF0pKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICBmb3IgKGluZGV4IGluIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaXRlcmFibGUsIGluZGV4KSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNvbXBvc2VkIG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZXlzKHsgJ29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0pO1xuICAgICAqIC8vID0+IFsnb25lJywgJ3R3bycsICd0aHJlZSddIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52aXJvbm1lbnRzKVxuICAgICAqL1xuICAgIHZhciBrZXlzID0gIW5hdGl2ZUtleXMgPyBzaGltS2V5cyA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXM6XG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIGA+YCBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZSBgPmAgYW5kIGAvYFxuICAgICAqIGRvbid0IHJlcXVpcmUgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmcgdW5sZXNzIHRoZXkncmUgcGFydFxuICAgICAqIG9mIGEgdGFnIG9yIGFuIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKiBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcyAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIilcbiAgICAgKi9cbiAgICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgICAnJic6ICcmYW1wOycsXG4gICAgICAnPCc6ICcmbHQ7JyxcbiAgICAgICc+JzogJyZndDsnLFxuICAgICAgJ1wiJzogJyZxdW90OycsXG4gICAgICBcIidcIjogJyYjMzk7J1xuICAgIH07XG5cbiAgICAvKiogVXNlZCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycyAqL1xuICAgIHZhciBodG1sVW5lc2NhcGVzID0gaW52ZXJ0KGh0bWxFc2NhcGVzKTtcblxuICAgIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycyAqL1xuICAgIHZhciByZUVzY2FwZWRIdG1sID0gUmVnRXhwKCcoJyArIGtleXMoaHRtbFVuZXNjYXBlcykuam9pbignfCcpICsgJyknLCAnZycpLFxuICAgICAgICByZVVuZXNjYXBlZEh0bWwgPSBSZWdFeHAoJ1snICsga2V5cyhodG1sRXNjYXBlcykuam9pbignJykgKyAnXScsICdnJyk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0KHMpIHRvIHRoZSBkZXN0aW5hdGlvblxuICAgICAqIG9iamVjdC4gU3Vic2VxdWVudCBzb3VyY2VzIHdpbGwgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzXG4gICAgICogc291cmNlcy4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHByb2R1Y2UgdGhlXG4gICAgICogYXNzaWduZWQgdmFsdWVzLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdHdvXG4gICAgICogYXJndW1lbnRzOyAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmluZyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICduYW1lJzogJ2ZyZWQnIH0sIHsgJ2VtcGxveWVyJzogJ3NsYXRlJyB9KTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnZW1wbG95ZXInOiAnc2xhdGUnIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduLCBmdW5jdGlvbihhLCBiKSB7XG4gICAgICogICByZXR1cm4gdHlwZW9mIGEgPT0gJ3VuZGVmaW5lZCcgPyBiIDogYTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2Jhcm5leScgfTtcbiAgICAgKiBkZWZhdWx0cyhvYmplY3QsIHsgJ25hbWUnOiAnZnJlZCcsICdlbXBsb3llcic6ICdzbGF0ZScgfSk7XG4gICAgICogLy8gPT4geyAnbmFtZSc6ICdiYXJuZXknLCAnZW1wbG95ZXInOiAnc2xhdGUnIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduID0gZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIGd1YXJkKSB7XG4gICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gb2JqZWN0LCByZXN1bHQgPSBpdGVyYWJsZTtcbiAgICAgIGlmICghaXRlcmFibGUpIHJldHVybiByZXN1bHQ7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBhcmdzSW5kZXggPSAwLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSB0eXBlb2YgZ3VhcmQgPT0gJ251bWJlcicgPyAyIDogYXJncy5sZW5ndGg7XG4gICAgICBpZiAoYXJnc0xlbmd0aCA+IDMgJiYgdHlwZW9mIGFyZ3NbYXJnc0xlbmd0aCAtIDJdID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gYmFzZUNyZWF0ZUNhbGxiYWNrKGFyZ3NbLS1hcmdzTGVuZ3RoIC0gMV0sIGFyZ3NbYXJnc0xlbmd0aC0tXSwgMik7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3NMZW5ndGggPiAyICYmIHR5cGVvZiBhcmdzW2FyZ3NMZW5ndGggLSAxXSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnc1stLWFyZ3NMZW5ndGhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICBpdGVyYWJsZSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICYmIG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHtcbiAgICAgICAgdmFyIG93bkluZGV4ID0gLTEsXG4gICAgICAgICAgICBvd25Qcm9wcyA9IG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0gJiYga2V5cyhpdGVyYWJsZSksXG4gICAgICAgICAgICBsZW5ndGggPSBvd25Qcm9wcyA/IG93blByb3BzLmxlbmd0aCA6IDA7XG5cbiAgICAgICAgd2hpbGUgKCsrb3duSW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBpbmRleCA9IG93blByb3BzW293bkluZGV4XTtcbiAgICAgICAgICByZXN1bHRbaW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjayhyZXN1bHRbaW5kZXhdLCBpdGVyYWJsZVtpbmRleF0pIDogaXRlcmFibGVbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB2YWx1ZWAuIElmIGBpc0RlZXBgIGlzIGB0cnVlYCBuZXN0ZWQgb2JqZWN0cyB3aWxsIGFsc29cbiAgICAgKiBiZSBjbG9uZWQsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgYXNzaWduZWQgYnkgcmVmZXJlbmNlLiBJZiBhIGNhbGxiYWNrXG4gICAgICogaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWVzLiBJZiB0aGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgIGNsb25pbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXA9ZmFsc2VdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShjaGFyYWN0ZXJzKTtcbiAgICAgKiBzaGFsbG93WzBdID09PSBjaGFyYWN0ZXJzWzBdO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZShjaGFyYWN0ZXJzLCB0cnVlKTtcbiAgICAgKiBkZWVwWzBdID09PSBjaGFyYWN0ZXJzWzBdO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLm1peGluKHtcbiAgICAgKiAgICdjbG9uZSc6IF8ucGFydGlhbFJpZ2h0KF8uY2xvbmUsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgIHJldHVybiBfLmlzRWxlbWVudCh2YWx1ZSkgPyB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgICAqICAgfSlcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHZhciBjbG9uZSA9IF8uY2xvbmUoZG9jdW1lbnQuYm9keSk7XG4gICAgICogY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlLCBpc0RlZXAsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzIHdpdGhvdXQgdXNpbmcgdGhlaXIgYGluZGV4YFxuICAgICAgLy8gYW5kIGBjb2xsZWN0aW9uYCBhcmd1bWVudHMgZm9yIGBpc0RlZXBgIGFuZCBgY2FsbGJhY2tgXG4gICAgICBpZiAodHlwZW9mIGlzRGVlcCAhPSAnYm9vbGVhbicgJiYgaXNEZWVwICE9IG51bGwpIHtcbiAgICAgICAgdGhpc0FyZyA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayA9IGlzRGVlcDtcbiAgICAgICAgaXNEZWVwID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBpc0RlZXAsIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICYmIGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZVxuICAgICAqIGV4ZWN1dGVkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZXMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogY2xvbmluZyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG9cbiAgICAgKiBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobS4gRnVuY3Rpb25zXG4gICAgICogYW5kIERPTSBub2RlcyBhcmUgKipub3QqKiBjbG9uZWQuIFRoZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhbmRcbiAgICAgKiBvYmplY3RzIGNyZWF0ZWQgYnkgY29uc3RydWN0b3JzIG90aGVyIHRoYW4gYE9iamVjdGAgYXJlIGNsb25lZCB0byBwbGFpbiBgT2JqZWN0YCBvYmplY3RzLlxuICAgICAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9pbmZyYXN0cnVjdHVyZS5odG1sI2ludGVybmFsLXN0cnVjdHVyZWQtY2xvbmluZy1hbGdvcml0aG0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGRlZXAgY2xvbmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKGNoYXJhY3RlcnMpO1xuICAgICAqIGRlZXBbMF0gPT09IGNoYXJhY3RlcnNbMF07XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ25vZGUnOiBlbGVtZW50XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjbG9uZSA9IF8uY2xvbmVEZWVwKHZpZXcsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc0VsZW1lbnQodmFsdWUpID8gdmFsdWUuY2xvbmVOb2RlKHRydWUpIDogdW5kZWZpbmVkO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY2xvbmUubm9kZSA9PSB2aWV3Lm5vZGU7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCB0cnVlLCB0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyAmJiBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4gSWYgYVxuICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgcHJvdmlkZWQgaXRzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYXJlIGFzc2lnbmVkXG4gICAgICogdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHsgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPyBhc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdChzKSB0byB0aGUgZGVzdGluYXRpb25cbiAgICAgKiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gT25jZSBhXG4gICAgICogcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIGRlZmF1bHRzIG9mIHRoZSBzYW1lIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gQWxsb3dzIHdvcmtpbmcgd2l0aCBgXy5yZWR1Y2VgIHdpdGhvdXQgdXNpbmcgaXRzXG4gICAgICogIGBrZXlgIGFuZCBgb2JqZWN0YCBhcmd1bWVudHMgYXMgc291cmNlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2Jhcm5leScgfTtcbiAgICAgKiBfLmRlZmF1bHRzKG9iamVjdCwgeyAnbmFtZSc6ICdmcmVkJywgJ2VtcGxveWVyJzogJ3NsYXRlJyB9KTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2Jhcm5leScsICdlbXBsb3llcic6ICdzbGF0ZScgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBndWFyZCkge1xuICAgICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IG9iamVjdCwgcmVzdWx0ID0gaXRlcmFibGU7XG4gICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgYXJnc0luZGV4ID0gMCxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gdHlwZW9mIGd1YXJkID09ICdudW1iZXInID8gMiA6IGFyZ3MubGVuZ3RoO1xuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICBpdGVyYWJsZSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICYmIG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0pIHtcbiAgICAgICAgdmFyIG93bkluZGV4ID0gLTEsXG4gICAgICAgICAgICBvd25Qcm9wcyA9IG9iamVjdFR5cGVzW3R5cGVvZiBpdGVyYWJsZV0gJiYga2V5cyhpdGVyYWJsZSksXG4gICAgICAgICAgICBsZW5ndGggPSBvd25Qcm9wcyA/IG93blByb3BzLmxlbmd0aCA6IDA7XG5cbiAgICAgICAgd2hpbGUgKCsrb3duSW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBpbmRleCA9IG93blByb3BzW293bkluZGV4XTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdFtpbmRleF0gPT0gJ3VuZGVmaW5lZCcpIHJlc3VsdFtpbmRleF0gPSBpdGVyYWJsZVtpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnQgdGhhdCBwYXNzZXMgdGhlIGNhbGxiYWNrIGNoZWNrLCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlclxuICAgICAqICBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvXG4gICAgICogIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogeyAgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH0sXG4gICAgICogICAnZnJlZCc6IHsgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdibG9ja2VkJzogZmFsc2UgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkoY2hhcmFjdGVycywgZnVuY3Rpb24oY2hyKSB7XG4gICAgICogICByZXR1cm4gY2hyLmFnZSA8IDQwO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52aXJvbm1lbnRzKVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maW5kS2V5KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRLZXkoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG4gICAgICBmb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kS2V5YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYSBgY29sbGVjdGlvbmAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkIFwiXy5wbHVja1wiIHN0eWxlXG4gICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyXG4gICAgICogIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG9cbiAgICAgKiAgY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiB7ICAnYWdlJzogMzYsICdibG9ja2VkJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiB7ICAgICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleShjaGFyYWN0ZXJzLCBmdW5jdGlvbihjaHIpIHtcbiAgICAgKiAgIHJldHVybiBjaHIuYWdlIDwgNDA7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyBgcGViYmxlc2AsIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgYGJhcm5leWBcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmluZExhc3RLZXkoY2hhcmFjdGVycywgeyAnYWdlJzogNDAgfSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRMYXN0S2V5KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgIGZvck93blJpZ2h0KG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwga2V5LCBvYmplY3QpKSB7XG4gICAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCxcbiAgICAgKiBleGVjdXRpbmcgdGhlIGNhbGxiYWNrIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgXG4gICAgICogYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBDYWxsYmFja3MgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkge1xuICAgICAqICAgdGhpcy54ID0gMDtcbiAgICAgKiAgIHRoaXMueSA9IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogU2hhcGUucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICB0aGlzLnggKz0geDtcbiAgICAgKiAgIHRoaXMueSArPSB5O1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZvckluKG5ldyBTaGFwZSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBsb2dzICd4JywgJ3knLCBhbmQgJ21vdmUnIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52aXJvbm1lbnRzKVxuICAgICAqL1xuICAgIHZhciBmb3JJbiA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaW5kZXgsIGl0ZXJhYmxlID0gY29sbGVjdGlvbiwgcmVzdWx0ID0gaXRlcmFibGU7XG4gICAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgaWYgKCFvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdKSByZXR1cm4gcmVzdWx0O1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiB0eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrIDogYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgICAgZm9yIChpbmRleCBpbiBpdGVyYWJsZSkge1xuICAgICAgICAgIGlmIChjYWxsYmFjayhpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSA9PT0gZmFsc2UpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIFNoYXBlLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgdGhpcy54ICs9IHg7XG4gICAgICogICB0aGlzLnkgKz0geTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5mb3JJblJpZ2h0KG5ldyBTaGFwZSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBsb2dzICdtb3ZlJywgJ3knLCBhbmQgJ3gnIGFzc3VtaW5nIGBfLmZvckluIGAgbG9ncyAneCcsICd5JywgYW5kICdtb3ZlJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIHBhaXJzID0gW107XG5cbiAgICAgIGZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICBwYWlycy5wdXNoKGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBwYWlycy5sZW5ndGg7XG4gICAgICBjYWxsYmFjayA9IGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKHBhaXJzW2xlbmd0aC0tXSwgcGFpcnNbbGVuZ3RoXSwgb2JqZWN0KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LCBleGVjdXRpbmcgdGhlIGNhbGxiYWNrXG4gICAgICogZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czsgKHZhbHVlLCBrZXksIG9iamVjdCkuIENhbGxiYWNrcyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnlcbiAgICAgKiBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mb3JPd24oeyAnMCc6ICd6ZXJvJywgJzEnOiAnb25lJywgJ2xlbmd0aCc6IDIgfSwgZnVuY3Rpb24obnVtLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gbG9ncyAnMCcsICcxJywgYW5kICdsZW5ndGgnIChwcm9wZXJ0eSBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCBhY3Jvc3MgZW52aXJvbm1lbnRzKVxuICAgICAqL1xuICAgIHZhciBmb3JPd24gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIGluZGV4LCBpdGVyYWJsZSA9IGNvbGxlY3Rpb24sIHJlc3VsdCA9IGl0ZXJhYmxlO1xuICAgICAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGlmICghb2JqZWN0VHlwZXNbdHlwZW9mIGl0ZXJhYmxlXSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFjayA6IGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG4gICAgICAgIHZhciBvd25JbmRleCA9IC0xLFxuICAgICAgICAgICAgb3duUHJvcHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgaXRlcmFibGVdICYmIGtleXMoaXRlcmFibGUpLFxuICAgICAgICAgICAgbGVuZ3RoID0gb3duUHJvcHMgPyBvd25Qcm9wcy5sZW5ndGggOiAwO1xuXG4gICAgICAgIHdoaWxlICgrK293bkluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaW5kZXggPSBvd25Qcm9wc1tvd25JbmRleF07XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pID09PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KHsgJzAnOiAnemVybycsICcxJzogJ29uZScsICdsZW5ndGgnOiAyIH0sIGZ1bmN0aW9uKG51bSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IGxvZ3MgJ2xlbmd0aCcsICcxJywgYW5kICcwJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJzAnLCAnMScsIGFuZCAnbGVuZ3RoJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMob2JqZWN0KSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgIGNhbGxiYWNrID0gYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKG9iamVjdFtrZXldLCBrZXksIG9iamVjdCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNvcnRlZCBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLFxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkLCBvZiBgb2JqZWN0YCB0aGF0IGhhdmUgZnVuY3Rpb24gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIG1ldGhvZHNcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGhhdmUgZnVuY3Rpb24gdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhfKTtcbiAgICAgKiAvLyA9PiBbJ2FsbCcsICdhbnknLCAnYmluZCcsICdiaW5kQWxsJywgJ2Nsb25lJywgJ2NvbXBhY3QnLCAnY29tcG9zZScsIC4uLl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3JJbihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lIGV4aXN0cyBhcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCxcbiAgICAgKiBpbnN0ZWFkIG9mIGFuIGluaGVyaXRlZCBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGtleSBpcyBhIGRpcmVjdCBwcm9wZXJ0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmhhcyh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgJ2InKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID8gaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIHRoZSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3JlYXRlZCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KHsgJ2ZpcnN0JzogJ2ZyZWQnLCAnc2Vjb25kJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6ICdmaXJzdCcsICdiYXJuZXknOiAnc2Vjb25kJyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gaW52ZXJ0KG9iamVjdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbb2JqZWN0W2tleV1dID0ga2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIGJvb2xlYW4gdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IGJvb2xDbGFzcyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGRhdGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIGRhdGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUobmV3IERhdGUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gZGF0ZUNsYXNzIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBlbXB0eS4gQXJyYXlzLCBzdHJpbmdzLCBvciBgYXJndW1lbnRzYCBvYmplY3RzIHdpdGggYVxuICAgICAqIGxlbmd0aCBvZiBgMGAgYW5kIG9iamVjdHMgd2l0aCBubyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBjb25zaWRlcmVkXG4gICAgICogXCJlbXB0eVwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoJycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBjbGFzc05hbWUgPSB0b1N0cmluZy5jYWxsKHZhbHVlKSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG5cbiAgICAgIGlmICgoY2xhc3NOYW1lID09IGFycmF5Q2xhc3MgfHwgY2xhc3NOYW1lID09IHN0cmluZ0NsYXNzIHx8IGNsYXNzTmFtZSA9PSBhcmdzQ2xhc3MgKSB8fFxuICAgICAgICAgIChjbGFzc05hbWUgPT0gb2JqZWN0Q2xhc3MgJiYgdHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJyAmJiBpc0Z1bmN0aW9uKHZhbHVlLnNwbGljZSkpKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZm9yT3duKHZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQgPSBmYWxzZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICAgICAqIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlci4gSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGV4ZWN1dGVkXG4gICAgICogdG8gY29tcGFyZSB2YWx1ZXMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGB1bmRlZmluZWRgIGNvbXBhcmlzb25zIHdpbGxcbiAgICAgKiBiZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmRcbiAgICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czsgKGEsIGIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0geyp9IGEgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBiIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICduYW1lJzogJ2ZyZWQnIH07XG4gICAgICogdmFyIGNvcHkgPSB7ICduYW1lJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiBvYmplY3QgPT0gY29weTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgY29weSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHdvcmRzID0gWydoZWxsbycsICdnb29kYnllJ107XG4gICAgICogdmFyIG90aGVyV29yZHMgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbCh3b3Jkcywgb3RoZXJXb3JkcywgZnVuY3Rpb24oYSwgYikge1xuICAgICAqICAgdmFyIHJlR3JlZXQgPSAvXig/OmhlbGxvfGhpKSQvaSxcbiAgICAgKiAgICAgICBhR3JlZXQgPSBfLmlzU3RyaW5nKGEpICYmIHJlR3JlZXQudGVzdChhKSxcbiAgICAgKiAgICAgICBiR3JlZXQgPSBfLmlzU3RyaW5nKGIpICYmIHJlR3JlZXQudGVzdChiKTtcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIChhR3JlZXQgfHwgYkdyZWV0KSA/IChhR3JlZXQgPT0gYkdyZWV0KSA6IHVuZGVmaW5lZDtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbChhLCBiLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKGEsIGIsIHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nICYmIGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzLCBvciBjYW4gYmUgY29lcmNlZCB0bywgYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgbmF0aXZlIGBpc0Zpbml0ZWAgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBmb3JcbiAgICAgKiBib29sZWFucyBhbmQgZW1wdHkgc3RyaW5ncy4gU2VlIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBpcyBmaW5pdGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgtMTAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKCcxMCcpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUodHJ1ZSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoJycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gbmF0aXZlSXNGaW5pdGUodmFsdWUpICYmICFuYXRpdmVJc05hTihwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKF8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlIGxhbmd1YWdlIHR5cGUgb2YgT2JqZWN0LlxuICAgICAqIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSB2YWx1ZSBpcyB0aGUgRUNNQVNjcmlwdCBsYW5ndWFnZSB0eXBlIG9mIE9iamVjdFxuICAgICAgLy8gaHR0cDovL2VzNS5naXRodWIuaW8vI3g4XG4gICAgICAvLyBhbmQgYXZvaWQgYSBWOCBidWdcbiAgICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIyOTFcbiAgICAgIHJldHVybiAhISh2YWx1ZSAmJiBvYmplY3RUeXBlc1t0eXBlb2YgdmFsdWVdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIG5hdGl2ZSBgaXNOYU5gIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgbm9uLW51bWVyaWMgdmFsdWVzLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuNC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gYE5hTmAgYXMgYSBwcmltaXRpdmUgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmXG4gICAgICAvLyAocGVyZm9ybSB0aGUgW1tDbGFzc11dIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWUgaG9zdCBvYmplY3RzIGluIElFKVxuICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYG51bGxgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc051bGwodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIE5vdGU6IGBOYU5gIGlzIGNvbnNpZGVyZWQgYSBudW1iZXIuIFNlZSBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDguNS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoOC40ICogNSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBudW1iZXJDbGFzcyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkge1xuICAgICAqICAgdGhpcy54ID0gMDtcbiAgICAgKiAgIHRoaXMueSA9IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBTaGFwZSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgdmFyIGlzUGxhaW5PYmplY3QgPSAhZ2V0UHJvdG90eXBlT2YgPyBzaGltSXNQbGFpbk9iamVjdCA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAoISh2YWx1ZSAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSBvYmplY3RDbGFzcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mLFxuICAgICAgICAgIG9ialByb3RvID0gaXNOYXRpdmUodmFsdWVPZikgJiYgKG9ialByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFsdWVPZikpICYmIGdldFByb3RvdHlwZU9mKG9ialByb3RvKTtcblxuICAgICAgcmV0dXJuIG9ialByb3RvXG4gICAgICAgID8gKHZhbHVlID09IG9ialByb3RvIHx8IGdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBvYmpQcm90bylcbiAgICAgICAgOiBzaGltSXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcmVndWxhciBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgvZnJlZC8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PSByZWdleHBDbGFzcyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RzXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN0cmluZ0NsYXNzIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAndW5kZWZpbmVkJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWQgYnlcbiAgICAgKiBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhyb3VnaCB0aGUgY2FsbGJhY2suXG4gICAgICogVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50cztcbiAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkXG4gICAgICogIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIHZhbHVlcyBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcFZhbHVlcyh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDN9ICwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gKiAzOyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSB7XG4gICAgICogICAnZnJlZCc6IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ubWFwVmFsdWVzKGNoYXJhY3RlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcblxuICAgICAgZm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBtZXJnZXMgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIG9iamVjdChzKSwgdGhhdFxuICAgICAqIGRvbid0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgaW50byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LiBTdWJzZXF1ZW50IHNvdXJjZXNcbiAgICAgKiB3aWxsIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLiBJZiBhIGNhbGxiYWNrIGlzXG4gICAgICogcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvblxuICAgICAqIGFuZCBzb3VyY2UgcHJvcGVydGllcy4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYHVuZGVmaW5lZGAgbWVyZ2luZyB3aWxsXG4gICAgICogYmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM7IChvYmplY3RWYWx1ZSwgc291cmNlVmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2luZyBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG5hbWVzID0ge1xuICAgICAqICAgJ2NoYXJhY3RlcnMnOiBbXG4gICAgICogICAgIHsgJ25hbWUnOiAnYmFybmV5JyB9LFxuICAgICAqICAgICB7ICduYW1lJzogJ2ZyZWQnIH1cbiAgICAgKiAgIF1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGFnZXMgPSB7XG4gICAgICogICAnY2hhcmFjdGVycyc6IFtcbiAgICAgKiAgICAgeyAnYWdlJzogMzYgfSxcbiAgICAgKiAgICAgeyAnYWdlJzogNDAgfVxuICAgICAqICAgXVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlKG5hbWVzLCBhZ2VzKTtcbiAgICAgKiAvLyA9PiB7ICdjaGFyYWN0ZXJzJzogW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sIHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9XSB9XG4gICAgICpcbiAgICAgKiB2YXIgZm9vZCA9IHtcbiAgICAgKiAgICdmcnVpdHMnOiBbJ2FwcGxlJ10sXG4gICAgICogICAndmVnZXRhYmxlcyc6IFsnYmVldCddXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlckZvb2QgPSB7XG4gICAgICogICAnZnJ1aXRzJzogWydiYW5hbmEnXSxcbiAgICAgKiAgICd2ZWdldGFibGVzJzogWydjYXJyb3QnXVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlKGZvb2QsIG90aGVyRm9vZCwgZnVuY3Rpb24oYSwgYikge1xuICAgICAqICAgcmV0dXJuIF8uaXNBcnJheShhKSA/IGEuY29uY2F0KGIpIDogdW5kZWZpbmVkO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ZydWl0cyc6IFsnYXBwbGUnLCAnYmFuYW5hJ10sICd2ZWdldGFibGVzJzogWydiZWV0JywgJ2NhcnJvdF0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lcmdlKG9iamVjdCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgbGVuZ3RoID0gMjtcblxuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICAvLyBhbGxvd3Mgd29ya2luZyB3aXRoIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCB3aXRob3V0IHVzaW5nXG4gICAgICAvLyB0aGVpciBgaW5kZXhgIGFuZCBgY29sbGVjdGlvbmAgYXJndW1lbnRzXG4gICAgICBpZiAodHlwZW9mIGFyZ3NbMl0gIT0gJ251bWJlcicpIHtcbiAgICAgICAgbGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID4gMyAmJiB0eXBlb2YgYXJnc1tsZW5ndGggLSAyXSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGJhc2VDcmVhdGVDYWxsYmFjayhhcmdzWy0tbGVuZ3RoIC0gMV0sIGFyZ3NbbGVuZ3RoLS1dLCAyKTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiB0eXBlb2YgYXJnc1tsZW5ndGggLSAxXSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnc1stLWxlbmd0aF07XG4gICAgICB9XG4gICAgICB2YXIgc291cmNlcyA9IHNsaWNlKGFyZ3VtZW50cywgMSwgbGVuZ3RoKSxcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIHN0YWNrQSA9IGdldEFycmF5KCksXG4gICAgICAgICAgc3RhY2tCID0gZ2V0QXJyYXkoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlc1tpbmRleF0sIGNhbGxiYWNrLCBzdGFja0EsIHN0YWNrQik7XG4gICAgICB9XG4gICAgICByZWxlYXNlQXJyYXkoc3RhY2tBKTtcbiAgICAgIHJlbGVhc2VBcnJheShzdGFja0IpO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgb2JqZWN0YCBleGNsdWRpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLlxuICAgICAqIFByb3BlcnR5IG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJyYXlzIG9mXG4gICAgICogcHJvcGVydHkgbmFtZXMuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZCBmb3IgZWFjaFxuICAgICAqIHByb3BlcnR5IG9mIGBvYmplY3RgIG9taXR0aW5nIHRoZSBwcm9wZXJ0aWVzIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWV5XG4gICAgICogZm9yLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzO1xuICAgICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258Li4uc3RyaW5nfHN0cmluZ1tdfSBbY2FsbGJhY2tdIFRoZSBwcm9wZXJ0aWVzIHRvIG9taXQgb3IgdGhlXG4gICAgICogIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGhvdXQgdGhlIG9taXR0ZWQgcHJvcGVydGllcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5vbWl0KHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9LCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAnbmFtZSc6ICdmcmVkJyB9XG4gICAgICpcbiAgICAgKiBfLm9taXQoeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnZnJlZCcgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9taXQob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IFtdO1xuICAgICAgICBmb3JJbihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcm9wcyA9IGJhc2VEaWZmZXJlbmNlKHByb3BzLCBiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIGZhbHNlLCAxKSk7XG5cbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKHZhbHVlLCBrZXksIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHR3byBkaW1lbnNpb25hbCBhcnJheSBvZiBhbiBvYmplY3QncyBrZXktdmFsdWUgcGFpcnMsXG4gICAgICogaS5lLiBgW1trZXkxLCB2YWx1ZTFdLCBba2V5MiwgdmFsdWUyXV1gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgbmV3IGFycmF5IG9mIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWlycyh7ICdiYXJuZXknOiAzNiwgJ2ZyZWQnOiA0MCB9KTtcbiAgICAgKiAvLyA9PiBbWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDQwXV0gKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFpcnMob2JqZWN0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBwcm9wcyA9IGtleXMob2JqZWN0KSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IFtrZXksIG9iamVjdFtrZXldXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYG9iamVjdGAgY29tcG9zZWQgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLlxuICAgICAqIFByb3BlcnR5IG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJyYXlzIG9mXG4gICAgICogcHJvcGVydHkgbmFtZXMuIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBleGVjdXRlZCBmb3IgZWFjaFxuICAgICAqIHByb3BlcnR5IG9mIGBvYmplY3RgIHBpY2tpbmcgdGhlIHByb3BlcnRpZXMgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXlcbiAgICAgKiBmb3IuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnwuLi5zdHJpbmd8c3RyaW5nW119IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXJcbiAgICAgKiAgaXRlcmF0aW9uIG9yIHByb3BlcnR5IG5hbWVzIHRvIHBpY2ssIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIHByb3BlcnR5XG4gICAgICogIG5hbWVzIG9yIGFycmF5cyBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIHByb3BlcnRpZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGljayh7ICduYW1lJzogJ2ZyZWQnLCAnX3VzZXJpZCc6ICdmcmVkMScgfSwgJ25hbWUnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnIH1cbiAgICAgKlxuICAgICAqIF8ucGljayh7ICduYW1lJzogJ2ZyZWQnLCAnX3VzZXJpZCc6ICdmcmVkMScgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleS5jaGFyQXQoMCkgIT0gJ18nO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnZnJlZCcgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2sob2JqZWN0LCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgcHJvcHMgPSBiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIGZhbHNlLCAxKSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGlzT2JqZWN0KG9iamVjdCkgPyBwcm9wcy5sZW5ndGggOiAwO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgICAgZm9ySW4ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGtleSwgb2JqZWN0KSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgIHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIHRocm91Z2ggYSBjYWxsYmFjaywgd2l0aCBlYWNoIGNhbGxiYWNrIGV4ZWN1dGlvblxuICAgICAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvXG4gICAgICogYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM7IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKiBDYWxsYmFja3MgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc3F1YXJlcyA9IF8udHJhbnNmb3JtKFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0sIGZ1bmN0aW9uKHJlc3VsdCwgbnVtKSB7XG4gICAgICogICBudW0gKj0gbnVtO1xuICAgICAqICAgaWYgKG51bSAlIDIpIHtcbiAgICAgKiAgICAgcmV0dXJuIHJlc3VsdC5wdXNoKG51bSkgPCAzO1xuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxLCA5LCAyNV1cbiAgICAgKlxuICAgICAqIHZhciBtYXBwZWQgPSBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgZnVuY3Rpb24ocmVzdWx0LCBudW0sIGtleSkge1xuICAgICAqICAgcmVzdWx0W2tleV0gPSBudW0gKiAzO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAzLCAnYic6IDYsICdjJzogOSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgY2FsbGJhY2ssIGFjY3VtdWxhdG9yLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBjdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgcHJvdG8gPSBjdG9yICYmIGN0b3IucHJvdG90eXBlO1xuXG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBiYXNlQ3JlYXRlKHByb3RvKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTtcbiAgICAgICAgKGlzQXJyID8gZm9yRWFjaCA6IGZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNvbXBvc2VkIG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKHsgJ29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXSAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cylcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBwcm9wcyA9IGtleXMob2JqZWN0KSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IG9iamVjdFtwcm9wc1tpbmRleF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4ZXMsIG9yIGtleXMsIG9mIHRoZVxuICAgICAqIGBjb2xsZWN0aW9uYC4gSW5kZXhlcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5c1xuICAgICAqIG9mIGluZGV4ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXXxzdHJpbmd8c3RyaW5nW10pfSBbaW5kZXhdIFRoZSBpbmRleGVzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqICAgdG8gcmV0cmlldmUsIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGluZGV4ZXMgb3IgYXJyYXlzIG9mIGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gICAgICogIHByb3ZpZGVkIGluZGV4ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYXQoWydhJywgJ2InLCAnYycsICdkJywgJ2UnXSwgWzAsIDIsIDRdKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYycsICdlJ11cbiAgICAgKlxuICAgICAqIF8uYXQoWydmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJ10sIDAsIDIpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhdChjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIHByb3BzID0gYmFzZUZsYXR0ZW4oYXJncywgdHJ1ZSwgZmFsc2UsIDEpLFxuICAgICAgICAgIGxlbmd0aCA9IChhcmdzWzJdICYmIGFyZ3NbMl1bYXJnc1sxXV0gPT09IGNvbGxlY3Rpb24pID8gMSA6IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBjb2xsZWN0aW9uW3Byb3BzW2luZGV4XV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIHZhbHVlIGlzIHByZXNlbnQgaW4gYSBjb2xsZWN0aW9uIHVzaW5nIHN0cmljdCBlcXVhbGl0eVxuICAgICAqIGZvciBjb21wYXJpc29ucywgaS5lLiBgPT09YC4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0IGlzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBpbmNsdWRlXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gY2hlY2sgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGB0YXJnZXRgIGVsZW1lbnQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb250YWlucyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uY29udGFpbnMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5jb250YWlucyh7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfSwgJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbnRhaW5zKCdwZWJibGVzJywgJ2ViJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnRhaW5zKGNvbGxlY3Rpb24sIHRhcmdldCwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleE9mID0gZ2V0SW5kZXhPZigpLFxuICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDAsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIGZyb21JbmRleCA9IChmcm9tSW5kZXggPCAwID8gbmF0aXZlTWF4KDAsIGxlbmd0aCArIGZyb21JbmRleCkgOiBmcm9tSW5kZXgpIHx8IDA7XG4gICAgICBpZiAoaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBpbmRleE9mKGNvbGxlY3Rpb24sIHRhcmdldCwgZnJvbUluZGV4KSA+IC0xO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHJlc3VsdCA9IChpc1N0cmluZyhjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24uaW5kZXhPZih0YXJnZXQsIGZyb21JbmRleCkgOiBpbmRleE9mKGNvbGxlY3Rpb24sIHRhcmdldCwgZnJvbUluZGV4KSkgPiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGlmICgrK2luZGV4ID49IGZyb21JbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuICEocmVzdWx0ID0gdmFsdWUgPT09IHRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJvdWdoIHRoZSBjYWxsYmFjay4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVcbiAgICAgKiBvZiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjay5cbiAgICAgKiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzO1xuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZFxuICAgICAqICB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNC4zLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5mbG9vcihudW0pOyB9KTtcbiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH1cbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNC4zLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gdGhpcy5mbG9vcihudW0pOyB9LCBNYXRoKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH1cbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiAyLCAnNSc6IDEgfVxuICAgICAqL1xuICAgIHZhciBjb3VudEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSA/IHJlc3VsdFtrZXldKysgOiByZXN1bHRba2V5XSA9IDEpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBjYWxsYmFjayByZXR1cm5zIHRydWV5IHZhbHVlIGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mXG4gICAgICogYSBjb2xsZWN0aW9uLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGFsbFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3NlZCB0aGUgY2FsbGJhY2sgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmV2ZXJ5KGNoYXJhY3RlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ud2hlcmVcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmV2ZXJ5KGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDM2IH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykge1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmICghKHJlc3VsdCA9ICEhY2FsbGJhY2soY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiAocmVzdWx0ID0gISFjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gICAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkgZm9yLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZFxuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIHNlbGVjdFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBwYXNzZWQgdGhlIGNhbGxiYWNrIGNoZWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZXZlbnMgPSBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICUgMiA9PSAwOyB9KTtcbiAgICAgKiAvLyA9PiBbMiwgNCwgNl1cbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbHRlcihjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpO1xuICAgICAqIC8vID0+IFt7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9XVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maWx0ZXIoY2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdFxuICAgICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWV5IGZvci4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmRcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBkZXRlY3QsIGZpbmRXaGVyZVxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdibG9ja2VkJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH0sXG4gICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdibG9ja2VkJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmQoY2hhcmFjdGVycywgZnVuY3Rpb24oY2hyKSB7XG4gICAgICogICByZXR1cm4gY2hyLmFnZSA8IDQwO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH1cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmluZChjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAxIH0pO1xuICAgICAqIC8vID0+ICB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgJ2Jsb2NrZWQnOiBmYWxzZSB9XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmQoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykge1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICAgIGlmIChjYWxsYmFjayh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICBmb3JPd24oY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYSBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZFxuICAgICAqICB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obnVtKSB7XG4gICAgICogICByZXR1cm4gbnVtICUgMiA9PSAxO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgIGZvckVhY2hSaWdodChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbiwgZXhlY3V0aW5nIHRoZSBjYWxsYmFjayBmb3IgZWFjaFxuICAgICAqIGVsZW1lbnQuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLiBDYWxsYmFja3MgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5XG4gICAgICogZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIE5vdGU6IEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIGBsZW5ndGhgIHByb3BlcnR5XG4gICAgICogYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIGBfLmZvckluYCBvciBgXy5mb3JPd25gXG4gICAgICogbWF5IGJlIHVzZWQgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZWFjaFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdHxzdHJpbmd9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkuZm9yRWFjaChmdW5jdGlvbihudW0pIHsgY29uc29sZS5sb2cobnVtKTsgfSkuam9pbignLCcpO1xuICAgICAqIC8vID0+IGxvZ3MgZWFjaCBudW1iZXIgYW5kIHJldHVybnMgJzEsMiwzJ1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzIH0sIGZ1bmN0aW9uKG51bSkgeyBjb25zb2xlLmxvZyhudW0pOyB9KTtcbiAgICAgKiAvLyA9PiBsb2dzIGVhY2ggbnVtYmVyIGFuZCByZXR1cm5zIHRoZSBvYmplY3QgKHByb3BlcnR5IG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkIGFjcm9zcyBlbnZpcm9ubWVudHMpXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDtcblxuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiB0eXBlb2YgdGhpc0FyZyA9PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrIDogYmFzZUNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKGNvbGxlY3Rpb25baW5kZXhdLCBpbmRleCwgY29sbGVjdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZWFjaFJpZ2h0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fHN0cmluZ30gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS5mb3JFYWNoUmlnaHQoZnVuY3Rpb24obnVtKSB7IGNvbnNvbGUubG9nKG51bSk7IH0pLmpvaW4oJywnKTtcbiAgICAgKiAvLyA9PiBsb2dzIGVhY2ggbnVtYmVyIGZyb20gcmlnaHQgdG8gbGVmdCBhbmQgcmV0dXJucyAnMywyLDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgdHlwZW9mIHRoaXNBcmcgPT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFjayA6IGJhc2VDcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG4gICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykge1xuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2soY29sbGVjdGlvbltsZW5ndGhdLCBsZW5ndGgsIGNvbGxlY3Rpb24pID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICAgIGZvck93bihjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAga2V5ID0gcHJvcHMgPyBwcm9wc1stLWxlbmd0aF0gOiAtLWxlbmd0aDtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soY29sbGVjdGlvbltrZXldLCBrZXksIGNvbGxlY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBhIGNvbGxlY3Rpb24gdGhyb3VnaCB0aGUgY2FsbGJhY2suIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlXG4gICAgICogb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgdGhlIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuXG4gICAgICogVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50cztcbiAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZFxuICAgICAqICB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNC4yLCA2LjEsIDYuNF0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5mbG9vcihudW0pOyB9KTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi40XSB9XG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIHRoaXMuZmxvb3IobnVtKTsgfSwgTWF0aCk7XG4gICAgICogLy8gPT4geyAnNCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuNF0gfVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5ncm91cEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IFsnb25lJywgJ3R3byddLCAnNSc6IFsndGhyZWUnXSB9XG4gICAgICovXG4gICAgdmFyIGdyb3VwQnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpID8gcmVzdWx0W2tleV0gOiByZXN1bHRba2V5XSA9IFtdKS5wdXNoKHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbiB0aHJvdWdoIHRoZSBnaXZlbiBjYWxsYmFjay4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuXG4gICAgICogVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50cztcbiAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIga2V5cyA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmluZGV4Qnkoa2V5cywgJ2RpcicpO1xuICAgICAqIC8vID0+IHsgJ2xlZnQnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ3JpZ2h0JzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmluZGV4Qnkoa2V5cywgZnVuY3Rpb24oa2V5KSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGtleS5jb2RlKTsgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAnZCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqXG4gICAgICogXy5pbmRleEJ5KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGtleSkgeyB0aGlzLmZyb21DaGFyQ29kZShrZXkuY29kZSk7IH0sIFN0cmluZyk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAnZCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBpbmRleEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgbmFtZWQgYnkgYG1ldGhvZE5hbWVgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGNvbGxlY3Rpb25gXG4gICAgICogcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogd2lsbCBiZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgbWV0aG9kTmFtZWAgaXMgYSBmdW5jdGlvbiBpdFxuICAgICAqIHdpbGwgYmUgaW52b2tlZCBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiB0aGUgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW52b2tlKFtbNSwgMSwgN10sIFszLCAyLCAxXV0sICdzb3J0Jyk7XG4gICAgICogLy8gPT4gW1sxLCA1LCA3XSwgWzEsIDIsIDNdXVxuICAgICAqXG4gICAgICogXy5pbnZva2UoWzEyMywgNDU2XSwgU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwgJycpO1xuICAgICAqIC8vID0+IFtbJzEnLCAnMicsICczJ10sIFsnNCcsICc1JywgJzYnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnZva2UoY29sbGVjdGlvbiwgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMsIDIpLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgaXNGdW5jID0gdHlwZW9mIG1ldGhvZE5hbWUgPT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBsZW5ndGggOiAwKTtcblxuICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSAoaXNGdW5jID8gbWV0aG9kTmFtZSA6IHZhbHVlW21ldGhvZE5hbWVdKS5hcHBseSh2YWx1ZSwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICAgKiB0aHJvdWdoIHRoZSBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBjb2xsZWN0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZFxuICAgICAqICB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGBjYWxsYmFja2AgZXhlY3V0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gbnVtICogMzsgfSk7XG4gICAgICogLy8gPT4gWzMsIDYsIDldXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9LCBmdW5jdGlvbihudW0pIHsgcmV0dXJuIG51bSAqIDM7IH0pO1xuICAgICAqIC8vID0+IFszLCA2LCA5XSAocHJvcGVydHkgb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGVudmlyb25tZW50cylcbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5tYXAoY2hhcmFjdGVycywgJ25hbWUnKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDA7XG5cbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBjYWxsYmFjayhjb2xsZWN0aW9uW2luZGV4XSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXN1bHRbKytpbmRleF0gPSBjYWxsYmFjayh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIGNvbGxlY3Rpb24uIElmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5IG9yXG4gICAgICogZmFsc2V5IGAtSW5maW5pdHlgIGlzIHJldHVybmVkLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWRcbiAgICAgKiBmb3IgZWFjaCB2YWx1ZSBpbiB0aGUgY29sbGVjdGlvbiB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoIHRoZSB2YWx1ZVxuICAgICAqIGlzIHJhbmtlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZFxuICAgICAqICB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXgoY2hhcmFjdGVycywgZnVuY3Rpb24oY2hyKSB7IHJldHVybiBjaHIuYWdlOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ubWF4KGNoYXJhY3RlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IC1JbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBjb21wdXRlZDtcblxuICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgIHdpdGhvdXQgdXNpbmdcbiAgICAgIC8vIHRoZWlyIGBpbmRleGAgYXJndW1lbnQgYXMgYSBjYWxsYmFja1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYgdGhpc0FyZ1tjYWxsYmFja10gPT09IGNvbGxlY3Rpb24pIHtcbiAgICAgICAgY2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwgJiYgaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07XG4gICAgICAgICAgaWYgKHZhbHVlID4gcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrID0gKGNhbGxiYWNrID09IG51bGwgJiYgaXNTdHJpbmcoY29sbGVjdGlvbikpXG4gICAgICAgICAgPyBjaGFyQXRDYWxsYmFja1xuICAgICAgICAgIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcblxuICAgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHZhciBjdXJyZW50ID0gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgICBpZiAoY3VycmVudCA+IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICBjb21wdXRlZCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYSBjb2xsZWN0aW9uLiBJZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eSBvclxuICAgICAqIGZhbHNleSBgSW5maW5pdHlgIGlzIHJldHVybmVkLiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWRcbiAgICAgKiBmb3IgZWFjaCB2YWx1ZSBpbiB0aGUgY29sbGVjdGlvbiB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoIHRoZSB2YWx1ZVxuICAgICAqIGlzIHJhbmtlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLiBJZiBhIHByb3BlcnR5IG5hbWUgb3Igb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZFxuICAgICAqICB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5taW4oY2hhcmFjdGVycywgZnVuY3Rpb24oY2hyKSB7IHJldHVybiBjaHIuYWdlOyB9KTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9O1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5taW4oY2hhcmFjdGVycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH07XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgY29tcHV0ZWQgPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBjb21wdXRlZDtcblxuICAgICAgLy8gYWxsb3dzIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgIHdpdGhvdXQgdXNpbmdcbiAgICAgIC8vIHRoZWlyIGBpbmRleGAgYXJndW1lbnQgYXMgYSBjYWxsYmFja1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgJiYgdGhpc0FyZ1tjYWxsYmFja10gPT09IGNvbGxlY3Rpb24pIHtcbiAgICAgICAgY2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwgJiYgaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07XG4gICAgICAgICAgaWYgKHZhbHVlIDwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrID0gKGNhbGxiYWNrID09IG51bGwgJiYgaXNTdHJpbmcoY29sbGVjdGlvbikpXG4gICAgICAgICAgPyBjaGFyQXRDYWxsYmFja1xuICAgICAgICAgIDogbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcblxuICAgICAgICBmb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHZhciBjdXJyZW50ID0gY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgICBpZiAoY3VycmVudCA8IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICBjb21wdXRlZCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHByb3BlcnR5IGZyb20gYWxsIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGx1Y2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnBsdWNrKGNoYXJhY3RlcnMsICduYW1lJyk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICovXG4gICAgdmFyIHBsdWNrID0gbWFwO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBhIGNvbGxlY3Rpb24gdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24gdGhyb3VnaCB0aGUgY2FsbGJhY2ssIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICAgICAqIGNhbGxiYWNrIGV4ZWN1dGlvbiBjb25zdW1lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBleGVjdXRpb24uIElmXG4gICAgICogYGFjY3VtdWxhdG9yYCBpcyBub3QgcHJvdmlkZWQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gd2lsbCBiZVxuICAgICAqIHVzZWQgYXMgdGhlIGluaXRpYWwgYGFjY3VtdWxhdG9yYCB2YWx1ZS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYFxuICAgICAqIGFuZCBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM7IChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZm9sZGwsIGluamVjdFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIEluaXRpYWwgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHN1bSA9IF8ucmVkdWNlKFsxLCAyLCAzXSwgZnVuY3Rpb24oc3VtLCBudW0pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBudW07XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogdmFyIG1hcHBlZCA9IF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCBmdW5jdGlvbihyZXN1bHQsIG51bSwga2V5KSB7XG4gICAgICogICByZXN1bHRba2V5XSA9IG51bSAqIDM7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMywgJ2InOiA2LCAnYyc6IDkgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBjYWxsYmFjaywgYWNjdW11bGF0b3IsIHRoaXNBcmcpIHtcbiAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgdmFyIG5vYWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChub2FjY3VtKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBjb2xsZWN0aW9uWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gbm9hY2N1bVxuICAgICAgICAgICAgPyAobm9hY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgICAgIDogY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbilcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yZWR1Y2VgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBhIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZm9sZHJcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBJbml0aWFsIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsaXN0ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqIHZhciBmbGF0ID0gXy5yZWR1Y2VSaWdodChsaXN0LCBmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLmNvbmNhdChiKTsgfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGNhbGxiYWNrLCBhY2N1bXVsYXRvciwgdGhpc0FyZykge1xuICAgICAgdmFyIG5vYWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCA0KTtcbiAgICAgIGZvckVhY2hSaWdodChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgYWNjdW11bGF0b3IgPSBub2FjY3VtXG4gICAgICAgICAgPyAobm9hY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgICA6IGNhbGxiYWNrKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmAgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZWxlbWVudHMgb2YgYVxuICAgICAqIGNvbGxlY3Rpb24gdGhhdCB0aGUgY2FsbGJhY2sgZG9lcyAqKm5vdCoqIHJldHVybiB0cnVleSBmb3IuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBmYWlsZWQgdGhlIGNhbGxiYWNrIGNoZWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2RkcyA9IF8ucmVqZWN0KFsxLCAyLCAzLCA0LCA1LCA2XSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdibG9ja2VkJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucmVqZWN0KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH1dXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ud2hlcmVcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnJlamVjdChjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAzNiB9KTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgIHJldHVybiBmaWx0ZXIoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAhY2FsbGJhY2sodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhIHJhbmRvbSBlbGVtZW50IG9yIGBuYCByYW5kb20gZWxlbWVudHMgZnJvbSBhIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbl0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEFsbG93cyB3b3JraW5nIHdpdGggZnVuY3Rpb25zIGxpa2UgYF8ubWFwYFxuICAgICAqICB3aXRob3V0IHVzaW5nIHRoZWlyIGBpbmRleGAgYXJndW1lbnRzIGFzIGBuYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBzYW1wbGUocykgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiAmJiB0eXBlb2YgY29sbGVjdGlvbi5sZW5ndGggIT0gJ251bWJlcicpIHtcbiAgICAgICAgY29sbGVjdGlvbiA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gPyBjb2xsZWN0aW9uW2Jhc2VSYW5kb20oMCwgY29sbGVjdGlvbi5sZW5ndGggLSAxKV0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gc2h1ZmZsZShjb2xsZWN0aW9uKTtcbiAgICAgIHJlc3VsdC5sZW5ndGggPSBuYXRpdmVNaW4obmF0aXZlTWF4KDAsIG4pLCByZXN1bHQubGVuZ3RoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBzaHVmZmxlZCB2YWx1ZXMsIHVzaW5nIGEgdmVyc2lvbiBvZiB0aGUgRmlzaGVyLVlhdGVzXG4gICAgICogc2h1ZmZsZS4gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgc2h1ZmZsZWQgY29sbGVjdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zaHVmZmxlKFsxLCAyLCAzLCA0LCA1LCA2XSk7XG4gICAgICogLy8gPT4gWzQsIDEsIDYsIDMsIDUsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgPyBsZW5ndGggOiAwKTtcblxuICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgcmFuZCA9IGJhc2VSYW5kb20oMCwgKytpbmRleCk7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSByZXN1bHRbcmFuZF07XG4gICAgICAgIHJlc3VsdFtyYW5kXSA9IHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgYGNvbGxlY3Rpb24ubGVuZ3RoYCBmb3IgYXJyYXlzXG4gICAgICogYW5kIGFycmF5LWxpa2Ugb2JqZWN0cyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGBjb2xsZWN0aW9uLmxlbmd0aGAgb3IgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMyB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiB0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInID8gbGVuZ3RoIDoga2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgdHJ1ZXkgdmFsdWUgZm9yICoqYW55KiogZWxlbWVudCBvZiBhXG4gICAgICogY29sbGVjdGlvbi4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYXMgc29vbiBhcyBpdCBmaW5kcyBhIHBhc3NpbmcgdmFsdWUgYW5kXG4gICAgICogZG9lcyBub3QgaXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgY29sbGVjdGlvbi4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvXG4gICAgICogYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBhbnlcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkXG4gICAgICogIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlZCB0aGUgY2FsbGJhY2sgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYmxvY2tlZCc6IGZhbHNlIH0sXG4gICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2Jsb2NrZWQnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5zb21lKGNoYXJhY3RlcnMsICdibG9ja2VkJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5zb21lKGNoYXJhY3RlcnMsIHsgJ2FnZSc6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uID8gY29sbGVjdGlvbi5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PSAnbnVtYmVyJykge1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmICgocmVzdWx0ID0gY2FsbGJhY2soY29sbGVjdGlvbltpbmRleF0sIGluZGV4LCBjb2xsZWN0aW9uKSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yT3duKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiAhKHJlc3VsdCA9IGNhbGxiYWNrKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocm91Z2ggdGhlIGNhbGxiYWNrLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHdpbGwgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXJcbiAgICAgKiBvZiBlcXVhbCBlbGVtZW50cy4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY29sbGVjdGlvblxuICAgICAqIHdpbGwgYmUgc29ydGVkIGJ5IGVhY2ggcHJvcGVydHkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2Ygc29ydGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeShbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gTWF0aC5zaW4obnVtKTsgfSk7XG4gICAgICogLy8gPT4gWzMsIDEsIDJdXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeShbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gdGhpcy5zaW4obnVtKTsgfSwgTWF0aCk7XG4gICAgICogLy8gPT4gWzMsIDEsIDJdXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICduYW1lJzogJ2Jhcm5leScsICAnYWdlJzogMjYgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdhZ2UnOiAzMCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ubWFwKF8uc29ydEJ5KGNoYXJhY3RlcnMsICdhZ2UnKSwgXy52YWx1ZXMpO1xuICAgICAqIC8vID0+IFtbJ2Jhcm5leScsIDI2XSwgWydmcmVkJywgMzBdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgNDBdXVxuICAgICAqXG4gICAgICogLy8gc29ydGluZyBieSBtdWx0aXBsZSBwcm9wZXJ0aWVzXG4gICAgICogXy5tYXAoXy5zb3J0QnkoY2hhcmFjdGVycywgWyduYW1lJywgJ2FnZSddKSwgXy52YWx1ZXMpO1xuICAgICAqIC8vID0gPiBbWydiYXJuZXknLCAyNl0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQwXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0QnkoY29sbGVjdGlvbiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzQXJyID0gaXNBcnJheShjYWxsYmFjayksXG4gICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGNvbGxlY3Rpb24ubGVuZ3RoIDogMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheSh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInID8gbGVuZ3RoIDogMCk7XG5cbiAgICAgIGlmICghaXNBcnIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpO1xuICAgICAgfVxuICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBvYmplY3QgPSByZXN1bHRbKytpbmRleF0gPSBnZXRPYmplY3QoKTtcbiAgICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgICAgb2JqZWN0LmNyaXRlcmlhID0gbWFwKGNhbGxiYWNrLCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChvYmplY3QuY3JpdGVyaWEgPSBnZXRBcnJheSgpKVswXSA9IGNhbGxiYWNrKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5pbmRleCA9IGluZGV4O1xuICAgICAgICBvYmplY3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuICAgICAgcmVzdWx0LnNvcnQoY29tcGFyZUFzY2VuZGluZyk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIG9iamVjdCA9IHJlc3VsdFtsZW5ndGhdO1xuICAgICAgICByZXN1bHRbbGVuZ3RoXSA9IG9iamVjdC52YWx1ZTtcbiAgICAgICAgaWYgKCFpc0Fycikge1xuICAgICAgICAgIHJlbGVhc2VBcnJheShvYmplY3QuY3JpdGVyaWEpO1xuICAgICAgICB9XG4gICAgICAgIHJlbGVhc2VPYmplY3Qob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGBjb2xsZWN0aW9uYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbnZlcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogKGZ1bmN0aW9uKCkgeyByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cykuc2xpY2UoMSk7IH0pKDEsIDIsIDMsIDQpO1xuICAgICAqIC8vID0+IFsyLCAzLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvQXJyYXkoY29sbGVjdGlvbikge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgdHlwZW9mIGNvbGxlY3Rpb24ubGVuZ3RoID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBzbGljZShjb2xsZWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gb2YgZWFjaCBlbGVtZW50IGluIGEgYGNvbGxlY3Rpb25gIHRvIHRoZSBnaXZlblxuICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHMgdGhhdCBoYXZlIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIGZpbHRlciBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAncGV0cyc6IFsnaG9wcHknXSB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAnYWdlJzogNDAsICdwZXRzJzogWydiYWJ5IHB1c3MnLCAnZGlubyddIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy53aGVyZShjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAzNiB9KTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYsICdwZXRzJzogWydob3BweSddIH1dXG4gICAgICpcbiAgICAgKiBfLndoZXJlKGNoYXJhY3RlcnMsIHsgJ3BldHMnOiBbJ2Rpbm8nXSB9KTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwLCAncGV0cyc6IFsnYmFieSBwdXNzJywgJ2Rpbm8nXSB9XVxuICAgICAqL1xuICAgIHZhciB3aGVyZSA9IGZpbHRlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBhbGwgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgdmFsdWVzIG9mIHRoZSBwcm92aWRlZCBhcnJheXMgdXNpbmcgc3RyaWN0XG4gICAgICogZXF1YWxpdHkgZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSBhcnJheXMgb2YgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsxLCAyLCAzLCA0LCA1XSwgWzUsIDIsIDEwXSk7XG4gICAgICogLy8gPT4gWzEsIDMsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGlmZmVyZW5jZShhcnJheSkge1xuICAgICAgcmV0dXJuIGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIHRydWUsIDEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgdGhhdCBwYXNzZXMgdGhlIGNhbGxiYWNrIGNoZWNrLCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiBmYWxzZSB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYmxvY2tlZCc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZEluZGV4KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikge1xuICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPCAyMDtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ud2hlcmVcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRJbmRleChjaGFyYWN0ZXJzLCB7ICdhZ2UnOiAzNiB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRJbmRleChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmIChjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAqIG9mIGEgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2Jsb2NrZWQnOiB0cnVlIH0sXG4gICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdibG9ja2VkJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2Jsb2NrZWQnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3RlcnMsIGZ1bmN0aW9uKGNocikge1xuICAgICAqICAgcmV0dXJuIGNoci5hZ2UgPiAzMDtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ud2hlcmVcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgoY2hhcmFjdGVycywgeyAnYWdlJzogMzYgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maW5kTGFzdEluZGV4KGNoYXJhY3RlcnMsICdibG9ja2VkJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChjYWxsYmFjayhhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9yIGZpcnN0IGBuYCBlbGVtZW50cyBvZiBhbiBhcnJheS4gSWYgYSBjYWxsYmFja1xuICAgICAqIGlzIHByb3ZpZGVkIGVsZW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGFyZSByZXR1cm5lZCBhcyBsb25nXG4gICAgICogYXMgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkIFwiXy5wbHVja1wiIHN0eWxlXG4gICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgaGVhZCwgdGFrZVxuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8bnVtYmVyfHN0cmluZ30gW2NhbGxiYWNrXSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBlbGVtZW50IG9yIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLiBJZiBhIHByb3BlcnR5IG5hbWUgb3JcbiAgICAgKiAgb2JqZWN0IGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBcIl8ucGx1Y2tcIiBvciBcIl8ud2hlcmVcIlxuICAgICAqICBzdHlsZSBjYWxsYmFjaywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY2FsbGJhY2tgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50KHMpIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmlyc3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpcnN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7XG4gICAgICogICByZXR1cm4gbnVtIDwgMztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ25hJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmlyc3QoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJuZXknLCAnYmxvY2tlZCc6IHRydWUsICdlbXBsb3llcic6ICdzbGF0ZScgfV1cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy5maXJzdChjaGFyYWN0ZXJzLCB7ICdlbXBsb3llcic6ICdzbGF0ZScgfSksICduYW1lJyk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlyc3QoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgbiA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgbisrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gY2FsbGJhY2s7XG4gICAgICAgIGlmIChuID09IG51bGwgfHwgdGhpc0FyZykge1xuICAgICAgICAgIHJldHVybiBhcnJheSA/IGFycmF5WzBdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2xpY2UoYXJyYXksIDAsIG5hdGl2ZU1pbihuYXRpdmVNYXgoMCwgbiksIGxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGEgbmVzdGVkIGFycmF5ICh0aGUgbmVzdGluZyBjYW4gYmUgdG8gYW55IGRlcHRoKS4gSWYgYGlzU2hhbGxvd2BcbiAgICAgKiBpcyB0cnVleSwgdGhlIGFycmF5IHdpbGwgb25seSBiZSBmbGF0dGVuZWQgYSBzaW5nbGUgbGV2ZWwuIElmIGEgY2FsbGJhY2tcbiAgICAgKiBpcyBwcm92aWRlZCBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBjYWxsYmFjayBiZWZvcmVcbiAgICAgKiBmbGF0dGVuaW5nLiBUaGUgY2FsbGJhY2sgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU2hhbGxvdz1mYWxzZV0gQSBmbGFnIHRvIHJlc3RyaWN0IGZsYXR0ZW5pbmcgdG8gYSBzaW5nbGUgbGV2ZWwuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbY2FsbGJhY2s9aWRlbnRpdHldIFRoZSBmdW5jdGlvbiBjYWxsZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiAgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyXSwgWzMsIFtbNF1dXV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbihbMSwgWzJdLCBbMywgW1s0XV1dXSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFtbNF1dXTtcbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzAsICdwZXRzJzogWydob3BweSddIH0sXG4gICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ3BldHMnOiBbJ2JhYnkgcHVzcycsICdkaW5vJ10gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZsYXR0ZW4oY2hhcmFjdGVycywgJ3BldHMnKTtcbiAgICAgKiAvLyA9PiBbJ2hvcHB5JywgJ2JhYnkgcHVzcycsICdkaW5vJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuKGFycmF5LCBpc1NoYWxsb3csIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAvLyBqdWdnbGUgYXJndW1lbnRzXG4gICAgICBpZiAodHlwZW9mIGlzU2hhbGxvdyAhPSAnYm9vbGVhbicgJiYgaXNTaGFsbG93ICE9IG51bGwpIHtcbiAgICAgICAgdGhpc0FyZyA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayA9ICh0eXBlb2YgaXNTaGFsbG93ICE9ICdmdW5jdGlvbicgJiYgdGhpc0FyZyAmJiB0aGlzQXJnW2lzU2hhbGxvd10gPT09IGFycmF5KSA/IG51bGwgOiBpc1NoYWxsb3c7XG4gICAgICAgIGlzU2hhbGxvdyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgYXJyYXkgPSBtYXAoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgaXNTaGFsbG93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIHVzaW5nXG4gICAgICogc3RyaWN0IGVxdWFsaXR5IGZvciBjb21wYXJpc29ucywgaS5lLiBgPT09YC4gSWYgdGhlIGFycmF5IGlzIGFscmVhZHkgc29ydGVkXG4gICAgICogcHJvdmlkaW5nIGB0cnVlYCBmb3IgYGZyb21JbmRleGAgd2lsbCBydW4gYSBmYXN0ZXIgYmluYXJ5IHNlYXJjaC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtib29sZWFufG51bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20gb3IgYHRydWVgXG4gICAgICogIHRvIHBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIG9uIGEgc29ydGVkIGFycmF5LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMywgMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMywgMSwgMiwgM10sIDIsIDMpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uaW5kZXhPZihbMSwgMSwgMiwgMiwgMywgM10sIDIsIHRydWUpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICBpZiAodHlwZW9mIGZyb21JbmRleCA9PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heCgwLCBsZW5ndGggKyBmcm9tSW5kZXgpIDogZnJvbUluZGV4IHx8IDApO1xuICAgICAgfSBlbHNlIGlmIChmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGFycmF5W2luZGV4XSA9PT0gdmFsdWUgPyBpbmRleCA6IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvciBsYXN0IGBuYCBlbGVtZW50cyBvZiBhbiBhcnJheS4gSWYgYVxuICAgICAqIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGVsZW1lbnRzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5IGFyZSBleGNsdWRlZCBmcm9tXG4gICAgICogdGhlIHJlc3VsdCBhcyBsb25nIGFzIHRoZSBjYWxsYmFjayByZXR1cm5zIHRydWV5LiBUaGUgY2FsbGJhY2sgaXMgYm91bmRcbiAgICAgKiB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM7ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2s9MV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEgcHJvcGVydHkgbmFtZSBvclxuICAgICAqICBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiXG4gICAgICogIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkge1xuICAgICAqICAgcmV0dXJuIG51bSA+IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogZmFsc2UsICdlbXBsb3llcic6ICdzbGF0ZScgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICdzbGF0ZScgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICduYScgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmluaXRpYWwoY2hhcmFjdGVycywgJ2Jsb2NrZWQnKTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9XVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLmluaXRpYWwoY2hhcmFjdGVycywgeyAnZW1wbG95ZXInOiAnbmEnIH0pLCAnbmFtZScpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgbiA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG4gICAgICAgIHdoaWxlIChpbmRleC0tICYmIGNhbGxiYWNrKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIG4rKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IChjYWxsYmFjayA9PSBudWxsIHx8IHRoaXNBcmcpID8gMSA6IGNhbGxiYWNrIHx8IG47XG4gICAgICB9XG4gICAgICByZXR1cm4gc2xpY2UoYXJyYXksIDAsIG5hdGl2ZU1pbihuYXRpdmVNYXgoMCwgbGVuZ3RoIC0gbiksIGxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyBwcmVzZW50IGluIGFsbCBwcm92aWRlZCBhcnJheXMgdXNpbmdcbiAgICAgKiBzdHJpY3QgZXF1YWxpdHkgZm9yIGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMSwgMiwgM10sIFs1LCAyLCAxLCA0XSwgWzIsIDFdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnRlcnNlY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICAgIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgIGNhY2hlcyA9IGdldEFycmF5KCksXG4gICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSxcbiAgICAgICAgICB0cnVzdEluZGV4T2YgPSBpbmRleE9mID09PSBiYXNlSW5kZXhPZixcbiAgICAgICAgICBzZWVuID0gZ2V0QXJyYXkoKTtcblxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbYXJnc0luZGV4XTtcbiAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkge1xuICAgICAgICAgIGFyZ3MucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgY2FjaGVzLnB1c2godHJ1c3RJbmRleE9mICYmIHZhbHVlLmxlbmd0aCA+PSBsYXJnZUFycmF5U2l6ZSAmJlxuICAgICAgICAgICAgY3JlYXRlQ2FjaGUoYXJnc0luZGV4ID8gYXJnc1thcmdzSW5kZXhdIDogc2VlbikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgYXJyYXkgPSBhcmdzWzBdLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGNhY2hlc1swXTtcbiAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07XG5cbiAgICAgICAgaWYgKChjYWNoZSA/IGNhY2hlSW5kZXhPZihjYWNoZSwgdmFsdWUpIDogaW5kZXhPZihzZWVuLCB2YWx1ZSkpIDwgMCkge1xuICAgICAgICAgIGFyZ3NJbmRleCA9IGFyZ3NMZW5ndGg7XG4gICAgICAgICAgKGNhY2hlIHx8IHNlZW4pLnB1c2godmFsdWUpO1xuICAgICAgICAgIHdoaWxlICgtLWFyZ3NJbmRleCkge1xuICAgICAgICAgICAgY2FjaGUgPSBjYWNoZXNbYXJnc0luZGV4XTtcbiAgICAgICAgICAgIGlmICgoY2FjaGUgPyBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA6IGluZGV4T2YoYXJnc1thcmdzSW5kZXhdLCB2YWx1ZSkpIDwgMCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICAgIGNhY2hlID0gY2FjaGVzW2FyZ3NMZW5ndGhdO1xuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICByZWxlYXNlT2JqZWN0KGNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVsZWFzZUFycmF5KGNhY2hlcyk7XG4gICAgICByZWxlYXNlQXJyYXkoc2Vlbik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvciBsYXN0IGBuYCBlbGVtZW50cyBvZiBhbiBhcnJheS4gSWYgYSBjYWxsYmFjayBpc1xuICAgICAqIHByb3ZpZGVkIGVsZW1lbnRzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5IGFyZSByZXR1cm5lZCBhcyBsb25nIGFzIHRoZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkuIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czsgKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkIFwiXy5wbHVja1wiIHN0eWxlXG4gICAgICogY2FsbGJhY2sgd2lsbCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgY2FsbGJhY2tgIHRoZSBjcmVhdGVkIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrXG4gICAgICogd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdCxcbiAgICAgKiBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fG51bWJlcnxzdHJpbmd9IFtjYWxsYmFja10gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJldHVybi4gSWYgYSBwcm9wZXJ0eSBuYW1lIG9yXG4gICAgICogIG9iamVjdCBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgXCJfLnBsdWNrXCIgb3IgXCJfLndoZXJlXCJcbiAgICAgKiAgc3R5bGUgY2FsbGJhY2ssIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50KHMpIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSwgZnVuY3Rpb24obnVtKSB7XG4gICAgICogICByZXR1cm4gbnVtID4gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2Jsb2NrZWQnOiBmYWxzZSwgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdmcmVkJywgICAgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ3NsYXRlJyB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAgJ2VtcGxveWVyJzogJ25hJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy5sYXN0KGNoYXJhY3RlcnMsICdibG9ja2VkJyksICduYW1lJyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLndoZXJlXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5sYXN0KGNoYXJhY3RlcnMsIHsgJ2VtcGxveWVyJzogJ25hJyB9KTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdwZWJibGVzJywgJ2Jsb2NrZWQnOiB0cnVlLCAnZW1wbG95ZXInOiAnbmEnIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdChhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBuID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ251bWJlcicgJiYgY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICAgIGNhbGxiYWNrID0gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAzKTtcbiAgICAgICAgd2hpbGUgKGluZGV4LS0gJiYgY2FsbGJhY2soYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgbisrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gY2FsbGJhY2s7XG4gICAgICAgIGlmIChuID09IG51bGwgfHwgdGhpc0FyZykge1xuICAgICAgICAgIHJldHVybiBhcnJheSA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2xpY2UoYXJyYXksIG5hdGl2ZU1heCgwLCBsZW5ndGggLSBuKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIHVzaW5nIHN0cmljdFxuICAgICAqIGVxdWFsaXR5IGZvciBjb21wYXJpc29ucywgaS5lLiBgPT09YC4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0IGlzIHVzZWRcbiAgICAgKiBhcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlIG9yIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDMsIDEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAzLCAxLCAyLCAzXSwgMiwgMyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgaW5kZXggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG4gICAgICBpZiAodHlwZW9mIGZyb21JbmRleCA9PSAnbnVtYmVyJykge1xuICAgICAgICBpbmRleCA9IChmcm9tSW5kZXggPCAwID8gbmF0aXZlTWF4KDAsIGluZGV4ICsgZnJvbUluZGV4KSA6IG5hdGl2ZU1pbihmcm9tSW5kZXgsIGluZGV4IC0gMSkpICsgMTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgcHJvdmlkZWQgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGFycmF5IHVzaW5nIHN0cmljdCBlcXVhbGl0eSBmb3JcbiAgICAgKiBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDEsIDIsIDNdO1xuICAgICAqIF8ucHVsbChhcnJheSwgMiwgMyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGwoYXJyYXkpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIGFyZ3NJbmRleCA9IDAsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgtLSwgMSk7XG4gICAgICAgICAgICBsZW5ndGgtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbVxuICAgICAqIGBzdGFydGAgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgYGVuZGAuIElmIGBzdGFydGAgaXMgbGVzcyB0aGFuIGBzdG9wYCBhXG4gICAgICogemVyby1sZW5ndGggcmFuZ2UgaXMgY3JlYXRlZCB1bmxlc3MgYSBuZWdhdGl2ZSBgc3RlcGAgaXMgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYSBuZXcgcmFuZ2UgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgICAgc3RhcnQgPSArc3RhcnQgfHwgMDtcbiAgICAgIHN0ZXAgPSB0eXBlb2Ygc3RlcCA9PSAnbnVtYmVyJyA/IHN0ZXAgOiAoK3N0ZXAgfHwgMSk7XG5cbiAgICAgIGlmIChlbmQgPT0gbnVsbCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfVxuICAgICAgLy8gdXNlIGBBcnJheShsZW5ndGgpYCBzbyBlbmdpbmVzIGxpa2UgQ2hha3JhIGFuZCBWOCBhdm9pZCBzbG93ZXIgbW9kZXNcbiAgICAgIC8vIGh0dHA6Ly95b3V0dS5iZS9YQXFJcEdVOFpaayN0PTE3bTI1c1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KDAsIGNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGFuIGFycmF5IHRoYXQgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZXkgZm9yXG4gICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYFxuICAgICAqIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkXG4gICAgICogIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0LCA1LCA2XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obnVtKSB7IHJldHVybiBudW0gJSAyID09IDA7IH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0LCA2XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgY2FsbGJhY2sgPSBsb2Rhc2guY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LS0sIDEpO1xuICAgICAgICAgIGxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5pbml0aWFsYCB0aGlzIG1ldGhvZCBnZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb3JcbiAgICAgKiBmaXJzdCBgbmAgZWxlbWVudHMgb2YgYW4gYXJyYXkuIElmIGEgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZWxlbWVudHNcbiAgICAgKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgcmVzdWx0IGFzIGxvbmcgYXMgdGhlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyB0cnVleS4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBkcm9wLCB0YWlsXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxudW1iZXJ8c3RyaW5nfSBbY2FsbGJhY2s9MV0gVGhlIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAqICBwZXIgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGV4Y2x1ZGUuIElmIGEgcHJvcGVydHkgbmFtZSBvclxuICAgICAqICBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiXG4gICAgICogIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJlc3QoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8ucmVzdChbMSwgMiwgM10sIGZ1bmN0aW9uKG51bSkge1xuICAgICAqICAgcmV0dXJuIG51bSA8IDM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiB2YXIgY2hhcmFjdGVycyA9IFtcbiAgICAgKiAgIHsgJ25hbWUnOiAnYmFybmV5JywgICdibG9ja2VkJzogdHJ1ZSwgICdlbXBsb3llcic6ICdzbGF0ZScgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgICdibG9ja2VkJzogZmFsc2UsICAnZW1wbG95ZXInOiAnc2xhdGUnIH0sXG4gICAgICogICB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYmxvY2tlZCc6IHRydWUsICdlbXBsb3llcic6ICduYScgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBcIl8ucGx1Y2tcIiBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnBsdWNrKF8ucmVzdChjaGFyYWN0ZXJzLCAnYmxvY2tlZCcpLCAnbmFtZScpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy53aGVyZVwiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucmVzdChjaGFyYWN0ZXJzLCB7ICdlbXBsb3llcic6ICdzbGF0ZScgfSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAncGViYmxlcycsICdibG9ja2VkJzogdHJ1ZSwgJ2VtcGxveWVyJzogJ25hJyB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3QoYXJyYXksIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdudW1iZXInICYmIGNhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG4gPSAwLFxuICAgICAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGNhbGxiYWNrKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIG4rKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IChjYWxsYmFjayA9PSBudWxsIHx8IHRoaXNBcmcpID8gMSA6IG5hdGl2ZU1heCgwLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2xpY2UoYXJyYXksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZXMgYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSB0aGUgc21hbGxlc3QgaW5kZXggYXQgd2hpY2ggYSB2YWx1ZVxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGEgZ2l2ZW4gc29ydGVkIGFycmF5IGluIG9yZGVyIHRvIG1haW50YWluIHRoZSBzb3J0XG4gICAgICogb3JkZXIgb2YgdGhlIGFycmF5LiBJZiBhIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yXG4gICAgICogYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpciBzb3J0IHJhbmtpbmcuIFRoZVxuICAgICAqIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ucGx1Y2tcIiBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGNhbGxiYWNrYCB0aGUgY3JlYXRlZCBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFja1xuICAgICAqIHdpbGwgcmV0dXJuIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBvYmplY3QsXG4gICAgICogZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkXG4gICAgICogIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFsyMCwgMzAsIDUwXSwgNDApO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIFwiXy5wbHVja1wiIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uc29ydGVkSW5kZXgoW3sgJ3gnOiAyMCB9LCB7ICd4JzogMzAgfSwgeyAneCc6IDUwIH1dLCB7ICd4JzogNDAgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiB2YXIgZGljdCA9IHtcbiAgICAgKiAgICd3b3JkVG9OdW1iZXInOiB7ICd0d2VudHknOiAyMCwgJ3RoaXJ0eSc6IDMwLCAnZm91cnR5JzogNDAsICdmaWZ0eSc6IDUwIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleChbJ3R3ZW50eScsICd0aGlydHknLCAnZmlmdHknXSwgJ2ZvdXJ0eScsIGZ1bmN0aW9uKHdvcmQpIHtcbiAgICAgKiAgIHJldHVybiBkaWN0LndvcmRUb051bWJlclt3b3JkXTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFsndHdlbnR5JywgJ3RoaXJ0eScsICdmaWZ0eSddLCAnZm91cnR5JywgZnVuY3Rpb24od29yZCkge1xuICAgICAqICAgcmV0dXJuIHRoaXMud29yZFRvTnVtYmVyW3dvcmRdO1xuICAgICAqIH0sIGRpY3QpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiBsb3c7XG5cbiAgICAgIC8vIGV4cGxpY2l0bHkgcmVmZXJlbmNlIGBpZGVudGl0eWAgZm9yIGJldHRlciBpbmxpbmluZyBpbiBGaXJlZm94XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gbG9kYXNoLmNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrLCB0aGlzQXJnLCAxKSA6IGlkZW50aXR5O1xuICAgICAgdmFsdWUgPSBjYWxsYmFjayh2YWx1ZSk7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDE7XG4gICAgICAgIChjYWxsYmFjayhhcnJheVttaWRdKSA8IHZhbHVlKVxuICAgICAgICAgID8gbG93ID0gbWlkICsgMVxuICAgICAgICAgIDogaGlnaCA9IG1pZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzLCBpbiBvcmRlciwgb2YgdGhlIHByb3ZpZGVkIGFycmF5cyB1c2luZ1xuICAgICAqIHN0cmljdCBlcXVhbGl0eSBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5XSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMSwgMiwgM10sIFs1LCAyLCAxLCA0XSwgWzIsIDFdKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNSwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlvbigpIHtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIHRydWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLXZhbHVlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSB1c2luZyBzdHJpY3QgZXF1YWxpdHlcbiAgICAgKiBmb3IgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuIElmIHRoZSBhcnJheSBpcyBzb3J0ZWQsIHByb3ZpZGluZ1xuICAgICAqIGB0cnVlYCBmb3IgYGlzU29ydGVkYCB3aWxsIHVzZSBhIGZhc3RlciBhbGdvcml0aG0uIElmIGEgY2FsbGJhY2sgaXMgcHJvdmlkZWRcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgY2FsbGJhY2sgYmVmb3JlIHVuaXF1ZW5lc3NcbiAgICAgKiBpcyBjb21wdXRlZC4gVGhlIGNhbGxiYWNrIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOyAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLnBsdWNrXCIgc3R5bGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBjYWxsYmFja2AgdGhlIGNyZWF0ZWQgXCJfLndoZXJlXCIgc3R5bGUgY2FsbGJhY2tcbiAgICAgKiB3aWxsIHJldHVybiBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LFxuICAgICAqIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyB1bmlxdWVcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTb3J0ZWQ9ZmFsc2VdIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGBhcnJheWAgaXMgc29ydGVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2NhbGxiYWNrPWlkZW50aXR5XSBUaGUgZnVuY3Rpb24gY2FsbGVkXG4gICAgICogIHBlciBpdGVyYXRpb24uIElmIGEgcHJvcGVydHkgbmFtZSBvciBvYmplY3QgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkXG4gICAgICogIHRvIGNyZWF0ZSBhIFwiXy5wbHVja1wiIG9yIFwiXy53aGVyZVwiIHN0eWxlIGNhbGxiYWNrLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjYWxsYmFja2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGEgZHVwbGljYXRlLXZhbHVlLWZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMSwgMiwgMSwgMywgMV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy51bmlxKFsxLCAxLCAyLCAyLCAzXSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnVuaXEoWydBJywgJ2InLCAnQycsICdhJywgJ0InLCAnYyddLCBmdW5jdGlvbihsZXR0ZXIpIHsgcmV0dXJuIGxldHRlci50b0xvd2VyQ2FzZSgpOyB9KTtcbiAgICAgKiAvLyA9PiBbJ0EnLCAnYicsICdDJ11cbiAgICAgKlxuICAgICAqIF8udW5pcShbMSwgMi41LCAzLCAxLjUsIDIsIDMuNV0sIGZ1bmN0aW9uKG51bSkgeyByZXR1cm4gdGhpcy5mbG9vcihudW0pOyB9LCBNYXRoKTtcbiAgICAgKiAvLyA9PiBbMSwgMi41LCAzXVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgXCJfLnBsdWNrXCIgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy51bmlxKFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxKGFycmF5LCBpc1NvcnRlZCwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIC8vIGp1Z2dsZSBhcmd1bWVudHNcbiAgICAgIGlmICh0eXBlb2YgaXNTb3J0ZWQgIT0gJ2Jvb2xlYW4nICYmIGlzU29ydGVkICE9IG51bGwpIHtcbiAgICAgICAgdGhpc0FyZyA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayA9ICh0eXBlb2YgaXNTb3J0ZWQgIT0gJ2Z1bmN0aW9uJyAmJiB0aGlzQXJnICYmIHRoaXNBcmdbaXNTb3J0ZWRdID09PSBhcnJheSkgPyBudWxsIDogaXNTb3J0ZWQ7XG4gICAgICAgIGlzU29ydGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkge1xuICAgICAgICBjYWxsYmFjayA9IGxvZGFzaC5jcmVhdGVDYWxsYmFjayhjYWxsYmFjaywgdGhpc0FyZywgMyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYXJyYXksIGlzU29ydGVkLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIHByb3ZpZGVkIHZhbHVlcyB1c2luZyBzdHJpY3QgZXF1YWxpdHkgZm9yXG4gICAgICogY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlzXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZV0gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMSwgMiwgMSwgMCwgMywgMSwgNF0sIDAsIDEpO1xuICAgICAqIC8vID0+IFsyLCAzLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdpdGhvdXQoYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlRGlmZmVyZW5jZShhcnJheSwgc2xpY2UoYXJndW1lbnRzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzLlxuICAgICAqIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5c1xuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheV0gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsxLCAyLCAzXSwgWzUsIDIsIDEsIDRdKTtcbiAgICAgKiAvLyA9PiBbMywgNSwgNF1cbiAgICAgKlxuICAgICAqIF8ueG9yKFsxLCAyLCA1XSwgWzIsIDMsIDVdLCBbMywgNCwgNV0pO1xuICAgICAqIC8vID0+IFsxLCA0LCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHhvcigpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIGlmIChpc0FycmF5KGFycmF5KSB8fCBpc0FyZ3VtZW50cyhhcnJheSkpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0XG4gICAgICAgICAgICA/IGJhc2VVbmlxKGJhc2VEaWZmZXJlbmNlKHJlc3VsdCwgYXJyYXkpLmNvbmNhdChiYXNlRGlmZmVyZW5jZShhcnJheSwgcmVzdWx0KSkpXG4gICAgICAgICAgICA6IGFycmF5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0IHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyB1bnppcFxuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXldIEFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2ZyZWQnLCAnYmFybmV5J10sIFszMCwgNDBdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydmcmVkJywgMzAsIHRydWVdLCBbJ2Jhcm5leScsIDQwLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwKCkge1xuICAgICAgdmFyIGFycmF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHMgOiBhcmd1bWVudHNbMF0sXG4gICAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IG1heChwbHVjayhhcnJheSwgJ2xlbmd0aCcpKSA6IDAsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoIDwgMCA/IDAgOiBsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gcGx1Y2soYXJyYXksIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgZnJvbSBhcnJheXMgb2YgYGtleXNgIGFuZCBgdmFsdWVzYC4gUHJvdmlkZVxuICAgICAqIGVpdGhlciBhIHNpbmdsZSB0d28gZGltZW5zaW9uYWwgYXJyYXksIGkuZS4gYFtba2V5MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYFxuICAgICAqIG9yIHR3byBhcnJheXMsIG9uZSBvZiBga2V5c2AgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIG9iamVjdFxuICAgICAqIEBjYXRlZ29yeSBBcnJheXNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBhcnJheSBvZiBrZXlzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGdpdmVuIGtleXMgYW5kXG4gICAgICogIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2ZyZWQnLCAnYmFybmV5J10sIFszMCwgNDBdKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogMzAsICdiYXJuZXknOiA0MCB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KGtleXMsIHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0ga2V5cyA/IGtleXMubGVuZ3RoIDogMCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgaWYgKCF2YWx1ZXMgJiYgbGVuZ3RoICYmICFpc0FycmF5KGtleXNbMF0pKSB7XG4gICAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSkge1xuICAgICAgICAgIHJlc3VsdFtrZXlbMF1dID0ga2V5WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYGZ1bmNgLCB3aXRoICB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kXG4gICAgICogYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCBvbmx5IGFmdGVyIGJlaW5nIGNhbGxlZCBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlXG4gICAgICogIGBmdW5jYCBpcyBleGVjdXRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gbG9ncyAnRG9uZSBzYXZpbmchJywgYWZ0ZXIgYWxsIHNhdmVzIGhhdmUgY29tcGxldGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCBwcmVwZW5kcyBhbnkgYWRkaXRpb25hbCBgYmluZGAgYXJndW1lbnRzIHRvIHRob3NlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBmdW5jdGlvbihncmVldGluZykge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy5uYW1lO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBmdW5jID0gXy5iaW5kKGZ1bmMsIHsgJ25hbWUnOiAnZnJlZCcgfSwgJ2hpJyk7XG4gICAgICogZnVuYygpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJpbmQoZnVuYywgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAyXG4gICAgICAgID8gY3JlYXRlV3JhcHBlcihmdW5jLCAxNywgc2xpY2UoYXJndW1lbnRzLCAyKSwgbnVsbCwgdGhpc0FyZylcbiAgICAgICAgOiBjcmVhdGVXcmFwcGVyKGZ1bmMsIDEsIG51bGwsIG51bGwsIHRoaXNBcmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgKiBtZXRob2QuIE1ldGhvZCBuYW1lcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5c1xuICAgICAqIG9mIG1ldGhvZCBuYW1lcy4gSWYgbm8gbWV0aG9kIG5hbWVzIGFyZSBwcm92aWRlZCBhbGwgdGhlIGZ1bmN0aW9uIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YCB3aWxsIGJlIGJvdW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiaW5kIGFuZCBhc3NpZ24gdGhlIGJvdW5kIG1ldGhvZHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IFttZXRob2ROYW1lXSBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0b1xuICAgICAqICBiaW5kLCBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBtZXRob2QgbmFtZXMgb3IgYXJyYXlzIG9mIG1ldGhvZCBuYW1lcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdmlldyA9IHtcbiAgICAgKiAgICdsYWJlbCc6ICdkb2NzJyxcbiAgICAgKiAgICdvbkNsaWNrJzogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTsgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldyk7XG4gICAgICogalF1ZXJ5KCcjZG9jcycpLm9uKCdjbGljaycsIHZpZXcub25DbGljayk7XG4gICAgICogLy8gPT4gbG9ncyAnY2xpY2tlZCBkb2NzJywgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiaW5kQWxsKG9iamVjdCkge1xuICAgICAgdmFyIGZ1bmNzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBiYXNlRmxhdHRlbihhcmd1bWVudHMsIHRydWUsIGZhbHNlLCAxKSA6IGZ1bmN0aW9ucyhvYmplY3QpLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZnVuY3MubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gZnVuY3NbaW5kZXhdO1xuICAgICAgICBvYmplY3Rba2V5XSA9IGNyZWF0ZVdyYXBwZXIob2JqZWN0W2tleV0sIDEsIG51bGwsIG51bGwsIG9iamVjdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBvYmplY3Rba2V5XWBcbiAgICAgKiBhbmQgcHJlcGVuZHMgYW55IGFkZGl0aW9uYWwgYGJpbmRLZXlgIGFyZ3VtZW50cyB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYm91bmRcbiAgICAgKiBmdW5jdGlvbi4gVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0b1xuICAgICAqIHJlZmVyZW5jZSBtZXRob2RzIHRoYXQgd2lsbCBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LlxuICAgICAqIFNlZSBodHRwOi8vbWljaGF1eC5jYS9hcnRpY2xlcy9sYXp5LWZ1bmN0aW9uLWRlZmluaXRpb24tcGF0dGVybi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ10gQXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ25hbWUnOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZykge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLm5hbWU7XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogZnVuYygpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy5uYW1lICsgJyEnO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBmdW5jKCk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmluZEtleShvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAyXG4gICAgICAgID8gY3JlYXRlV3JhcHBlcihrZXksIDE5LCBzbGljZShhcmd1bWVudHMsIDIpLCBudWxsLCBvYmplY3QpXG4gICAgICAgIDogY3JlYXRlV3JhcHBlcihrZXksIDMsIG51bGwsIG51bGwsIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbnMsXG4gICAgICogd2hlcmUgZWFjaCBmdW5jdGlvbiBjb25zdW1lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGZvbGxvd3MuXG4gICAgICogRm9yIGV4YW1wbGUsIGNvbXBvc2luZyB0aGUgZnVuY3Rpb25zIGBmKClgLCBgZygpYCwgYW5kIGBoKClgIHByb2R1Y2VzIGBmKGcoaCgpKSlgLlxuICAgICAqIEVhY2ggZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNvbXBvc2VkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IFtmdW5jXSBGdW5jdGlvbnMgdG8gY29tcG9zZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYWxOYW1lTWFwID0ge1xuICAgICAqICAgJ3BlYmJsZXMnOiAncGVuZWxvcGUnXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBmb3JtYXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICogICBuYW1lID0gcmVhbE5hbWVNYXBbbmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBuYW1lO1xuICAgICAqICAgcmV0dXJuIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBncmVldCA9IGZ1bmN0aW9uKGZvcm1hdHRlZCkge1xuICAgICAqICAgcmV0dXJuICdIaXlhICcgKyBmb3JtYXR0ZWQgKyAnISc7XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciB3ZWxjb21lID0gXy5jb21wb3NlKGdyZWV0LCBmb3JtYXQpO1xuICAgICAqIHdlbGNvbWUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnSGl5YSBQZW5lbG9wZSEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgICAgIHZhciBmdW5jcyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBsZW5ndGggPSBmdW5jcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuY3NbbGVuZ3RoXSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgbGVuZ3RoID0gZnVuY3MubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgIGFyZ3MgPSBbZnVuY3NbbGVuZ3RoXS5hcHBseSh0aGlzLCBhcmdzKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyZ3NbMF07XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHRzIG9uZSBvciBtb3JlIGFyZ3VtZW50cyBvZiBgZnVuY2AgdGhhdCB3aGVuXG4gICAgICogaW52b2tlZCBlaXRoZXIgZXhlY3V0ZXMgYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhbGwgYGZ1bmNgIGFyZ3VtZW50c1xuICAgICAqIGhhdmUgYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBvbmUgb3IgbW9yZSBvZiB0aGVcbiAgICAgKiByZW1haW5pbmcgYGZ1bmNgIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIGNhbiBiZSBzcGVjaWZpZWRcbiAgICAgKiBpZiBgZnVuYy5sZW5ndGhgIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGEgKyBiICsgYyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IDZcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHkpIHtcbiAgICAgIGFyaXR5ID0gdHlwZW9mIGFyaXR5ID09ICdudW1iZXInID8gYXJpdHkgOiAoK2FyaXR5IHx8IGZ1bmMubGVuZ3RoKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKGZ1bmMsIDQsIG51bGwsIG51bGwsIG51bGwsIGFyaXR5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGRlbGF5IHRoZSBleGVjdXRpb24gb2YgYGZ1bmNgIHVudGlsIGFmdGVyXG4gICAgICogYHdhaXRgIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgaW52b2tlZC5cbiAgICAgKiBQcm92aWRlIGFuIG9wdGlvbnMgb2JqZWN0IHRvIGluZGljYXRlIHRoYXQgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uXG4gICAgICogdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBTdWJzZXF1ZW50IGNhbGxzXG4gICAgICogdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBjYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCBgZnVuY2Agd2lsbCBiZSBjYWxsZWRcbiAgICAgKiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIGlzXG4gICAgICogaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV0gU3BlY2lmeSBleGVjdXRpb24gb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF0gVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdIFNwZWNpZnkgZXhlY3V0aW9uIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gYXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eFxuICAgICAqIHZhciBsYXp5TGF5b3V0ID0gXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCk7XG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIGxhenlMYXlvdXQpO1xuICAgICAqXG4gICAgICogLy8gZXhlY3V0ZSBgc2VuZE1haWxgIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHNcbiAgICAgKiBqUXVlcnkoJyNwb3N0Ym94Jykub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gZW5zdXJlIGBiYXRjaExvZ2AgaXMgZXhlY3V0ZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHNcbiAgICAgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gICAgICogc291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHtcbiAgICAgKiAgICdtYXhXYWl0JzogMTAwMFxuICAgICAqIH0sIGZhbHNlKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgYXJncyxcbiAgICAgICAgICBtYXhUaW1lb3V0SWQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHN0YW1wLFxuICAgICAgICAgIHRoaXNBcmcsXG4gICAgICAgICAgdGltZW91dElkLFxuICAgICAgICAgIHRyYWlsaW5nQ2FsbCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMCxcbiAgICAgICAgICBtYXhXYWl0ID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjtcbiAgICAgIH1cbiAgICAgIHdhaXQgPSBuYXRpdmVNYXgoMCwgd2FpdCkgfHwgMDtcbiAgICAgIGlmIChvcHRpb25zID09PSB0cnVlKSB7XG4gICAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJhaWxpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9IG9wdGlvbnMubGVhZGluZztcbiAgICAgICAgbWF4V2FpdCA9ICdtYXhXYWl0JyBpbiBvcHRpb25zICYmIChuYXRpdmVNYXgod2FpdCwgb3B0aW9ucy5tYXhXYWl0KSB8fCAwKTtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyBvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gICAgICB9XG4gICAgICB2YXIgZGVsYXllZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3coKSAtIHN0YW1wKTtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSB7XG4gICAgICAgICAgaWYgKG1heFRpbWVvdXRJZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpc0NhbGxlZCA9IHRyYWlsaW5nQ2FsbDtcbiAgICAgICAgICBtYXhUaW1lb3V0SWQgPSB0aW1lb3V0SWQgPSB0cmFpbGluZ0NhbGwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGlzQ2FsbGVkKSB7XG4gICAgICAgICAgICBsYXN0Q2FsbGVkID0gbm93KCk7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKCF0aW1lb3V0SWQgJiYgIW1heFRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICBhcmdzID0gdGhpc0FyZyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZGVsYXllZCwgcmVtYWluaW5nKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIG1heERlbGF5ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB9XG4gICAgICAgIG1heFRpbWVvdXRJZCA9IHRpbWVvdXRJZCA9IHRyYWlsaW5nQ2FsbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRyYWlsaW5nIHx8IChtYXhXYWl0ICE9PSB3YWl0KSkge1xuICAgICAgICAgIGxhc3RDYWxsZWQgPSBub3coKTtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIGlmICghdGltZW91dElkICYmICFtYXhUaW1lb3V0SWQpIHtcbiAgICAgICAgICAgIGFyZ3MgPSB0aGlzQXJnID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3RhbXAgPSBub3coKTtcbiAgICAgICAgdGhpc0FyZyA9IHRoaXM7XG4gICAgICAgIHRyYWlsaW5nQ2FsbCA9IHRyYWlsaW5nICYmICh0aW1lb3V0SWQgfHwgIWxlYWRpbmcpO1xuXG4gICAgICAgIGlmIChtYXhXYWl0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHZhciBsZWFkaW5nQ2FsbCA9IGxlYWRpbmcgJiYgIXRpbWVvdXRJZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW1heFRpbWVvdXRJZCAmJiAhbGVhZGluZykge1xuICAgICAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcmVtYWluaW5nID0gbWF4V2FpdCAtIChzdGFtcCAtIGxhc3RDYWxsZWQpLFxuICAgICAgICAgICAgICBpc0NhbGxlZCA9IHJlbWFpbmluZyA8PSAwO1xuXG4gICAgICAgICAgaWYgKGlzQ2FsbGVkKSB7XG4gICAgICAgICAgICBpZiAobWF4VGltZW91dElkKSB7XG4gICAgICAgICAgICAgIG1heFRpbWVvdXRJZCA9IGNsZWFyVGltZW91dChtYXhUaW1lb3V0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIW1heFRpbWVvdXRJZCkge1xuICAgICAgICAgICAgbWF4VGltZW91dElkID0gc2V0VGltZW91dChtYXhEZWxheWVkLCByZW1haW5pbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDYWxsZWQgJiYgdGltZW91dElkKSB7XG4gICAgICAgICAgdGltZW91dElkID0gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRpbWVvdXRJZCAmJiB3YWl0ICE9PSBtYXhXYWl0KSB7XG4gICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChkZWxheWVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZGluZ0NhbGwpIHtcbiAgICAgICAgICBpc0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDYWxsZWQgJiYgIXRpbWVvdXRJZCAmJiAhbWF4VGltZW91dElkKSB7XG4gICAgICAgICAgYXJncyA9IHRoaXNBcmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBleGVjdXRpbmcgdGhlIGBmdW5jYCBmdW5jdGlvbiB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLlxuICAgICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQgaXMgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmddIEFyZ3VtZW50cyB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkgeyBjb25zb2xlLmxvZyh0ZXh0KTsgfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gbG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBvciBtb3JlIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlZmVyKGZ1bmMpIHtcbiAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMsIDEpO1xuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGBmdW5jYCBmdW5jdGlvbiBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIHdpbGwgYmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQgaXMgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBleGVjdXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlbGF5KGZ1bmN0aW9uKHRleHQpIHsgY29uc29sZS5sb2codGV4dCk7IH0sIDEwMDAsICdsYXRlcicpO1xuICAgICAqIC8vID0+IGxvZ3MgJ2xhdGVyJyBhZnRlciBvbmUgc2Vjb25kXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsYXkoZnVuYywgd2FpdCkge1xuICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cywgMik7XG4gICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICAgICAqIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0XG4gICAgICogYmFzZWQgb24gdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZVxuICAgICAqIGZpcnN0IGFyZ3VtZW50IHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuXG4gICAgICogVGhlIGBmdW5jYCBpcyBleGVjdXRlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICogVGhlIHJlc3VsdCBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemluZyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZpYm9uYWNjaSA9IF8ubWVtb2l6ZShmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiA8IDIgPyBuIDogZmlib25hY2NpKG4gLSAxKSArIGZpYm9uYWNjaShuIC0gMik7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBmaWJvbmFjY2koOSlcbiAgICAgKiAvLyA9PiAzNFxuICAgICAqXG4gICAgICogdmFyIGRhdGEgPSB7XG4gICAgICogICAnZnJlZCc6IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIC8vIG1vZGlmeWluZyB0aGUgcmVzdWx0IGNhY2hlXG4gICAgICogdmFyIGdldCA9IF8ubWVtb2l6ZShmdW5jdGlvbihuYW1lKSB7IHJldHVybiBkYXRhW25hbWVdOyB9LCBfLmlkZW50aXR5KTtcbiAgICAgKiBnZXQoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICpcbiAgICAgKiBnZXQuY2FjaGUucGViYmxlcy5uYW1lID0gJ3BlbmVsb3BlJztcbiAgICAgKiBnZXQoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ3BlbmVsb3BlJywgJ2FnZSc6IDEgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgICAgIGlmICghaXNGdW5jdGlvbihmdW5jKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yO1xuICAgICAgfVxuICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IG1lbW9pemVkLmNhY2hlLFxuICAgICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDoga2V5UHJlZml4ICsgYXJndW1lbnRzWzBdO1xuXG4gICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBrZXkpXG4gICAgICAgICAgPyBjYWNoZVtrZXldXG4gICAgICAgICAgOiAoY2FjaGVba2V5XSA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IHt9O1xuICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gZXhlY3V0ZSBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzIHRvXG4gICAgICogdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY2FsbC4gVGhlIGBmdW5jYCBpcyBleGVjdXRlZFxuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIC8vIGBpbml0aWFsaXplYCBleGVjdXRlcyBgY3JlYXRlQXBwbGljYXRpb25gIG9uY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgICAgIHZhciByYW4sXG4gICAgICAgICAgcmVzdWx0O1xuXG4gICAgICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHJhbikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIGNsZWFyIHRoZSBgZnVuY2AgdmFyaWFibGUgc28gdGhlIGZ1bmN0aW9uIG1heSBiZSBnYXJiYWdlIGNvbGxlY3RlZFxuICAgICAgICBmdW5jID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBpbnZva2VzIGBmdW5jYCB3aXRoIGFueSBhZGRpdGlvbmFsXG4gICAgICogYHBhcnRpYWxgIGFyZ3VtZW50cyBwcmVwZW5kZWQgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi4gVGhpc1xuICAgICAqIG1ldGhvZCBpcyBzaW1pbGFyIHRvIGBfLmJpbmRgIGV4Y2VwdCBpdCBkb2VzICoqbm90KiogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nLCBuYW1lKSB7IHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7IH07XG4gICAgICogdmFyIGhpID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGknKTtcbiAgICAgKiBoaSgnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhcnRpYWwoZnVuYykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgMTYsIHNsaWNlKGFyZ3VtZW50cywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFydGlhbGAgZXhjZXB0IHRoYXQgYHBhcnRpYWxgIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBhcHBlbmRlZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnXSBBcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0c0RlZXAgPSBfLnBhcnRpYWxSaWdodChfLm1lcmdlLCBfLmRlZmF1bHRzKTtcbiAgICAgKlxuICAgICAqIHZhciBvcHRpb25zID0ge1xuICAgICAqICAgJ3ZhcmlhYmxlJzogJ2RhdGEnLFxuICAgICAqICAgJ2ltcG9ydHMnOiB7ICdqcSc6ICQgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBkZWZhdWx0c0RlZXAob3B0aW9ucywgXy50ZW1wbGF0ZVNldHRpbmdzKTtcbiAgICAgKlxuICAgICAqIG9wdGlvbnMudmFyaWFibGVcbiAgICAgKiAvLyA9PiAnZGF0YSdcbiAgICAgKlxuICAgICAqIG9wdGlvbnMuaW1wb3J0c1xuICAgICAqIC8vID0+IHsgJ18nOiBfLCAnanEnOiAkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJ0aWFsUmlnaHQoZnVuYykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgMzIsIG51bGwsIHNsaWNlKGFyZ3VtZW50cywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGV4ZWN1dGVkLCB3aWxsIG9ubHkgY2FsbCB0aGUgYGZ1bmNgIGZ1bmN0aW9uXG4gICAgICogYXQgbW9zdCBvbmNlIHBlciBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBQcm92aWRlIGFuIG9wdGlvbnMgb2JqZWN0IHRvXG4gICAgICogaW5kaWNhdGUgdGhhdCBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2VcbiAgICAgKiBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiB3aWxsXG4gICAgICogcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGNhbGwuXG4gICAgICpcbiAgICAgKiBOb3RlOiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgIGBmdW5jYCB3aWxsIGJlIGNhbGxlZFxuICAgICAqIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gaXNcbiAgICAgKiBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgZXhlY3V0aW9ucyB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV0gU3BlY2lmeSBleGVjdXRpb24gb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdIFNwZWNpZnkgZXhlY3V0aW9uIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gYXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZ1xuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApO1xuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCB0aHJvdHRsZWQpO1xuICAgICAqXG4gICAgICogLy8gZXhlY3V0ZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzXG4gICAgICogalF1ZXJ5KCcuaW50ZXJhY3RpdmUnKS5vbignY2xpY2snLCBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwge1xuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgbGVhZGluZyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyBvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIGRlYm91bmNlT3B0aW9ucy5sZWFkaW5nID0gbGVhZGluZztcbiAgICAgIGRlYm91bmNlT3B0aW9ucy5tYXhXYWl0ID0gd2FpdDtcbiAgICAgIGRlYm91bmNlT3B0aW9ucy50cmFpbGluZyA9IHRyYWlsaW5nO1xuXG4gICAgICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwgZGVib3VuY2VPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGFzIGl0c1xuICAgICAqIGZpcnN0IGFyZ3VtZW50LiBBZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24uIFRoZSB3cmFwcGVyIGlzIGV4ZWN1dGVkIHdpdGhcbiAgICAgKiB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25zXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcCA9IF8ud3JhcChfLmVzY2FwZSwgZnVuY3Rpb24oZnVuYywgdGV4dCkge1xuICAgICAqICAgcmV0dXJuICc8cD4nICsgZnVuYyh0ZXh0KSArICc8L3A+JztcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHAoJ0ZyZWQsIFdpbG1hLCAmIFBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+RnJlZCwgV2lsbWEsICZhbXA7IFBlYmJsZXM8L3A+J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHdyYXBwZXIsIDE2LCBbdmFsdWVdKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnbmFtZSc6ICdmcmVkJyB9O1xuICAgICAqIHZhciBnZXR0ZXIgPSBfLmNvbnN0YW50KG9iamVjdCk7XG4gICAgICogZ2V0dGVyKCkgPT09IG9iamVjdDtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIGNhbGxiYWNrIGJvdW5kIHRvIGFuIG9wdGlvbmFsIGB0aGlzQXJnYC4gSWYgYGZ1bmNgIGlzIGEgcHJvcGVydHlcbiAgICAgKiBuYW1lIHRoZSBjcmVhdGVkIGNhbGxiYWNrIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgYSBnaXZlbiBlbGVtZW50LlxuICAgICAqIElmIGBmdW5jYCBpcyBhbiBvYmplY3QgdGhlIGNyZWF0ZWQgY2FsbGJhY2sgd2lsbCByZXR1cm4gYHRydWVgIGZvciBlbGVtZW50c1xuICAgICAqIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudCBvYmplY3QgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHsqfSBbZnVuYz1pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIGNhbGxiYWNrIGFjY2VwdHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gd3JhcCB0byBjcmVhdGUgY3VzdG9tIGNhbGxiYWNrIHNob3J0aGFuZHNcbiAgICAgKiBfLmNyZWF0ZUNhbGxiYWNrID0gXy53cmFwKF8uY3JlYXRlQ2FsbGJhY2ssIGZ1bmN0aW9uKGZ1bmMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICogICB2YXIgbWF0Y2ggPSAvXiguKz8pX18oW2dsXXQpKC4rKSQvLmV4ZWMoY2FsbGJhY2spO1xuICAgICAqICAgcmV0dXJuICFtYXRjaCA/IGZ1bmMoY2FsbGJhY2ssIHRoaXNBcmcpIDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICogICAgIHJldHVybiBtYXRjaFsyXSA9PSAnZ3QnID8gb2JqZWN0W21hdGNoWzFdXSA+IG1hdGNoWzNdIDogb2JqZWN0W21hdGNoWzFdXSA8IG1hdGNoWzNdO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKGNoYXJhY3RlcnMsICdhZ2VfX2d0MzgnKTtcbiAgICAgKiAvLyA9PiBbeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDQwIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGZ1bmM7XG4gICAgICBpZiAoZnVuYyA9PSBudWxsIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gYmFzZUNyZWF0ZUNhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KTtcbiAgICAgIH1cbiAgICAgIC8vIGhhbmRsZSBcIl8ucGx1Y2tcIiBzdHlsZSBjYWxsYmFjayBzaG9ydGhhbmRzXG4gICAgICBpZiAodHlwZSAhPSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gcHJvcGVydHkoZnVuYyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKGZ1bmMpLFxuICAgICAgICAgIGtleSA9IHByb3BzWzBdLFxuICAgICAgICAgIGEgPSBmdW5jW2tleV07XG5cbiAgICAgIC8vIGhhbmRsZSBcIl8ud2hlcmVcIiBzdHlsZSBjYWxsYmFjayBzaG9ydGhhbmRzXG4gICAgICBpZiAocHJvcHMubGVuZ3RoID09IDEgJiYgYSA9PT0gYSAmJiAhaXNPYmplY3QoYSkpIHtcbiAgICAgICAgLy8gZmFzdCBwYXRoIHRoZSBjb21tb24gY2FzZSBvZiBwcm92aWRpbmcgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICAgICAgLy8gcHJvcGVydHkgY29udGFpbmluZyBhIHByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgICAgdmFyIGIgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICByZXR1cm4gYSA9PT0gYiAmJiAoYSAhPT0gMCB8fCAoMSAvIGEgPT0gMSAvIGIpKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgIGlmICghKHJlc3VsdCA9IGJhc2VJc0VxdWFsKG9iamVjdFtwcm9wc1tsZW5ndGhdXSwgZnVuY1twcm9wc1tsZW5ndGhdXSwgbnVsbCwgdHJ1ZSkpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgYCZgLCBgPGAsIGA+YCwgYFwiYCwgYW5kIGAnYCBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnRnJlZCwgV2lsbWEsICYgUGViYmxlcycpO1xuICAgICAqIC8vID0+ICdGcmVkLCBXaWxtYSwgJmFtcDsgUGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nID09IG51bGwgPyAnJyA6IFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLCBlc2NhcGVIdG1sQ2hhcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ25hbWUnOiAnZnJlZCcgfTtcbiAgICAgKiBfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdDtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiBtZXRob2RzIHdpbGwgYmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdGllc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgdGhlIGZ1bmN0aW9ucyBhZGRlZCBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICAgICAqICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAnY2FwaXRhbGl6ZSc6IGNhcGl0YWxpemUgfSk7XG4gICAgICogXy5jYXBpdGFsaXplKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfKCdmcmVkJykuY2FwaXRhbGl6ZSgpLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ2NhcGl0YWxpemUnOiBjYXBpdGFsaXplIH0sIHsgJ2NoYWluJzogZmFsc2UgfSk7XG4gICAgICogXygnZnJlZCcpLmNhcGl0YWxpemUoKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgdmFyIGNoYWluID0gdHJ1ZSxcbiAgICAgICAgICBtZXRob2ROYW1lcyA9IHNvdXJjZSAmJiBmdW5jdGlvbnMoc291cmNlKTtcblxuICAgICAgaWYgKCFzb3VyY2UgfHwgKCFvcHRpb25zICYmICFtZXRob2ROYW1lcy5sZW5ndGgpKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGN0b3IgPSBsb2Rhc2hXcmFwcGVyO1xuICAgICAgICBzb3VyY2UgPSBvYmplY3Q7XG4gICAgICAgIG9iamVjdCA9IGxvZGFzaDtcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBmdW5jdGlvbnMoc291cmNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBjaGFpbiA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2hhaW4nIGluIG9wdGlvbnMpIHtcbiAgICAgICAgY2hhaW4gPSBvcHRpb25zLmNoYWluO1xuICAgICAgfVxuICAgICAgdmFyIGN0b3IgPSBvYmplY3QsXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihjdG9yKTtcblxuICAgICAgZm9yRWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgZnVuYyA9IG9iamVjdFttZXRob2ROYW1lXSA9IHNvdXJjZVttZXRob2ROYW1lXTtcbiAgICAgICAgaWYgKGlzRnVuYykge1xuICAgICAgICAgIGN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICAgICAgYXJncyA9IFt2YWx1ZV07XG5cbiAgICAgICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSByZXN1bHQgJiYgaXNPYmplY3QocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBjdG9yKHJlc3VsdCk7XG4gICAgICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgJ18nIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0b1xuICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbG9kYXNoID0gXy5ub0NvbmZsaWN0KCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgIGNvbnRleHQuXyA9IG9sZERhc2g7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG5vLW9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ25hbWUnOiAnZnJlZCcgfTtcbiAgICAgKiBfLm5vb3Aob2JqZWN0KSA9PT0gdW5kZWZpbmVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub29wKCkge1xuICAgICAgLy8gbm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIFVuaXggZXBvY2hcbiAgICAgKiAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHN0YW1wID0gXy5ub3coKTtcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApOyB9KTtcbiAgICAgKiAvLyA9PiBsb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAgICAgKi9cbiAgICB2YXIgbm93ID0gaXNOYXRpdmUobm93ID0gRGF0ZS5ub3cpICYmIG5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LlxuICAgICAqIElmIGByYWRpeGAgaXMgYHVuZGVmaW5lZGAgb3IgYDBgIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIHRoZVxuICAgICAqIGB2YWx1ZWAgaXMgYSBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBtZXRob2QgYXZvaWRzIGRpZmZlcmVuY2VzIGluIG5hdGl2ZSBFUzMgYW5kIEVTNSBgcGFyc2VJbnRgXG4gICAgICogaW1wbGVtZW50YXRpb25zLiBTZWUgaHR0cDovL2VzNS5naXRodWIuaW8vI0UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXJzZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4XSBUaGUgcmFkaXggdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIHRvIHBhcnNlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG5ldyBpbnRlZ2VyIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKi9cbiAgICB2YXIgcGFyc2VJbnQgPSBuYXRpdmVQYXJzZUludCh3aGl0ZXNwYWNlICsgJzA4JykgPT0gOCA/IG5hdGl2ZVBhcnNlSW50IDogZnVuY3Rpb24odmFsdWUsIHJhZGl4KSB7XG4gICAgICAvLyBGaXJlZm94IDwgMjEgYW5kIE9wZXJhIDwgMTUgZm9sbG93IHRoZSBFUzMgc3BlY2lmaWVkIGltcGxlbWVudGF0aW9uIG9mIGBwYXJzZUludGBcbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludChpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS5yZXBsYWNlKHJlTGVhZGluZ1NwYWNlc0FuZFplcm9zLCAnJykgOiB2YWx1ZSwgcmFkaXggfHwgMCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBcIl8ucGx1Y2tcIiBzdHlsZSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyB0aGUgYGtleWAgdmFsdWUgb2YgYVxuICAgICAqIGdpdmVuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGNoYXJhY3RlcnMgPSBbXG4gICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiB2YXIgZ2V0TmFtZSA9IF8ucHJvcGVydHkoJ25hbWUnKTtcbiAgICAgKlxuICAgICAqIF8ubWFwKGNoYXJhY3RlcnMsIGdldE5hbWUpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkoY2hhcmFjdGVycywgZ2V0TmFtZSk7XG4gICAgICogLy8gPT4gW3sgJ25hbWUnOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkoa2V5KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIChpbmNsdXNpdmUpLiBJZiBvbmx5IG9uZVxuICAgICAqIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyIHdpbGwgYmVcbiAgICAgKiByZXR1cm5lZC4gSWYgYGZsb2F0aW5nYCBpcyB0cnVleSBvciBlaXRoZXIgYG1pbmAgb3IgYG1heGAgYXJlIGZsb2F0cyBhXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdGllc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluPTBdIFRoZSBtaW5pbXVtIHBvc3NpYmxlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTFdIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nPWZhbHNlXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGEgcmFuZG9tIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obWluLCBtYXgsIGZsb2F0aW5nKSB7XG4gICAgICB2YXIgbm9NaW4gPSBtaW4gPT0gbnVsbCxcbiAgICAgICAgICBub01heCA9IG1heCA9PSBudWxsO1xuXG4gICAgICBpZiAoZmxvYXRpbmcgPT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIG1pbiA9PSAnYm9vbGVhbicgJiYgbm9NYXgpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IG1pbjtcbiAgICAgICAgICBtaW4gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFub01heCAmJiB0eXBlb2YgbWF4ID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbWF4O1xuICAgICAgICAgIG5vTWF4ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vTWluICYmIG5vTWF4KSB7XG4gICAgICAgIG1heCA9IDE7XG4gICAgICB9XG4gICAgICBtaW4gPSArbWluIHx8IDA7XG4gICAgICBpZiAobm9NYXgpIHtcbiAgICAgICAgbWF4ID0gbWluO1xuICAgICAgICBtaW4gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gK21heCB8fCAwO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nIHx8IG1pbiAlIDEgfHwgbWF4ICUgMSkge1xuICAgICAgICB2YXIgcmFuZCA9IG5hdGl2ZVJhbmRvbSgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlTWluKG1pbiArIChyYW5kICogKG1heCAtIG1pbiArIHBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKycnKS5sZW5ndGggLSAxKSkpKSwgbWF4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKG1pbiwgbWF4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgdmFsdWUgb2YgcHJvcGVydHkgYGtleWAgb24gYG9iamVjdGAuIElmIGBrZXlgIGlzIGEgZnVuY3Rpb25cbiAgICAgKiBpdCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYG9iamVjdGAgYW5kIGl0cyByZXN1bHQgcmV0dXJuZWQsXG4gICAgICogZWxzZSB0aGUgcHJvcGVydHkgdmFsdWUgaXMgcmV0dXJuZWQuIElmIGBvYmplY3RgIGlzIGZhbHNleSB0aGVuIGB1bmRlZmluZWRgXG4gICAgICogaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAnY2hlZXNlJzogJ2NydW1wZXRzJyxcbiAgICAgKiAgICdzdHVmZic6IGZ1bmN0aW9uKCkge1xuICAgICAqICAgICByZXR1cm4gJ25vbnNlbnNlJztcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnY2hlZXNlJyk7XG4gICAgICogLy8gPT4gJ2NydW1wZXRzJ1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnc3R1ZmYnKTtcbiAgICAgKiAvLyA9PiAnbm9uc2Vuc2UnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAob2JqZWN0KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSkgPyBvYmplY3Rba2V5XSgpIDogdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtaWNyby10ZW1wbGF0aW5nIG1ldGhvZCB0aGF0IGhhbmRsZXMgYXJiaXRyYXJ5IGRlbGltaXRlcnMsIHByZXNlcnZlc1xuICAgICAqIHdoaXRlc3BhY2UsIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLlxuICAgICAqXG4gICAgICogTm90ZTogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkLCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXMgc291cmNlVVJMcyBmb3IgZWFzaWVyXG4gICAgICogZGVidWdnaW5nLiBTZWUgaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybFxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWU6XG4gICAgICogaHR0cDovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkc1xuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlOlxuICAgICAqIGh0dHA6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9zdGFibGUvZXh0ZW5zaW9ucy9zYW5kYm94aW5nRXZhbC5odG1sXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlIGRhdGEgb2JqZWN0IHVzZWQgdG8gcG9wdWxhdGUgdGhlIHRleHQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmVzY2FwZV0gVGhlIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZV0gVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHNdIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgbG9jYWwgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZV0gVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzb3VyY2VVUkxdIFRoZSBzb3VyY2VVUkwgb2YgdGhlIHRlbXBsYXRlJ3MgY29tcGlsZWQgc291cmNlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFyaWFibGVdIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxzdHJpbmd9IFJldHVybnMgYSBjb21waWxlZCBmdW5jdGlvbiB3aGVuIG5vIGBkYXRhYCBvYmplY3RcbiAgICAgKiAgaXMgZ2l2ZW4sIGVsc2UgaXQgcmV0dXJucyB0aGUgaW50ZXJwb2xhdGVkIHRleHQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IG5hbWUgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICduYW1lJzogJ2ZyZWQnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBIVE1MIGluIGRhdGEgcHJvcGVydHkgdmFsdWVzXG4gICAgICogXy50ZW1wbGF0ZSgnPGI+PCUtIHZhbHVlICU+PC9iPicsIHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTtcbiAgICAgKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+J1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZ2VuZXJhdGUgSFRNTFxuICAgICAqIHZhciBsaXN0ID0gJzwlIF8uZm9yRWFjaChwZW9wbGUsIGZ1bmN0aW9uKG5hbWUpIHsgJT48bGk+PCUtIG5hbWUgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogXy50ZW1wbGF0ZShsaXN0LCB7ICdwZW9wbGUnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgRVM2IGRlbGltaXRlciBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgZGVmYXVsdCBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyXG4gICAgICogXy50ZW1wbGF0ZSgnaGVsbG8gJHsgbmFtZSB9JywgeyAnbmFtZSc6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBpbnRlcm5hbCBgcHJpbnRgIGZ1bmN0aW9uIGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzXG4gICAgICogXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIG5hbWUpOyAlPiEnLCB7ICduYW1lJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBhIGN1c3RvbSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzID0ge1xuICAgICAqICAgJ2ludGVycG9sYXRlJzogL3t7KFtcXHNcXFNdKz8pfX0vZ1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLnRlbXBsYXRlKCdoZWxsbyB7eyBuYW1lIH19IScsIHsgJ25hbWUnOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYGltcG9ydHNgIG9wdGlvbiB0byBpbXBvcnQgalF1ZXJ5XG4gICAgICogdmFyIGxpc3QgPSAnPCUganEuZWFjaChwZW9wbGUsIGZ1bmN0aW9uKG5hbWUpIHsgJT48bGk+PCUtIG5hbWUgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogXy50ZW1wbGF0ZShsaXN0LCB7ICdwZW9wbGUnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSwgeyAnaW1wb3J0cyc6IHsgJ2pxJzogalF1ZXJ5IH0gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGVcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gbmFtZSAlPicsIG51bGwsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAgICAgKiBjb21waWxlZChkYXRhKTtcbiAgICAgKiAvLyA9PiBmaW5kIHRoZSBzb3VyY2Ugb2YgXCJncmVldGluZy5qc3RcIiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGVcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS5uYW1lICU+IScsIG51bGwsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pO1xuICAgICAqIGNvbXBpbGVkLnNvdXJjZTtcbiAgICAgKiAvLyA9PiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICogICB2YXIgX190LCBfX3AgPSAnJywgX19lID0gXy5lc2NhcGU7XG4gICAgICogICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS5uYW1lICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogICByZXR1cm4gX19wO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlYCBwcm9wZXJ0eSB0byBpbmxpbmUgY29tcGlsZWQgdGVtcGxhdGVzIGZvciBtZWFuaW5nZnVsXG4gICAgICogLy8gbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBhIHN0YWNrIHRyYWNlXG4gICAgICogZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY3dkLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHRleHQsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgIC8vIGJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvXG4gICAgICAvLyBhbmQgTGF1cmEgRG9rdG9yb3ZhJ3MgZG9ULmpzXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcbiAgICAgIHRleHQgPSBTdHJpbmcodGV4dCB8fCAnJyk7XG5cbiAgICAgIC8vIGF2b2lkIG1pc3NpbmcgZGVwZW5kZW5jaWVzIHdoZW4gYGl0ZXJhdG9yVGVtcGxhdGVgIGlzIG5vdCBkZWZpbmVkXG4gICAgICBvcHRpb25zID0gZGVmYXVsdHMoe30sIG9wdGlvbnMsIHNldHRpbmdzKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBkZWZhdWx0cyh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IHZhbHVlcyhpbXBvcnRzKTtcblxuICAgICAgdmFyIGlzRXZhbHVhdGluZyxcbiAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCxcbiAgICAgICAgICBzb3VyY2UgPSBcIl9fcCArPSAnXCI7XG5cbiAgICAgIC8vIGNvbXBpbGUgdGhlIHJlZ2V4cCB0byBtYXRjaCBlYWNoIGRlbGltaXRlclxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgdGV4dC5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgICAgICBpbnRlcnBvbGF0ZVZhbHVlIHx8IChpbnRlcnBvbGF0ZVZhbHVlID0gZXNUZW1wbGF0ZVZhbHVlKTtcblxuICAgICAgICAvLyBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHNcbiAgICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gcmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHNcbiAgICAgICAgaWYgKGVzY2FwZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuX19lKFwiICsgZXNjYXBlVmFsdWUgKyBcIikgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlVmFsdWUgKyBcIjtcXG5fX3AgKz0gJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuKChfX3QgPSAoXCIgKyBpbnRlcnBvbGF0ZVZhbHVlICsgXCIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgICAgLy8gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cyByZXF1aXJlcyByZXR1cm5pbmcgdGhlIGBtYXRjaGBcbiAgICAgICAgLy8gc3RyaW5nIGluIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWVcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIGlmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCwgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkXG4gICAgICAvLyBjb2RlIHRvIGFkZCB0aGUgZGF0YSBvYmplY3QgdG8gdGhlIHRvcCBvZiB0aGUgc2NvcGUgY2hhaW5cbiAgICAgIHZhciB2YXJpYWJsZSA9IG9wdGlvbnMudmFyaWFibGUsXG4gICAgICAgICAgaGFzVmFyaWFibGUgPSB2YXJpYWJsZTtcblxuICAgICAgaWYgKCFoYXNWYXJpYWJsZSkge1xuICAgICAgICB2YXJpYWJsZSA9ICdvYmonO1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAoJyArIHZhcmlhYmxlICsgJykge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gICAgICB9XG4gICAgICAvLyBjbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3NcbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gZnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keVxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyB2YXJpYWJsZSArICcpIHtcXG4nICtcbiAgICAgICAgKGhhc1ZhcmlhYmxlID8gJycgOiB2YXJpYWJsZSArICcgfHwgKCcgKyB2YXJpYWJsZSArICcgPSB7fSk7XFxuJykgK1xuICAgICAgICBcInZhciBfX3QsIF9fcCA9ICcnLCBfX2UgPSBfLmVzY2FwZVwiICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgIC8vIGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmxcbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnXFxuLypcXG4vLyMgc291cmNlVVJMPScgKyAob3B0aW9ucy5zb3VyY2VVUkwgfHwgJy9sb2Rhc2gvdGVtcGxhdGUvc291cmNlWycgKyAodGVtcGxhdGVDb3VudGVyKyspICsgJ10nKSArICdcXG4qLyc7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbihpbXBvcnRzS2V5cywgJ3JldHVybiAnICsgc291cmNlICsgc291cmNlVVJMKS5hcHBseSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGUuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdChkYXRhKTtcbiAgICAgIH1cbiAgICAgIC8vIHByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdgIG1ldGhvZCwgaW5cbiAgICAgIC8vIHN1cHBvcnRlZCBlbnZpcm9ubWVudHMsIG9yIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvclxuICAgICAgLy8gaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzc1xuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNhbGxiYWNrIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzXG4gICAgICogb2YgZWFjaCBjYWxsYmFjayBleGVjdXRpb24uIFRoZSBjYWxsYmFjayBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDsgKGluZGV4KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGNhbGxiYWNrYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBgY2FsbGJhY2tgIGV4ZWN1dGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGRpY2VSb2xscyA9IF8udGltZXMoMywgXy5wYXJ0aWFsKF8ucmFuZG9tLCAxLCA2KSk7XG4gICAgICogLy8gPT4gWzMsIDYsIDRdXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIGZ1bmN0aW9uKG4pIHsgbWFnZS5jYXN0U3BlbGwobik7IH0pO1xuICAgICAqIC8vID0+IGNhbGxzIGBtYWdlLmNhc3RTcGVsbChuKWAgdGhyZWUgdGltZXMsIHBhc3NpbmcgYG5gIG9mIGAwYCwgYDFgLCBhbmQgYDJgIHJlc3BlY3RpdmVseVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBmdW5jdGlvbihuKSB7IHRoaXMuY2FzdChuKTsgfSwgbWFnZSk7XG4gICAgICogLy8gPT4gYWxzbyBjYWxscyBgbWFnZS5jYXN0U3BlbGwobilgIHRocmVlIHRpbWVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIG4gPSAobiA9ICtuKSA+IC0xID8gbiA6IDA7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgICAgY2FsbGJhY2sgPSBiYXNlQ3JlYXRlQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXNBcmcsIDEpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBjYWxsYmFjayhpbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLmVzY2FwZWAgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdGllc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB1bmVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuZXNjYXBlKCdGcmVkLCBCYXJuZXkgJmFtcDsgUGViYmxlcycpO1xuICAgICAqIC8vID0+ICdGcmVkLCBCYXJuZXkgJiBQZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgcmV0dXJuIHN0cmluZyA9PSBudWxsID8gJycgOiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgcHJvdmlkZWQgdGhlIElEIHdpbGwgYmUgYXBwZW5kZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXhdIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gU3RyaW5nKHByZWZpeCA9PSBudWxsID8gJycgOiBwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgb2JqZWN0IHRoYXQgd3JhcHMgdGhlIGdpdmVuIHZhbHVlIHdpdGggZXhwbGljaXRcbiAgICAgKiBtZXRob2QgY2hhaW5pbmcgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICduYW1lJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gXy5jaGFpbihjaGFyYWN0ZXJzKVxuICAgICAqICAgICAuc29ydEJ5KCdhZ2UnKVxuICAgICAqICAgICAubWFwKGZ1bmN0aW9uKGNocikgeyByZXR1cm4gY2hyLm5hbWUgKyAnIGlzICcgKyBjaHIuYWdlOyB9KVxuICAgICAqICAgICAuZmlyc3QoKVxuICAgICAqICAgICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcyBpcyAxJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNoYWluKHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBsb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICAgIHZhbHVlLl9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgaW50ZXJjZXB0b3JgIHdpdGggdGhlIGB2YWx1ZWAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB0aGVuXG4gICAgICogcmV0dXJucyBgdmFsdWVgLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInRhcCBpbnRvXCIgYSBtZXRob2RcbiAgICAgKiBjaGFpbiBpbiBvcmRlciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluXG4gICAgICogdGhlIGNoYWluLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENoYWluaW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgMywgNF0pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHsgYXJyYXkucG9wKCk7IH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgZXhwbGljaXQgbWV0aG9kIGNoYWluaW5nIG9uIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5pbmdcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBjaGFyYWN0ZXJzID0gW1xuICAgICAqICAgeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ25hbWUnOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZ1xuICAgICAqIF8oY2hhcmFjdGVycykuZmlyc3QoKTtcbiAgICAgKiAvLyA9PiB7ICduYW1lJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyB3aXRoIGV4cGxpY2l0IGNoYWluaW5nXG4gICAgICogXyhjaGFyYWN0ZXJzKS5jaGFpbigpXG4gICAgICogICAuZmlyc3QoKVxuICAgICAqICAgLnBpY2soJ2FnZScpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICdhZ2UnOiAzNiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNoYWluKCkge1xuICAgICAgdGhpcy5fX2NoYWluX18gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgdGhlIGB0b1N0cmluZ2AgcmVzdWx0IG9mIHRoZSB3cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgdG9TdHJpbmdcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDaGFpbmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZyByZXN1bHQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS50b1N0cmluZygpO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHRoaXMuX193cmFwcGVkX18pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSB3cmFwcGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQG5hbWUgdmFsdWVPZlxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIHZhbHVlXG4gICAgICogQGNhdGVnb3J5IENoYWluaW5nXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZU9mKCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlT2YoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3dyYXBwZWRfXztcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIGFkZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgd2hlbiBjaGFpbmluZ1xuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hc3NpZ24gPSBhc3NpZ247XG4gICAgbG9kYXNoLmF0ID0gYXQ7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb21wb3NlID0gY29tcG9zZTtcbiAgICBsb2Rhc2guY29uc3RhbnQgPSBjb25zdGFudDtcbiAgICBsb2Rhc2guY291bnRCeSA9IGNvdW50Qnk7XG4gICAgbG9kYXNoLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBsb2Rhc2guY3JlYXRlQ2FsbGJhY2sgPSBjcmVhdGVDYWxsYmFjaztcbiAgICBsb2Rhc2guY3VycnkgPSBjdXJyeTtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmZXIgPSBkZWZlcjtcbiAgICBsb2Rhc2guZGVsYXkgPSBkZWxheTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2U7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZvckVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5mb3JFYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZvckluID0gZm9ySW47XG4gICAgbG9kYXNoLmZvckluUmlnaHQgPSBmb3JJblJpZ2h0O1xuICAgIGxvZGFzaC5mb3JPd24gPSBmb3JPd247XG4gICAgbG9kYXNoLmZvck93blJpZ2h0ID0gZm9yT3duUmlnaHQ7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluZGV4QnkgPSBpbmRleEJ5O1xuICAgIGxvZGFzaC5pbml0aWFsID0gaW5pdGlhbDtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludm9rZSA9IGludm9rZTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLm1hcCA9IG1hcDtcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplO1xuICAgIGxvZGFzaC5tZXJnZSA9IG1lcmdlO1xuICAgIGxvZGFzaC5taW4gPSBtaW47XG4gICAgbG9kYXNoLm9taXQgPSBvbWl0O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gucGFpcnMgPSBwYWlycztcbiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgbG9kYXNoLnBhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodDtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBsdWNrID0gcGx1Y2s7XG4gICAgbG9kYXNoLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5yYW5nZSA9IHJhbmdlO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnNodWZmbGUgPSBzaHVmZmxlO1xuICAgIGxvZGFzaC5zb3J0QnkgPSBzb3J0Qnk7XG4gICAgbG9kYXNoLnRhcCA9IHRhcDtcbiAgICBsb2Rhc2gudGhyb3R0bGUgPSB0aHJvdHRsZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9BcnJheSA9IHRvQXJyYXk7XG4gICAgbG9kYXNoLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBsb2Rhc2gudW5pb24gPSB1bmlvbjtcbiAgICBsb2Rhc2gudW5pcSA9IHVuaXE7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gud2hlcmUgPSB3aGVyZTtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnppcCA9IHppcDtcbiAgICBsb2Rhc2guemlwT2JqZWN0ID0gemlwT2JqZWN0O1xuXG4gICAgLy8gYWRkIGFsaWFzZXNcbiAgICBsb2Rhc2guY29sbGVjdCA9IG1hcDtcbiAgICBsb2Rhc2guZHJvcCA9IHJlc3Q7XG4gICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5lYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbjtcbiAgICBsb2Rhc2gubWV0aG9kcyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2gub2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC5zZWxlY3QgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLnRhaWwgPSByZXN0O1xuICAgIGxvZGFzaC51bmlxdWUgPSB1bmlxO1xuICAgIGxvZGFzaC51bnppcCA9IHppcDtcblxuICAgIC8vIGFkZCBmdW5jdGlvbnMgdG8gYGxvZGFzaC5wcm90b3R5cGVgXG4gICAgbWl4aW4obG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gYWRkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzIHdoZW4gY2hhaW5pbmdcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jb250YWlucyA9IGNvbnRhaW5zO1xuICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIGxvZGFzaC5pbmRleE9mID0gaW5kZXhPZjtcbiAgICBsb2Rhc2guaXNBcmd1bWVudHMgPSBpc0FyZ3VtZW50cztcbiAgICBsb2Rhc2guaXNBcnJheSA9IGlzQXJyYXk7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmxhc3RJbmRleE9mID0gbGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYXJzZUludCA9IHBhcnNlSW50O1xuICAgIGxvZGFzaC5yYW5kb20gPSByYW5kb207XG4gICAgbG9kYXNoLnJlZHVjZSA9IHJlZHVjZTtcbiAgICBsb2Rhc2gucmVkdWNlUmlnaHQgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2gucmVzdWx0ID0gcmVzdWx0O1xuICAgIGxvZGFzaC5ydW5JbkNvbnRleHQgPSBydW5JbkNvbnRleHQ7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcblxuICAgIC8vIGFkZCBhbGlhc2VzXG4gICAgbG9kYXNoLmFsbCA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5hbnkgPSBzb21lO1xuICAgIGxvZGFzaC5kZXRlY3QgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kV2hlcmUgPSBmaW5kO1xuICAgIGxvZGFzaC5mb2xkbCA9IHJlZHVjZTtcbiAgICBsb2Rhc2guZm9sZHIgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2guaW5jbHVkZSA9IGNvbnRhaW5zO1xuICAgIGxvZGFzaC5pbmplY3QgPSByZWR1Y2U7XG5cbiAgICBtaXhpbihmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fVxuICAgICAgZm9yT3duKGxvZGFzaCwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAoIWxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgICBzb3VyY2VbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfSgpLCBmYWxzZSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIGFkZCBmdW5jdGlvbnMgY2FwYWJsZSBvZiByZXR1cm5pbmcgd3JhcHBlZCBhbmQgdW53cmFwcGVkIHZhbHVlcyB3aGVuIGNoYWluaW5nXG4gICAgbG9kYXNoLmZpcnN0ID0gZmlyc3Q7XG4gICAgbG9kYXNoLmxhc3QgPSBsYXN0O1xuICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7XG5cbiAgICAvLyBhZGQgYWxpYXNlc1xuICAgIGxvZGFzaC50YWtlID0gZmlyc3Q7XG4gICAgbG9kYXNoLmhlYWQgPSBmaXJzdDtcblxuICAgIGZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjYWxsYmFja2FibGUgPSBtZXRob2ROYW1lICE9PSAnc2FtcGxlJztcbiAgICAgIGlmICghbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSkge1xuICAgICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdPSBmdW5jdGlvbihuLCBndWFyZCkge1xuICAgICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKHRoaXMuX193cmFwcGVkX18sIG4sIGd1YXJkKTtcblxuICAgICAgICAgIHJldHVybiAhY2hhaW5BbGwgJiYgKG4gPT0gbnVsbCB8fCAoZ3VhcmQgJiYgIShjYWxsYmFja2FibGUgJiYgdHlwZW9mIG4gPT0gJ2Z1bmN0aW9uJykpKVxuICAgICAgICAgICAgPyByZXN1bHRcbiAgICAgICAgICAgIDogbmV3IGxvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqL1xuICAgIGxvZGFzaC5WRVJTSU9OID0gJzIuNC4xJztcblxuICAgIC8vIGFkZCBcIkNoYWluaW5nXCIgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyXG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvU3RyaW5nID0gd3JhcHBlclRvU3RyaW5nO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWVPZjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnZhbHVlT2YgPSB3cmFwcGVyVmFsdWVPZjtcblxuICAgIC8vIGFkZCBgQXJyYXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB1bndyYXBwZWQgdmFsdWVzXG4gICAgZm9yRWFjaChbJ2pvaW4nLCAncG9wJywgJ3NoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlSZWZbbWV0aG9kTmFtZV07XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLl9fd3JhcHBlZF9fLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHJldHVybiBjaGFpbkFsbFxuICAgICAgICAgID8gbmV3IGxvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbClcbiAgICAgICAgICA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBhZGQgYEFycmF5YCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdGhlIGV4aXN0aW5nIHdyYXBwZWQgdmFsdWVcbiAgICBmb3JFYWNoKFsncHVzaCcsICdyZXZlcnNlJywgJ3NvcnQnLCAndW5zaGlmdCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IGFycmF5UmVmW21ldGhvZE5hbWVdO1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBmdW5jLmFwcGx5KHRoaXMuX193cmFwcGVkX18sIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIGFkZCBgQXJyYXlgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgd3JhcHBlZCB2YWx1ZXNcbiAgICBmb3JFYWNoKFsnY29uY2F0JywgJ3NsaWNlJywgJ3NwbGljZSddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IGFycmF5UmVmW21ldGhvZE5hbWVdO1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IGxvZGFzaFdyYXBwZXIoZnVuYy5hcHBseSh0aGlzLl9fd3JhcHBlZF9fLCBhcmd1bWVudHMpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIGV4cG9zZSBMby1EYXNoXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gc29tZSBBTUQgYnVpbGQgb3B0aW1pemVycyBsaWtlIHIuanMgY2hlY2sgZm9yIGNvbmRpdGlvbiBwYXR0ZXJucyBsaWtlIHRoZSBmb2xsb3dpbmc6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMby1EYXNoIHRvIHRoZSBnbG9iYWwgb2JqZWN0IGV2ZW4gd2hlbiBhbiBBTUQgbG9hZGVyIGlzIHByZXNlbnQgaW5cbiAgICAvLyBjYXNlIExvLURhc2ggaXMgbG9hZGVkIHdpdGggYSBSZXF1aXJlSlMgc2hpbSBjb25maWcuXG4gICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvYXBpLmh0bWwjY29uZmlnLXNoaW1cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gZGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGVcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBjaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBhbiBgZXhwb3J0c2Agb2JqZWN0XG4gIGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcbiAgICAvLyBpbiBOb2RlLmpzIG9yIFJpbmdvSlNcbiAgICBpZiAobW9kdWxlRXhwb3J0cykge1xuICAgICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIH1cbiAgICAvLyBpbiBOYXJ3aGFsIG9yIFJoaW5vIC1yZXF1aXJlXG4gICAgZWxzZSB7XG4gICAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gaW4gYSBicm93c2VyIG9yIFJoaW5vXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsIi8vISBtb21lbnQuanNcbi8vISB2ZXJzaW9uIDogMi45LjBcbi8vISBhdXRob3JzIDogVGltIFdvb2QsIElza3JlbiBDaGVybmV2LCBNb21lbnQuanMgY29udHJpYnV0b3JzXG4vLyEgbGljZW5zZSA6IE1JVFxuLy8hIG1vbWVudGpzLmNvbVxuXG4oZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgQ29uc3RhbnRzXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdmFyIG1vbWVudCxcbiAgICAgICAgVkVSU0lPTiA9ICcyLjkuMCcsXG4gICAgICAgIC8vIHRoZSBnbG9iYWwtc2NvcGUgdGhpcyBpcyBOT1QgdGhlIGdsb2JhbCBvYmplY3QgaW4gTm9kZS5qc1xuICAgICAgICBnbG9iYWxTY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgd2luZG93ID09PSBnbG9iYWwud2luZG93KSkgPyBnbG9iYWwgOiB0aGlzLFxuICAgICAgICBvbGRHbG9iYWxNb21lbnQsXG4gICAgICAgIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgICAgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICAgICAgICBpLFxuXG4gICAgICAgIFlFQVIgPSAwLFxuICAgICAgICBNT05USCA9IDEsXG4gICAgICAgIERBVEUgPSAyLFxuICAgICAgICBIT1VSID0gMyxcbiAgICAgICAgTUlOVVRFID0gNCxcbiAgICAgICAgU0VDT05EID0gNSxcbiAgICAgICAgTUlMTElTRUNPTkQgPSA2LFxuXG4gICAgICAgIC8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxvY2FsZSBjb25maWcgZmlsZXNcbiAgICAgICAgbG9jYWxlcyA9IHt9LFxuXG4gICAgICAgIC8vIGV4dHJhIG1vbWVudCBpbnRlcm5hbCBwcm9wZXJ0aWVzIChwbHVnaW5zIHJlZ2lzdGVyIHByb3BzIGhlcmUpXG4gICAgICAgIG1vbWVudFByb3BlcnRpZXMgPSBbXSxcblxuICAgICAgICAvLyBjaGVjayBmb3Igbm9kZUpTXG4gICAgICAgIGhhc01vZHVsZSA9ICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpLFxuXG4gICAgICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgICAgICBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pLFxuICAgICAgICBhc3BOZXRUaW1lU3Bhbkpzb25SZWdleCA9IC8oXFwtKT8oPzooXFxkKilcXC4pPyhcXGQrKVxcOihcXGQrKSg/OlxcOihcXGQrKVxcLj8oXFxkezN9KT8pPy8sXG5cbiAgICAgICAgLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbiAgICAgICAgLy8gc29tZXdoYXQgbW9yZSBpbiBsaW5lIHdpdGggNC40LjMuMiAyMDA0IHNwZWMsIGJ1dCBhbGxvd3MgZGVjaW1hbCBhbnl3aGVyZVxuICAgICAgICBpc29EdXJhdGlvblJlZ2V4ID0gL14oLSk/UCg/Oig/OihbMC05LC5dKilZKT8oPzooWzAtOSwuXSopTSk/KD86KFswLTksLl0qKUQpPyg/OlQoPzooWzAtOSwuXSopSCk/KD86KFswLTksLl0qKU0pPyg/OihbMC05LC5dKilTKT8pP3woWzAtOSwuXSopVykkLyxcblxuICAgICAgICAvLyBmb3JtYXQgdG9rZW5zXG4gICAgICAgIGZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UXxZWVlZWVl8WVlZWVl8WVlZWXxZWXxnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xtbT98c3M/fFN7MSw0fXx4fFh8eno/fFpaP3wuKS9nLFxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLFxuXG4gICAgICAgIC8vIHBhcnNpbmcgdG9rZW4gcmVnZXhlc1xuICAgICAgICBwYXJzZVRva2VuT25lT3JUd29EaWdpdHMgPSAvXFxkXFxkPy8sIC8vIDAgLSA5OVxuICAgICAgICBwYXJzZVRva2VuT25lVG9UaHJlZURpZ2l0cyA9IC9cXGR7MSwzfS8sIC8vIDAgLSA5OTlcbiAgICAgICAgcGFyc2VUb2tlbk9uZVRvRm91ckRpZ2l0cyA9IC9cXGR7MSw0fS8sIC8vIDAgLSA5OTk5XG4gICAgICAgIHBhcnNlVG9rZW5PbmVUb1NpeERpZ2l0cyA9IC9bK1xcLV0/XFxkezEsNn0vLCAvLyAtOTk5LDk5OSAtIDk5OSw5OTlcbiAgICAgICAgcGFyc2VUb2tlbkRpZ2l0cyA9IC9cXGQrLywgLy8gbm9uemVybyBudW1iZXIgb2YgZGlnaXRzXG4gICAgICAgIHBhcnNlVG9rZW5Xb3JkID0gL1swLTldKlsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSt8W1xcdTA2MDAtXFx1MDZGRlxcL10rKFxccyo/W1xcdTA2MDAtXFx1MDZGRl0rKXsxLDJ9L2ksIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuICAgICAgICBwYXJzZVRva2VuVGltZXpvbmUgPSAvWnxbXFwrXFwtXVxcZFxcZDo/XFxkXFxkL2dpLCAvLyArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICAgICAgcGFyc2VUb2tlblQgPSAvVC9pLCAvLyBUIChJU08gc2VwYXJhdG9yKVxuICAgICAgICBwYXJzZVRva2VuT2Zmc2V0TXMgPSAvW1xcK1xcLV0/XFxkKy8sIC8vIDEyMzQ1Njc4OTAxMjNcbiAgICAgICAgcGFyc2VUb2tlblRpbWVzdGFtcE1zID0gL1tcXCtcXC1dP1xcZCsoXFwuXFxkezEsM30pPy8sIC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbiAgICAgICAgLy9zdHJpY3QgcGFyc2luZyByZWdleGVzXG4gICAgICAgIHBhcnNlVG9rZW5PbmVEaWdpdCA9IC9cXGQvLCAvLyAwIC0gOVxuICAgICAgICBwYXJzZVRva2VuVHdvRGlnaXRzID0gL1xcZFxcZC8sIC8vIDAwIC0gOTlcbiAgICAgICAgcGFyc2VUb2tlblRocmVlRGlnaXRzID0gL1xcZHszfS8sIC8vIDAwMCAtIDk5OVxuICAgICAgICBwYXJzZVRva2VuRm91ckRpZ2l0cyA9IC9cXGR7NH0vLCAvLyAwMDAwIC0gOTk5OVxuICAgICAgICBwYXJzZVRva2VuU2l4RGlnaXRzID0gL1srLV0/XFxkezZ9LywgLy8gLTk5OSw5OTkgLSA5OTksOTk5XG4gICAgICAgIHBhcnNlVG9rZW5TaWduZWROdW1iZXIgPSAvWystXT9cXGQrLywgLy8gLWluZiAtIGluZlxuXG4gICAgICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgICAgICBpc29SZWdleCA9IC9eXFxzKig/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzooXFxkXFxkLVxcZFxcZCl8KFdcXGRcXGQkKXwoV1xcZFxcZC1cXGQpfChcXGRcXGRcXGQpKSgoVHwgKShcXGRcXGQoOlxcZFxcZCg6XFxkXFxkKFxcLlxcZCspPyk/KT8pPyhbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXG5cbiAgICAgICAgaXNvRm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJyxcblxuICAgICAgICBpc29EYXRlcyA9IFtcbiAgICAgICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkezJ9LVxcZHsyfS9dLFxuICAgICAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGR7Mn0tXFxkezJ9L10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZHsyfS1cXGQvXSxcbiAgICAgICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZHsyfS9dLFxuICAgICAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L11cbiAgICAgICAgXSxcblxuICAgICAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG4gICAgICAgIGlzb1RpbWVzID0gW1xuICAgICAgICAgICAgWydISDptbTpzcy5TU1NTJywgLyhUfCApXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIOm1tOnNzJywgLyhUfCApXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEg6bW0nLCAvKFR8IClcXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIJywgLyhUfCApXFxkXFxkL11cbiAgICAgICAgXSxcblxuICAgICAgICAvLyB0aW1lem9uZSBjaHVua2VyICcrMTA6MDAnID4gWycxMCcsICcwMCddIG9yICctMTUzMCcgPiBbJy0nLCAnMTUnLCAnMzAnXVxuICAgICAgICBwYXJzZVRpbWV6b25lQ2h1bmtlciA9IC8oW1xcK1xcLV18XFxkXFxkKS9naSxcblxuICAgICAgICAvLyBnZXR0ZXIgYW5kIHNldHRlciBuYW1lc1xuICAgICAgICBwcm94eUdldHRlcnNBbmRTZXR0ZXJzID0gJ0RhdGV8SG91cnN8TWludXRlc3xTZWNvbmRzfE1pbGxpc2Vjb25kcycuc3BsaXQoJ3wnKSxcbiAgICAgICAgdW5pdE1pbGxpc2Vjb25kRmFjdG9ycyA9IHtcbiAgICAgICAgICAgICdNaWxsaXNlY29uZHMnIDogMSxcbiAgICAgICAgICAgICdTZWNvbmRzJyA6IDFlMyxcbiAgICAgICAgICAgICdNaW51dGVzJyA6IDZlNCxcbiAgICAgICAgICAgICdIb3VycycgOiAzNmU1LFxuICAgICAgICAgICAgJ0RheXMnIDogODY0ZTUsXG4gICAgICAgICAgICAnTW9udGhzJyA6IDI1OTJlNixcbiAgICAgICAgICAgICdZZWFycycgOiAzMTUzNmU2XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5pdEFsaWFzZXMgPSB7XG4gICAgICAgICAgICBtcyA6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgICAgICBzIDogJ3NlY29uZCcsXG4gICAgICAgICAgICBtIDogJ21pbnV0ZScsXG4gICAgICAgICAgICBoIDogJ2hvdXInLFxuICAgICAgICAgICAgZCA6ICdkYXknLFxuICAgICAgICAgICAgRCA6ICdkYXRlJyxcbiAgICAgICAgICAgIHcgOiAnd2VlaycsXG4gICAgICAgICAgICBXIDogJ2lzb1dlZWsnLFxuICAgICAgICAgICAgTSA6ICdtb250aCcsXG4gICAgICAgICAgICBRIDogJ3F1YXJ0ZXInLFxuICAgICAgICAgICAgeSA6ICd5ZWFyJyxcbiAgICAgICAgICAgIERERCA6ICdkYXlPZlllYXInLFxuICAgICAgICAgICAgZSA6ICd3ZWVrZGF5JyxcbiAgICAgICAgICAgIEUgOiAnaXNvV2Vla2RheScsXG4gICAgICAgICAgICBnZzogJ3dlZWtZZWFyJyxcbiAgICAgICAgICAgIEdHOiAnaXNvV2Vla1llYXInXG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FtZWxGdW5jdGlvbnMgPSB7XG4gICAgICAgICAgICBkYXlvZnllYXIgOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgICAgIGlzb3dlZWtkYXkgOiAnaXNvV2Vla2RheScsXG4gICAgICAgICAgICBpc293ZWVrIDogJ2lzb1dlZWsnLFxuICAgICAgICAgICAgd2Vla3llYXIgOiAnd2Vla1llYXInLFxuICAgICAgICAgICAgaXNvd2Vla3llYXIgOiAnaXNvV2Vla1llYXInXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gZm9ybWF0IGZ1bmN0aW9uIHN0cmluZ3NcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zID0ge30sXG5cbiAgICAgICAgLy8gZGVmYXVsdCByZWxhdGl2ZSB0aW1lIHRocmVzaG9sZHNcbiAgICAgICAgcmVsYXRpdmVUaW1lVGhyZXNob2xkcyA9IHtcbiAgICAgICAgICAgIHM6IDQ1LCAgLy8gc2Vjb25kcyB0byBtaW51dGVcbiAgICAgICAgICAgIG06IDQ1LCAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgICAgICBoOiAyMiwgIC8vIGhvdXJzIHRvIGRheVxuICAgICAgICAgICAgZDogMjYsICAvLyBkYXlzIHRvIG1vbnRoXG4gICAgICAgICAgICBNOiAxMSAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gdG9rZW5zIHRvIG9yZGluYWxpemUgYW5kIHBhZFxuICAgICAgICBvcmRpbmFsaXplVG9rZW5zID0gJ0RERCB3IFcgTSBEIGQnLnNwbGl0KCcgJyksXG4gICAgICAgIHBhZGRlZFRva2VucyA9ICdNIEQgSCBoIG0gcyB3IFcnLnNwbGl0KCcgJyksXG5cbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7XG4gICAgICAgICAgICBNICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE1NTSAgOiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTU1NTSA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzKHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgRCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgREREICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXlPZlllYXIoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRkICAgOiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGRkICA6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRkZGQgOiBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53ZWVrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWVkgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMueWVhcigpICUgMTAwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBZWVlZIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy55ZWFyKCksIDQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFlZWVlZIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy55ZWFyKCksIDUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFlZWVlZWSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgeSA9IHRoaXMueWVhcigpLCBzaWduID0geSA+PSAwID8gJysnIDogJy0nO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaWduICsgbGVmdFplcm9GaWxsKE1hdGguYWJzKHkpLCA2KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZyAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy53ZWVrWWVhcigpICUgMTAwLCAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZ2dnIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy53ZWVrWWVhcigpLCA0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZ2dnZyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMud2Vla1llYXIoKSwgNSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR0cgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMCwgMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR0dHRyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRoaXMuaXNvV2Vla1llYXIoKSwgNCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR0dHR0cgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLmlzb1dlZWtZZWFyKCksIDUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2Vla2RheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla2RheSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGEgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEEgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBIICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbSAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmRzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgUyAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9JbnQodGhpcy5taWxsaXNlY29uZHMoKSAvIDEwMCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgU1MgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFplcm9GaWxsKHRvSW50KHRoaXMubWlsbGlzZWNvbmRzKCkgLyAxMCksIDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFNTUyAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRaZXJvRmlsbCh0aGlzLm1pbGxpc2Vjb25kcygpLCAzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBTU1NTIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwodGhpcy5taWxsaXNlY29uZHMoKSwgMyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWiAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMudXRjT2Zmc2V0KCksXG4gICAgICAgICAgICAgICAgICAgIGIgPSAnKyc7XG4gICAgICAgICAgICAgICAgaWYgKGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSAtYTtcbiAgICAgICAgICAgICAgICAgICAgYiA9ICctJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGIgKyBsZWZ0WmVyb0ZpbGwodG9JbnQoYSAvIDYwKSwgMikgKyAnOicgKyBsZWZ0WmVyb0ZpbGwodG9JbnQoYSkgJSA2MCwgMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWlogICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMudXRjT2Zmc2V0KCksXG4gICAgICAgICAgICAgICAgICAgIGIgPSAnKyc7XG4gICAgICAgICAgICAgICAgaWYgKGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSAtYTtcbiAgICAgICAgICAgICAgICAgICAgYiA9ICctJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGIgKyBsZWZ0WmVyb0ZpbGwodG9JbnQoYSAvIDYwKSwgMikgKyBsZWZ0WmVyb0ZpbGwodG9JbnQoYSkgJSA2MCwgMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeiA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56b25lQWJicigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHp6IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnpvbmVOYW1lKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWCAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51bml4KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgUSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5xdWFydGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVwcmVjYXRpb25zID0ge30sXG5cbiAgICAgICAgbGlzdHMgPSBbJ21vbnRocycsICdtb250aHNTaG9ydCcsICd3ZWVrZGF5cycsICd3ZWVrZGF5c1Nob3J0JywgJ3dlZWtkYXlzTWluJ10sXG5cbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLiBkZmwgY29tZXMgZnJvbVxuICAgIC8vIGRlZmF1bHQuXG4gICAgZnVuY3Rpb24gZGZsKGEsIGIsIGMpIHtcbiAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBhICE9IG51bGwgPyBhIDogYjtcbiAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIGEgIT0gbnVsbCA/IGEgOiBiICE9IG51bGwgPyBiIDogYztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignSW1wbGVtZW50IG1lJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoYSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmYXVsdFBhcnNpbmdGbGFncygpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byBkZWVwIGNsb25lIHRoaXMgb2JqZWN0LCBhbmQgZXM1IHN0YW5kYXJkIGlzIG5vdCB2ZXJ5XG4gICAgICAgIC8vIGhlbHBmdWwuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eSA6IGZhbHNlLFxuICAgICAgICAgICAgdW51c2VkVG9rZW5zIDogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dCA6IFtdLFxuICAgICAgICAgICAgb3ZlcmZsb3cgOiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXIgOiAwLFxuICAgICAgICAgICAgbnVsbElucHV0IDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkTW9udGggOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZEZvcm1hdCA6IGZhbHNlLFxuICAgICAgICAgICAgdXNlckludmFsaWRhdGVkIDogZmFsc2UsXG4gICAgICAgICAgICBpc286IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJpbnRNc2cobXNnKSB7XG4gICAgICAgIGlmIChtb21lbnQuc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRpb24gd2FybmluZzogJyArIG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGUobXNnLCBmbikge1xuICAgICAgICB2YXIgZmlyc3RUaW1lID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgcHJpbnRNc2cobXNnKTtcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9LCBmbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlU2ltcGxlKG5hbWUsIG1zZykge1xuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgcHJpbnRNc2cobXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYWRUb2tlbihmdW5jLCBjb3VudCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0WmVyb0ZpbGwoZnVuYy5jYWxsKHRoaXMsIGEpLCBjb3VudCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9yZGluYWxpemVUb2tlbihmdW5jLCBwZXJpb2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChmdW5jLmNhbGwodGhpcywgYSksIHBlcmlvZCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmKGEsIGIpIHtcbiAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiBtb250aHNcbiAgICAgICAgdmFyIHdob2xlTW9udGhEaWZmID0gKChiLnllYXIoKSAtIGEueWVhcigpKSAqIDEyKSArIChiLm1vbnRoKCkgLSBhLm1vbnRoKCkpLFxuICAgICAgICAgICAgLy8gYiBpcyBpbiAoYW5jaG9yIC0gMSBtb250aCwgYW5jaG9yICsgMSBtb250aClcbiAgICAgICAgICAgIGFuY2hvciA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYsICdtb250aHMnKSxcbiAgICAgICAgICAgIGFuY2hvcjIsIGFkanVzdDtcblxuICAgICAgICBpZiAoYiAtIGFuY2hvciA8IDApIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmIC0gMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IgLSBhbmNob3IyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmICsgMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IyIC0gYW5jaG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KTtcbiAgICB9XG5cbiAgICB3aGlsZSAob3JkaW5hbGl6ZVRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgaSA9IG9yZGluYWxpemVUb2tlbnMucG9wKCk7XG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW2kgKyAnbyddID0gb3JkaW5hbGl6ZVRva2VuKGZvcm1hdFRva2VuRnVuY3Rpb25zW2ldLCBpKTtcbiAgICB9XG4gICAgd2hpbGUgKHBhZGRlZFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgaSA9IHBhZGRlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbaSArIGldID0gcGFkVG9rZW4oZm9ybWF0VG9rZW5GdW5jdGlvbnNbaV0sIDIpO1xuICAgIH1cbiAgICBmb3JtYXRUb2tlbkZ1bmN0aW9ucy5EREREID0gcGFkVG9rZW4oZm9ybWF0VG9rZW5GdW5jdGlvbnMuRERELCAzKTtcblxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpZSBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgQ29uc3RydWN0b3JzXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgZnVuY3Rpb24gTG9jYWxlKCkge1xuICAgIH1cblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZywgc2tpcE92ZXJmbG93KSB7XG4gICAgICAgIGlmIChza2lwT3ZlcmZsb3cgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29weUNvbmZpZyh0aGlzLCBjb25maWcpO1xuICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoK2NvbmZpZy5fZCk7XG4gICAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHVwZGF0ZU9mZnNldCBjcmVhdGVzIG5ldyBtb21lbnRcbiAgICAgICAgLy8gb2JqZWN0cy5cbiAgICAgICAgaWYgKHVwZGF0ZUluUHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEdXJhdGlvbiBDb25zdHJ1Y3RvclxuICAgIGZ1bmN0aW9uIER1cmF0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9ICttaWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgc2Vjb25kcyAqIDFlMyArIC8vIDEwMDBcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGhvdXJzICogMzZlNTsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICtcbiAgICAgICAgICAgIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArXG4gICAgICAgICAgICBxdWFydGVycyAqIDMgK1xuICAgICAgICAgICAgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gbW9tZW50LmxvY2FsZURhdGEoKTtcblxuICAgICAgICB0aGlzLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIEhlbHBlcnNcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIGZ1bmN0aW9uIGV4dGVuZChhLCBiKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gYikge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoYiwgaSkpIHtcbiAgICAgICAgICAgICAgICBhW2ldID0gYltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd0b1N0cmluZycpKSB7XG4gICAgICAgICAgICBhLnRvU3RyaW5nID0gYi50b1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd2YWx1ZU9mJykpIHtcbiAgICAgICAgICAgIGEudmFsdWVPZiA9IGIudmFsdWVPZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAodHlwZW9mIGZyb20uX2lzQU1vbWVudE9iamVjdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tLl9pICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbS5fZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20uX2wgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tLl9zdHJpY3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbS5fdHptICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20uX2lzVVRDICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tLl9vZmZzZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbS5fcGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBmcm9tLl9wZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20uX2xvY2FsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRvLl9sb2NhbGUgPSBmcm9tLl9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9tZW50UHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGkgaW4gbW9tZW50UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhbCA9IGZyb21bcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNSb3VuZChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsZWZ0IHplcm8gZmlsbCBhIG51bWJlclxuICAgIC8vIHNlZSBodHRwOi8vanNwZXJmLmNvbS9sZWZ0LXplcm8tZmlsbGluZyBmb3IgcGVyZm9ybWFuY2UgY29tcGFyaXNvblxuICAgIGZ1bmN0aW9uIGxlZnRaZXJvRmlsbChudW1iZXIsIHRhcmdldExlbmd0aCwgZm9yY2VTaWduKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSAnJyArIE1hdGguYWJzKG51bWJlciksXG4gICAgICAgICAgICBzaWduID0gbnVtYmVyID49IDA7XG5cbiAgICAgICAgd2hpbGUgKG91dHB1dC5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICAgICAgICAgIG91dHB1dCA9ICcwJyArIG91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArIG91dHB1dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXMgPSB7bWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDB9O1xuXG4gICAgICAgIHJlcy5tb250aHMgPSBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICtcbiAgICAgICAgICAgIChvdGhlci55ZWFyKCkgLSBiYXNlLnllYXIoKSkgKiAxMjtcbiAgICAgICAgaWYgKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKS5pc0FmdGVyKG90aGVyKSkge1xuICAgICAgICAgICAgLS1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9ICtvdGhlciAtICsoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIG90aGVyID0gbWFrZUFzKG90aGVyLCBiYXNlKTtcbiAgICAgICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmVzLm1vbnRocyA9IC1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG4gICAgZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICAgICAgaWYgKHBlcmlvZCAhPT0gbnVsbCAmJiAhaXNOYU4oK3BlcmlvZCkpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUobmFtZSwgJ21vbWVudCgpLicgKyBuYW1lICArICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArIG5hbWUgKyAnKG51bWJlciwgcGVyaW9kKS4nKTtcbiAgICAgICAgICAgICAgICB0bXAgPSB2YWw7IHZhbCA9IHBlcmlvZDsgcGVyaW9kID0gdG1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/ICt2YWwgOiB2YWw7XG4gICAgICAgICAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkT3JTdWJ0cmFjdER1cmF0aW9uRnJvbU1vbWVudCh0aGlzLCBkdXIsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRPclN1YnRyYWN0RHVyYXRpb25Gcm9tTW9tZW50KG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gZHVyYXRpb24uX2RheXMsXG4gICAgICAgICAgICBtb250aHMgPSBkdXJhdGlvbi5fbW9udGhzO1xuICAgICAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgbW9tLl9kLnNldFRpbWUoK21vbS5fZCArIG1pbGxpc2Vjb25kcyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgcmF3U2V0dGVyKG1vbSwgJ0RhdGUnLCByYXdHZXR0ZXIobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9udGhzKSB7XG4gICAgICAgICAgICByYXdNb250aFNldHRlcihtb20sIHJhd0dldHRlcihtb20sICdNb250aCcpICsgbW9udGhzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiBpcyBhbiBhcnJheVxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXScgfHxcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKChkb250Q29udmVydCAmJiBhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB7XG4gICAgICAgIGlmICh1bml0cykge1xuICAgICAgICAgICAgdmFyIGxvd2VyZWQgPSB1bml0cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyguKXMkLywgJyQxJyk7XG4gICAgICAgICAgICB1bml0cyA9IHVuaXRBbGlhc2VzW3VuaXRzXSB8fCBjYW1lbEZ1bmN0aW9uc1tsb3dlcmVkXSB8fCBsb3dlcmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bml0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVPYmplY3RVbml0cyhpbnB1dE9iamVjdCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgICAgIHByb3A7XG5cbiAgICAgICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRJbnB1dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlTGlzdChmaWVsZCkge1xuICAgICAgICB2YXIgY291bnQsIHNldHRlcjtcblxuICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignd2VlaycpID09PSAwKSB7XG4gICAgICAgICAgICBjb3VudCA9IDc7XG4gICAgICAgICAgICBzZXR0ZXIgPSAnZGF5JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaWVsZC5pbmRleE9mKCdtb250aCcpID09PSAwKSB7XG4gICAgICAgICAgICBjb3VudCA9IDEyO1xuICAgICAgICAgICAgc2V0dGVyID0gJ21vbnRoJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vbWVudFtmaWVsZF0gPSBmdW5jdGlvbiAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIGksIGdldHRlcixcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBtb21lbnQuX2xvY2FsZVtmaWVsZF0sXG4gICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldHRlciA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG0gPSBtb21lbnQoKS51dGMoKS5zZXQoc2V0dGVyLCBpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwobW9tZW50Ll9sb2NhbGUsIG0sIGZvcm1hdCB8fCAnJyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXIoaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGdldHRlcihpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgaWYgKGNvZXJjZWROdW1iZXIgPj0gMCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBNYXRoLmNlaWwoY29lcmNlZE51bWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoICsgMSwgMCkpLmdldFVUQ0RhdGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb21lbnQoW3llYXIsIDExLCAzMSArIGRvdyAtIGRveV0pLCBkb3csIGRveSkud2VlaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkgfHwgeWVhciAlIDQwMCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93KG0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93O1xuICAgICAgICBpZiAobS5fYSAmJiBtLl9wZi5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBtLl9hW01PTlRIXSA8IDAgfHwgbS5fYVtNT05USF0gPiAxMSA/IE1PTlRIIDpcbiAgICAgICAgICAgICAgICBtLl9hW0RBVEVdIDwgMSB8fCBtLl9hW0RBVEVdID4gZGF5c0luTW9udGgobS5fYVtZRUFSXSwgbS5fYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgbS5fYVtIT1VSXSA8IDAgfHwgbS5fYVtIT1VSXSA+IDI0IHx8XG4gICAgICAgICAgICAgICAgICAgIChtLl9hW0hPVVJdID09PSAyNCAmJiAobS5fYVtNSU5VVEVdICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5fYVtTRUNPTkRdICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5fYVtNSUxMSVNFQ09ORF0gIT09IDApKSA/IEhPVVIgOlxuICAgICAgICAgICAgICAgIG0uX2FbTUlOVVRFXSA8IDAgfHwgbS5fYVtNSU5VVEVdID4gNTkgPyBNSU5VVEUgOlxuICAgICAgICAgICAgICAgIG0uX2FbU0VDT05EXSA8IDAgfHwgbS5fYVtTRUNPTkRdID4gNTkgPyBTRUNPTkQgOlxuICAgICAgICAgICAgICAgIG0uX2FbTUlMTElTRUNPTkRdIDwgMCB8fCBtLl9hW01JTExJU0VDT05EXSA+IDk5OSA/IE1JTExJU0VDT05EIDpcbiAgICAgICAgICAgICAgICAtMTtcblxuICAgICAgICAgICAgaWYgKG0uX3BmLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG0uX3BmLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcbiAgICAgICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgbS5faXNWYWxpZCA9ICFpc05hTihtLl9kLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgICAgICBtLl9wZi5vdmVyZmxvdyA8IDAgJiZcbiAgICAgICAgICAgICAgICAhbS5fcGYuZW1wdHkgJiZcbiAgICAgICAgICAgICAgICAhbS5fcGYuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAgICAgIW0uX3BmLm51bGxJbnB1dCAmJlxuICAgICAgICAgICAgICAgICFtLl9wZi5pbnZhbGlkRm9ybWF0ICYmXG4gICAgICAgICAgICAgICAgIW0uX3BmLnVzZXJJbnZhbGlkYXRlZDtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIG0uX2lzVmFsaWQgPSBtLl9pc1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIG0uX3BmLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgbS5fcGYudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBtLl9wZi5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZExvY2FsZShuYW1lKSB7XG4gICAgICAgIHZhciBvbGRMb2NhbGUgPSBudWxsO1xuICAgICAgICBpZiAoIWxvY2FsZXNbbmFtZV0gJiYgaGFzTW9kdWxlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IG1vbWVudC5sb2NhbGUoKTtcbiAgICAgICAgICAgICAgICByZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBkZWZpbmVMb2NhbGUgY3VycmVudGx5IGFsc28gc2V0cyB0aGUgZ2xvYmFsIGxvY2FsZSwgd2Ugd2FudCB0byB1bmRvIHRoYXQgZm9yIGxhenkgbG9hZGVkIGxvY2FsZXNcbiAgICAgICAgICAgICAgICBtb21lbnQubG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvdXRjT2Zmc2V0IGVxdWl2YWxlbnQgdG9cbiAgICAvLyBtb2RlbC5cbiAgICBmdW5jdGlvbiBtYWtlQXMoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID0gKG1vbWVudC5pc01vbWVudChpbnB1dCkgfHwgaXNEYXRlKGlucHV0KSA/XG4gICAgICAgICAgICAgICAgICAgICtpbnB1dCA6ICttb21lbnQoaW5wdXQpKSAtICgrcmVzKTtcbiAgICAgICAgICAgIC8vIFVzZSBsb3ctbGV2ZWwgYXBpLCBiZWNhdXNlIHRoaXMgZm4gaXMgbG93LWxldmVsIGFwaS5cbiAgICAgICAgICAgIHJlcy5fZC5zZXRUaW1lKCtyZXMuX2QgKyBkaWZmKTtcbiAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChpbnB1dCkubG9jYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgTG9jYWxlXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICBleHRlbmQoTG9jYWxlLnByb3RvdHlwZSwge1xuXG4gICAgICAgIHNldCA6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICAgICAgZm9yIChpIGluIGNvbmZpZykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBjb25maWdbaV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfb3JkaW5hbFBhcnNlTGVuaWVudC5cbiAgICAgICAgICAgIHRoaXMuX29yZGluYWxQYXJzZUxlbmllbnQgPSBuZXcgUmVnRXhwKHRoaXMuX29yZGluYWxQYXJzZS5zb3VyY2UgKyAnfCcgKyAvXFxkezEsMn0vLnNvdXJjZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX21vbnRocyA6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHMgOiBmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1ttLm1vbnRoKCldO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9tb250aHNTaG9ydCA6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGhzUGFyc2UgOiBmdW5jdGlvbiAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgICAgICBtb20gPSBtb21lbnQudXRjKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgICAgICBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ01NTU0nICYmIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnTU1NJyAmJiB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfd2Vla2RheXMgOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1ttLmRheSgpXTtcbiAgICAgICAgfSxcblxuICAgICAgICBfd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiBmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3dlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5bbS5kYXkoKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2Vla2RheXNQYXJzZSA6IGZ1bmN0aW9uICh3ZWVrZGF5TmFtZSkge1xuICAgICAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBtb20gPSBtb21lbnQoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2xvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFRTIDogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMVCA6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTCA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnTU1NTSBELCBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgTU1NTSBELCBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldO1xuICAgICAgICAgICAgaWYgKCFvdXRwdXQgJiYgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IG91dHB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAgICAgLy8gVXNpbmcgY2hhckF0IHNob3VsZCBiZSBtb3JlIGNvbXBhdGlibGUuXG4gICAgICAgICAgICByZXR1cm4gKChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfbWVyaWRpZW1QYXJzZSA6IC9bYXBdXFwuP20/XFwuPy9pLFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG5cbiAgICAgICAgX2NhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDogZnVuY3Rpb24gKGtleSwgbW9tLCBub3cpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhcltrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBvdXRwdXQgPT09ICdmdW5jdGlvbicgPyBvdXRwdXQuYXBwbHkobW9tLCBbbm93XSkgOiBvdXRwdXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3JlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGFnbycsXG4gICAgICAgICAgICBzIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgbSA6ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaCA6ICclZCBob3VycycsXG4gICAgICAgICAgICBkIDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTSA6ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5IDogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eSA6ICclZCB5ZWFycydcbiAgICAgICAgfSxcblxuICAgICAgICByZWxhdGl2ZVRpbWUgOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBvdXRwdXQgPT09ICdmdW5jdGlvbicpID9cbiAgICAgICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICAgICAgb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFzdEZ1dHVyZSA6IGZ1bmN0aW9uIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbZGlmZiA+IDAgPyAnZnV0dXJlJyA6ICdwYXN0J107XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGZvcm1hdCA9PT0gJ2Z1bmN0aW9uJyA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgX29yZGluYWwgOiAnJWQnLFxuICAgICAgICBfb3JkaW5hbFBhcnNlIDogL1xcZHsxLDJ9LyxcblxuICAgICAgICBwcmVwYXJzZSA6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcG9zdGZvcm1hdCA6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2VlayA6IGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1vbSwgdGhpcy5fd2Vlay5kb3csIHRoaXMuX3dlZWsuZG95KS53ZWVrO1xuICAgICAgICB9LFxuXG4gICAgICAgIF93ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZmlyc3REYXlPZldlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3c7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZmlyc3REYXlPZlllYXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3k7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2ludmFsaWREYXRlOiAnSW52YWxpZCBkYXRlJyxcbiAgICAgICAgaW52YWxpZERhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBGb3JtYXR0aW5nXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICBmdW5jdGlvbiByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5tYXRjaCgvXFxbW1xcc1xcU10vKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gZm9ybWF0Lm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpLCBpLCBsZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV0pIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGFycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gYXJyYXlbaV0gaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG5cbiAgICAgICAgaWYgKCFmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSkge1xuICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPSBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGkgPSA1O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2VucyhpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBsb2NhbEZvcm1hdHRpbmdUb2tlbnMudGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShsb2NhbEZvcm1hdHRpbmdUb2tlbnMsIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2Vucyk7XG4gICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIFBhcnNpbmdcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIC8vIGdldCB0aGUgcmVnZXggdG8gZmluZCB0aGUgbmV4dCB0b2tlblxuICAgIGZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIHZhciBhLCBzdHJpY3QgPSBjb25maWcuX3N0cmljdDtcbiAgICAgICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuT25lRGlnaXQ7XG4gICAgICAgIGNhc2UgJ0REREQnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5UaHJlZURpZ2l0cztcbiAgICAgICAgY2FzZSAnWVlZWSc6XG4gICAgICAgIGNhc2UgJ0dHR0cnOlxuICAgICAgICBjYXNlICdnZ2dnJzpcbiAgICAgICAgICAgIHJldHVybiBzdHJpY3QgPyBwYXJzZVRva2VuRm91ckRpZ2l0cyA6IHBhcnNlVG9rZW5PbmVUb0ZvdXJEaWdpdHM7XG4gICAgICAgIGNhc2UgJ1knOlxuICAgICAgICBjYXNlICdHJzpcbiAgICAgICAgY2FzZSAnZyc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlblNpZ25lZE51bWJlcjtcbiAgICAgICAgY2FzZSAnWVlZWVlZJzpcbiAgICAgICAgY2FzZSAnWVlZWVknOlxuICAgICAgICBjYXNlICdHR0dHRyc6XG4gICAgICAgIGNhc2UgJ2dnZ2dnJzpcbiAgICAgICAgICAgIHJldHVybiBzdHJpY3QgPyBwYXJzZVRva2VuU2l4RGlnaXRzIDogcGFyc2VUb2tlbk9uZVRvU2l4RGlnaXRzO1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbk9uZURpZ2l0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdTUyc6XG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5Ud29EaWdpdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJ1NTUyc6XG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5UaHJlZURpZ2l0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuT25lVG9UaHJlZURpZ2l0cztcbiAgICAgICAgY2FzZSAnTU1NJzpcbiAgICAgICAgY2FzZSAnTU1NTSc6XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgY2FzZSAnZGRkJzpcbiAgICAgICAgY2FzZSAnZGRkZCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbldvcmQ7XG4gICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICAgIHJldHVybiBjb25maWcuX2xvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbk9mZnNldE1zO1xuICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuVGltZXN0YW1wTXM7XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICBjYXNlICdaWic6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlblRpbWV6b25lO1xuICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVRva2VuVDtcbiAgICAgICAgY2FzZSAnU1NTUyc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbkRpZ2l0cztcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICBjYXNlICdERCc6XG4gICAgICAgIGNhc2UgJ1lZJzpcbiAgICAgICAgY2FzZSAnR0cnOlxuICAgICAgICBjYXNlICdnZyc6XG4gICAgICAgIGNhc2UgJ0hIJzpcbiAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgY2FzZSAnd3cnOlxuICAgICAgICBjYXNlICdXVyc6XG4gICAgICAgICAgICByZXR1cm4gc3RyaWN0ID8gcGFyc2VUb2tlblR3b0RpZ2l0cyA6IHBhcnNlVG9rZW5PbmVPclR3b0RpZ2l0cztcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgY2FzZSAnZSc6XG4gICAgICAgIGNhc2UgJ0UnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5PbmVPclR3b0RpZ2l0cztcbiAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgcmV0dXJuIHN0cmljdCA/IGNvbmZpZy5fbG9jYWxlLl9vcmRpbmFsUGFyc2UgOiBjb25maWcuX2xvY2FsZS5fb3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICAgICAgZGVmYXVsdCA6XG4gICAgICAgICAgICBhID0gbmV3IFJlZ0V4cChyZWdleHBFc2NhcGUodW5lc2NhcGVGb3JtYXQodG9rZW4ucmVwbGFjZSgnXFxcXCcsICcnKSksICdpJykpO1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1dGNPZmZzZXRGcm9tU3RyaW5nKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcgfHwgJyc7XG4gICAgICAgIHZhciBwb3NzaWJsZVR6TWF0Y2hlcyA9IChzdHJpbmcubWF0Y2gocGFyc2VUb2tlblRpbWV6b25lKSB8fCBbXSksXG4gICAgICAgICAgICB0ekNodW5rID0gcG9zc2libGVUek1hdGNoZXNbcG9zc2libGVUek1hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW10sXG4gICAgICAgICAgICBwYXJ0cyA9ICh0ekNodW5rICsgJycpLm1hdGNoKHBhcnNlVGltZXpvbmVDaHVua2VyKSB8fCBbJy0nLCAwLCAwXSxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIGZ1bmN0aW9uIHRvIGNvbnZlcnQgc3RyaW5nIGlucHV0IHRvIGRhdGVcbiAgICBmdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgICAgICB2YXIgYSwgZGF0ZVBhcnRBcnJheSA9IGNvbmZpZy5fYTtcblxuICAgICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIFFVQVJURVJcbiAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbTU9OVEhdID0gKHRvSW50KGlucHV0KSAtIDEpICogMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBNT05USFxuICAgICAgICBjYXNlICdNJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBNTVxuICAgICAgICBjYXNlICdNTScgOlxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkYXRlUGFydEFycmF5W01PTlRIXSA9IHRvSW50KGlucHV0KSAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTU1NJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBNTU1NXG4gICAgICAgIGNhc2UgJ01NTU0nIDpcbiAgICAgICAgICAgIGEgPSBjb25maWcuX2xvY2FsZS5tb250aHNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbTU9OVEhdID0gYTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9wZi5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBEQVkgT0YgTU9OVEhcbiAgICAgICAgY2FzZSAnRCcgOiAvLyBmYWxsIHRocm91Z2ggdG8gRERcbiAgICAgICAgY2FzZSAnREQnIDpcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtEQVRFXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdEbycgOlxuICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkYXRlUGFydEFycmF5W0RBVEVdID0gdG9JbnQocGFyc2VJbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubWF0Y2goL1xcZHsxLDJ9LylbMF0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gREFZIE9GIFlFQVJcbiAgICAgICAgY2FzZSAnREREJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBEREREXG4gICAgICAgIGNhc2UgJ0REREQnIDpcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBZRUFSXG4gICAgICAgIGNhc2UgJ1lZJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5W1lFQVJdID0gbW9tZW50LnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdZWVlZJyA6XG4gICAgICAgIGNhc2UgJ1lZWVlZJyA6XG4gICAgICAgIGNhc2UgJ1lZWVlZWScgOlxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtZRUFSXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBBTSAvIFBNXG4gICAgICAgIGNhc2UgJ2EnIDogLy8gZmFsbCB0aHJvdWdoIHRvIEFcbiAgICAgICAgY2FzZSAnQScgOlxuICAgICAgICAgICAgY29uZmlnLl9tZXJpZGllbSA9IGlucHV0O1xuICAgICAgICAgICAgLy8gY29uZmlnLl9pc1BtID0gY29uZmlnLl9sb2NhbGUuaXNQTShpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gSE9VUlxuICAgICAgICBjYXNlICdoJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBoaFxuICAgICAgICBjYXNlICdoaCcgOlxuICAgICAgICAgICAgY29uZmlnLl9wZi5iaWdIb3VyID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnSCcgOiAvLyBmYWxsIHRocm91Z2ggdG8gSEhcbiAgICAgICAgY2FzZSAnSEgnIDpcbiAgICAgICAgICAgIGRhdGVQYXJ0QXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTUlOVVRFXG4gICAgICAgIGNhc2UgJ20nIDogLy8gZmFsbCB0aHJvdWdoIHRvIG1tXG4gICAgICAgIGNhc2UgJ21tJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gU0VDT05EXG4gICAgICAgIGNhc2UgJ3MnIDogLy8gZmFsbCB0aHJvdWdoIHRvIHNzXG4gICAgICAgIGNhc2UgJ3NzJyA6XG4gICAgICAgICAgICBkYXRlUGFydEFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTUlMTElTRUNPTkRcbiAgICAgICAgY2FzZSAnUycgOlxuICAgICAgICBjYXNlICdTUycgOlxuICAgICAgICBjYXNlICdTU1MnIDpcbiAgICAgICAgY2FzZSAnU1NTUycgOlxuICAgICAgICAgICAgZGF0ZVBhcnRBcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFVOSVggT0ZGU0VUIChNSUxMSVNFQ09ORFMpXG4gICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBVTklYIFRJTUVTVEFNUCBXSVRIIE1TXG4gICAgICAgIGNhc2UgJ1gnOlxuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCkgKiAxMDAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBUSU1FWk9ORVxuICAgICAgICBjYXNlICdaJyA6IC8vIGZhbGwgdGhyb3VnaCB0byBaWlxuICAgICAgICBjYXNlICdaWicgOlxuICAgICAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSB1dGNPZmZzZXRGcm9tU3RyaW5nKGlucHV0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBXRUVLREFZIC0gaHVtYW5cbiAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICBjYXNlICdkZGQnOlxuICAgICAgICBjYXNlICdkZGRkJzpcbiAgICAgICAgICAgIGEgPSBjb25maWcuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYSB3ZWVrZGF5IG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZFxuICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcbiAgICAgICAgICAgICAgICBjb25maWcuX3dbJ2QnXSA9IGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBXRUVLLCBXRUVLIERBWSAtIG51bWVyaWNcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgIGNhc2UgJ3d3JzpcbiAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgIGNhc2UgJ1dXJzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgIGNhc2UgJ2UnOlxuICAgICAgICBjYXNlICdFJzpcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKDAsIDEpO1xuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdnZ2dnJzpcbiAgICAgICAgY2FzZSAnR0dHRyc6XG4gICAgICAgIGNhc2UgJ0dHR0dHJzpcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKDAsIDIpO1xuICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl93ID0gY29uZmlnLl93IHx8IHt9O1xuICAgICAgICAgICAgICAgIGNvbmZpZy5fd1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZ2cnOlxuICAgICAgICBjYXNlICdHRyc6XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjb25maWcuX3dbdG9rZW5dID0gbW9tZW50LnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICAgICAgdmFyIHcsIHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSwgdGVtcDtcblxuICAgICAgICB3ID0gY29uZmlnLl93O1xuICAgICAgICBpZiAody5HRyAhPSBudWxsIHx8IHcuVyAhPSBudWxsIHx8IHcuRSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkb3cgPSAxO1xuICAgICAgICAgICAgZG95ID0gNDtcblxuICAgICAgICAgICAgLy8gVE9ETzogV2UgbmVlZCB0byB0YWtlIHRoZSBjdXJyZW50IGlzb1dlZWtZZWFyLCBidXQgdGhhdCBkZXBlbmRzIG9uXG4gICAgICAgICAgICAvLyBob3cgd2UgaW50ZXJwcmV0IG5vdyAobG9jYWwsIHV0YywgZml4ZWQgb2Zmc2V0KS4gU28gY3JlYXRlXG4gICAgICAgICAgICAvLyBhIG5vdyB2ZXJzaW9uIG9mIGN1cnJlbnQgY29uZmlnICh0YWtlIGxvY2FsL3V0Yy9vZmZzZXQgZmxhZ3MsIGFuZFxuICAgICAgICAgICAgLy8gY3JlYXRlIG5vdykuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRmbCh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIobW9tZW50KCksIDEsIDQpLnllYXIpO1xuICAgICAgICAgICAgd2VlayA9IGRmbCh3LlcsIDEpO1xuICAgICAgICAgICAgd2Vla2RheSA9IGRmbCh3LkUsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICAgICAgZG95ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG95O1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRmbCh3LmdnLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIobW9tZW50KCksIGRvdywgZG95KS55ZWFyKTtcbiAgICAgICAgICAgIHdlZWsgPSBkZmwody53LCAxKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IGRvdykge1xuICAgICAgICAgICAgICAgICAgICArK3dlZWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh3LmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGxvY2FsIHdlZWtkYXkgLS0gY291bnRpbmcgc3RhcnRzIGZyb20gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG95LCBkb3cpO1xuXG4gICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGRhdGVGcm9tQ29uZmlnKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIHllYXJUb1VzZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKTtcblxuICAgICAgICAvL2NvbXB1dGUgZGF5IG9mIHRoZSB5ZWFyIGZyb20gd2Vla3MgYW5kIHdlZWtkYXlzXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgY29uZmlnLl9hW0RBVEVdID09IG51bGwgJiYgY29uZmlnLl9hW01PTlRIXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWYgdGhlIGRheSBvZiB0aGUgeWVhciBpcyBzZXQsIGZpZ3VyZSBvdXQgd2hhdCBpdCBpc1xuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIpIHtcbiAgICAgICAgICAgIHllYXJUb1VzZSA9IGRmbChjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9wZi5fb3ZlcmZsb3dEYXlPZlllYXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlID0gbWFrZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gbWFrZVVUQ0RhdGUgOiBtYWtlRGF0ZSkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgICAgICAvLyBBcHBseSB0aW1lem9uZSBvZmZzZXQgZnJvbSBpbnB1dC4gVGhlIGFjdHVhbCB1dGNPZmZzZXQgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgLy8gd2l0aCBwYXJzZVpvbmUuXG4gICAgICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMjQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXRlRnJvbU9iamVjdChjb25maWcpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dDtcblxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpO1xuICAgICAgICBjb25maWcuX2EgPSBbXG4gICAgICAgICAgICBub3JtYWxpemVkSW5wdXQueWVhcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5tb250aCxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgbm9ybWFsaXplZElucHV0LmRhdGUsXG4gICAgICAgICAgICBub3JtYWxpemVkSW5wdXQuaG91cixcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dC5taW51dGUsXG4gICAgICAgICAgICBub3JtYWxpemVkSW5wdXQuc2Vjb25kLFxuICAgICAgICAgICAgbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kXG4gICAgICAgIF07XG5cbiAgICAgICAgZGF0ZUZyb21Db25maWcoY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIG5vdy5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgIG5vdy5nZXRVVENNb250aCgpLFxuICAgICAgICAgICAgICAgIG5vdy5nZXRVVENEYXRlKClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW25vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSwgbm93LmdldERhdGUoKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gbWFrZURhdGVGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBtb21lbnQuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIHBhcnNlSVNPKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgY29uZmlnLl9wZi5lbXB0eSA9IHRydWU7XG5cbiAgICAgICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgY29uZmlnLl9pLFxuICAgICAgICAgICAgaSwgcGFyc2VkSW5wdXQsIHRva2VucywgdG9rZW4sIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDA7XG5cbiAgICAgICAgdG9rZW5zID0gZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgY29uZmlnLl9sb2NhbGUpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpIHx8IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHwgW10pWzBdO1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fcGYudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX3BmLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICAgICAgY29uZmlnLl9wZi5jaGFyc0xlZnRPdmVyID0gc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25maWcuX3BmLnVudXNlZElucHV0LnB1c2goc3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIF8xMmggZmxhZyBpZiBob3VyIGlzIDw9IDEyXG4gICAgICAgIGlmIChjb25maWcuX3BmLmJpZ0hvdXIgPT09IHRydWUgJiYgY29uZmlnLl9hW0hPVVJdIDw9IDEyKSB7XG4gICAgICAgICAgICBjb25maWcuX3BmLmJpZ0hvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIG1lcmlkaWVtXG4gICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IG1lcmlkaWVtRml4V3JhcChjb25maWcuX2xvY2FsZSwgY29uZmlnLl9hW0hPVVJdLFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fbWVyaWRpZW0pO1xuICAgICAgICBkYXRlRnJvbUNvbmZpZyhjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXFxcKFxcWyl8XFxcXChcXF0pfFxcWyhbXlxcXVxcW10qKVxcXXxcXFxcKC4pL2csIGZ1bmN0aW9uIChtYXRjaGVkLCBwMSwgcDIsIHAzLCBwNCkge1xuICAgICAgICAgICAgcmV0dXJuIHAxIHx8IHAyIHx8IHAzIHx8IHA0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gcmVnZXhwRXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbiAgICBmdW5jdGlvbiBtYWtlRGF0ZUZyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIHRlbXBDb25maWcsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fcGYuaW52YWxpZEZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy5fZi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY3VycmVudFNjb3JlID0gMDtcbiAgICAgICAgICAgIHRlbXBDb25maWcgPSBjb3B5Q29uZmlnKHt9LCBjb25maWcpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQ29uZmlnLl91c2VVVEMgPSBjb25maWcuX3VzZVVUQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXBDb25maWcuX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIG1ha2VEYXRlRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gdGVtcENvbmZpZy5fcGYuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSB0ZW1wQ29uZmlnLl9wZi51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgICAgIHRlbXBDb25maWcuX3BmLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoc2NvcmVUb0JlYXQgPT0gbnVsbCB8fCBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuICAgIGZ1bmN0aW9uIHBhcnNlSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gaXNvUmVnZXguZXhlYyhzdHJpbmcpO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgY29uZmlnLl9wZi5pc28gPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKHN0cmluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbNV0gc2hvdWxkIGJlICdUJyBvciB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9mID0gaXNvRGF0ZXNbaV1bMF0gKyAobWF0Y2hbNl0gfHwgJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKHN0cmluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9mICs9IGlzb1RpbWVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RyaW5nLm1hdGNoKHBhcnNlVG9rZW5UaW1lem9uZSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2YgKz0gJ1onO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFrZURhdGVGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0IG9yIGZhbGxiYWNrXG4gICAgZnVuY3Rpb24gbWFrZURhdGVGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICBwYXJzZUlTTyhjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgICAgIG1vbWVudC5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXMucHVzaChmbihhcnJbaV0sIGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VEYXRlRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksIG1hdGNoZWQ7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCtpbnB1dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbWFrZURhdGVGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0ZUZyb21Db25maWcoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YoaW5wdXQpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZGF0ZUZyb21PYmplY3QoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YoaW5wdXQpID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vbWVudC5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZURhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy9jYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MTM0OC9pbnN0YW50aWF0aW5nLWEtamF2YXNjcmlwdC1vYmplY3QtYnktY2FsbGluZy1wcm90b3R5cGUtY29uc3RydWN0b3ItYXBwbHlcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcyk7XG5cbiAgICAgICAgLy90aGUgZGF0ZSBjb25zdHJ1Y3RvciBkb2Vzbid0IGFjY2VwdCB5ZWFycyA8IDE5NzBcbiAgICAgICAgaWYgKHkgPCAxOTcwKSB7XG4gICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VVVENEYXRlKHkpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICAgICAgaWYgKHkgPCAxOTcwKSB7XG4gICAgICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBSZWxhdGl2ZSBUaW1lXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZShwb3NOZWdEdXJhdGlvbiwgd2l0aG91dFN1ZmZpeCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCksXG4gICAgICAgICAgICBzZWNvbmRzID0gcm91bmQoZHVyYXRpb24uYXMoJ3MnKSksXG4gICAgICAgICAgICBtaW51dGVzID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSksXG4gICAgICAgICAgICBob3VycyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpLFxuICAgICAgICAgICAgZGF5cyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpLFxuICAgICAgICAgICAgbW9udGhzID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSksXG4gICAgICAgICAgICB5ZWFycyA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpLFxuXG4gICAgICAgICAgICBhcmdzID0gc2Vjb25kcyA8IHJlbGF0aXZlVGltZVRocmVzaG9sZHMucyAmJiBbJ3MnLCBzZWNvbmRzXSB8fFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPT09IDEgJiYgWydtJ10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDwgcmVsYXRpdmVUaW1lVGhyZXNob2xkcy5tICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzID09PSAxICYmIFsnaCddIHx8XG4gICAgICAgICAgICAgICAgaG91cnMgPCByZWxhdGl2ZVRpbWVUaHJlc2hvbGRzLmggJiYgWydoaCcsIGhvdXJzXSB8fFxuICAgICAgICAgICAgICAgIGRheXMgPT09IDEgJiYgWydkJ10gfHxcbiAgICAgICAgICAgICAgICBkYXlzIDwgcmVsYXRpdmVUaW1lVGhyZXNob2xkcy5kICYmIFsnZGQnLCBkYXlzXSB8fFxuICAgICAgICAgICAgICAgIG1vbnRocyA9PT0gMSAmJiBbJ00nXSB8fFxuICAgICAgICAgICAgICAgIG1vbnRocyA8IHJlbGF0aXZlVGltZVRocmVzaG9sZHMuTSAmJiBbJ01NJywgbW9udGhzXSB8fFxuICAgICAgICAgICAgICAgIHllYXJzID09PSAxICYmIFsneSddIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICAgICAgYXJnc1syXSA9IHdpdGhvdXRTdWZmaXg7XG4gICAgICAgIGFyZ3NbM10gPSArcG9zTmVnRHVyYXRpb24gPiAwO1xuICAgICAgICBhcmdzWzRdID0gbG9jYWxlO1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZVRpbWVBZ28uYXBwbHkoe30sIGFyZ3MpO1xuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBXZWVrIG9mIFllYXJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIC8vIGZpcnN0RGF5T2ZXZWVrICAgICAgIDAgPSBzdW4sIDYgPSBzYXRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF5IG9mIHRoZSB3ZWVrIHRoYXQgc3RhcnRzIHRoZSB3ZWVrXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgc3VuZGF5IG9yIG1vbmRheSlcbiAgICAvLyBmaXJzdERheU9mV2Vla09mWWVhciAwID0gc3VuLCA2ID0gc2F0XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IHdlZWsgaXMgdGhlIHdlZWsgdGhhdCBjb250YWlucyB0aGUgZmlyc3RcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGRheSBvZiB0aGUgd2Vla1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIChlZy4gSVNPIHdlZWtzIHVzZSB0aHVyc2RheSAoNCkpXG4gICAgZnVuY3Rpb24gd2Vla09mWWVhcihtb20sIGZpcnN0RGF5T2ZXZWVrLCBmaXJzdERheU9mV2Vla09mWWVhcikge1xuICAgICAgICB2YXIgZW5kID0gZmlyc3REYXlPZldlZWtPZlllYXIgLSBmaXJzdERheU9mV2VlayxcbiAgICAgICAgICAgIGRheXNUb0RheU9mV2VlayA9IGZpcnN0RGF5T2ZXZWVrT2ZZZWFyIC0gbW9tLmRheSgpLFxuICAgICAgICAgICAgYWRqdXN0ZWRNb21lbnQ7XG5cblxuICAgICAgICBpZiAoZGF5c1RvRGF5T2ZXZWVrID4gZW5kKSB7XG4gICAgICAgICAgICBkYXlzVG9EYXlPZldlZWsgLT0gNztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXlzVG9EYXlPZldlZWsgPCBlbmQgLSA3KSB7XG4gICAgICAgICAgICBkYXlzVG9EYXlPZldlZWsgKz0gNztcbiAgICAgICAgfVxuXG4gICAgICAgIGFkanVzdGVkTW9tZW50ID0gbW9tZW50KG1vbSkuYWRkKGRheXNUb0RheU9mV2VlaywgJ2QnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdlZWs6IE1hdGguY2VpbChhZGp1c3RlZE1vbWVudC5kYXlPZlllYXIoKSAvIDcpLFxuICAgICAgICAgICAgeWVhcjogYWRqdXN0ZWRNb21lbnQueWVhcigpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy9odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGZpcnN0RGF5T2ZXZWVrT2ZZZWFyLCBmaXJzdERheU9mV2Vlaykge1xuICAgICAgICB2YXIgZCA9IG1ha2VVVENEYXRlKHllYXIsIDAsIDEpLmdldFVUQ0RheSgpLCBkYXlzVG9BZGQsIGRheU9mWWVhcjtcblxuICAgICAgICBkID0gZCA9PT0gMCA/IDcgOiBkO1xuICAgICAgICB3ZWVrZGF5ID0gd2Vla2RheSAhPSBudWxsID8gd2Vla2RheSA6IGZpcnN0RGF5T2ZXZWVrO1xuICAgICAgICBkYXlzVG9BZGQgPSBmaXJzdERheU9mV2VlayAtIGQgKyAoZCA+IGZpcnN0RGF5T2ZXZWVrT2ZZZWFyID8gNyA6IDApIC0gKGQgPCBmaXJzdERheU9mV2VlayA/IDcgOiAwKTtcbiAgICAgICAgZGF5T2ZZZWFyID0gNyAqICh3ZWVrIC0gMSkgKyAod2Vla2RheSAtIGZpcnN0RGF5T2ZXZWVrKSArIGRheXNUb0FkZCArIDE7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IGRheU9mWWVhciA+IDAgPyB5ZWFyIDogeWVhciAtIDEsXG4gICAgICAgICAgICBkYXlPZlllYXI6IGRheU9mWWVhciA+IDAgPyAgZGF5T2ZZZWFyIDogZGF5c0luWWVhcih5ZWFyIC0gMSkgKyBkYXlPZlllYXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIFRvcCBMZXZlbCBGdW5jdGlvbnNcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBmdW5jdGlvbiBtYWtlTW9tZW50KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2YsXG4gICAgICAgICAgICByZXM7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBtb21lbnQubG9jYWxlRGF0YShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudC5pbnZhbGlkKHtudWxsSW5wdXQ6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGNvbmZpZy5fbG9jYWxlLnByZXBhcnNlKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb21lbnQuaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChpbnB1dCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgbWFrZURhdGVGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFrZURhdGVGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYWtlRGF0ZUZyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzID0gbmV3IE1vbWVudChjb25maWcpO1xuICAgICAgICBpZiAocmVzLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgaXMgc21hcnQgZW5vdWdoIGFyb3VuZCBEU1RcbiAgICAgICAgICAgIHJlcy5hZGQoMSwgJ2QnKTtcbiAgICAgICAgICAgIHJlcy5fbmV4dERheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgbW9tZW50ID0gZnVuY3Rpb24gKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBjO1xuXG4gICAgICAgIGlmICh0eXBlb2YobG9jYWxlKSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgICAgIGMgPSB7fTtcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgYy5faSA9IGlucHV0O1xuICAgICAgICBjLl9mID0gZm9ybWF0O1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XG4gICAgICAgIGMuX2lzVVRDID0gZmFsc2U7XG4gICAgICAgIGMuX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuXG4gICAgICAgIHJldHVybiBtYWtlTW9tZW50KGMpO1xuICAgIH07XG5cbiAgICBtb21lbnQuc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID0gZmFsc2U7XG5cbiAgICBtb21lbnQuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZS4gVGhpcyBpcyAnICtcbiAgICAgICAgJ2Rpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgbWFqb3IgJyArXG4gICAgICAgICdyZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gJyArXG4gICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQwNyBmb3IgbW9yZSBpbmZvLicsXG4gICAgICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgbW9tZW50Lm1pbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNCZWZvcmUnLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgbW9tZW50Lm1heCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBjcmVhdGluZyB3aXRoIHV0Y1xuICAgIG1vbWVudC51dGMgPSBmdW5jdGlvbiAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGM7XG5cbiAgICAgICAgaWYgKHR5cGVvZihsb2NhbGUpID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcbiAgICAgICAgYyA9IHt9O1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjLl9pc1VUQyA9IHRydWU7XG4gICAgICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuICAgICAgICBjLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcblxuICAgICAgICByZXR1cm4gbWFrZU1vbWVudChjKS51dGMoKTtcbiAgICB9O1xuXG4gICAgLy8gY3JlYXRpbmcgd2l0aCB1bml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcylcbiAgICBtb21lbnQudW5peCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gbW9tZW50KGlucHV0ICogMTAwMCk7XG4gICAgfTtcblxuICAgIC8vIGR1cmF0aW9uXG4gICAgbW9tZW50LmR1cmF0aW9uID0gZnVuY3Rpb24gKGlucHV0LCBrZXkpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5wdXQsXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxuICAgICAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIHBhcnNlSXNvLFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAobW9tZW50LmlzRHVyYXRpb24oaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBtczogaW5wdXQuX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICBkOiBpbnB1dC5fZGF5cyxcbiAgICAgICAgICAgICAgICBNOiBpbnB1dC5fbW9udGhzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb25ba2V5XSA9IGlucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGFzcE5ldFRpbWVTcGFuSnNvblJlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgZDogdG9JbnQobWF0Y2hbREFURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBoOiB0b0ludChtYXRjaFtIT1VSXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG06IHRvSW50KG1hdGNoW01JTlVURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBzOiB0b0ludChtYXRjaFtTRUNPTkRdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXM6IHRvSW50KG1hdGNoW01JTExJU0VDT05EXSkgKiBzaWduXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gaXNvRHVyYXRpb25SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgICAgICBwYXJzZUlzbyA9IGZ1bmN0aW9uIChpbnApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxuICAgICAgICAgICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgICAgICAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IHBhcnNlSXNvKG1hdGNoWzJdKSxcbiAgICAgICAgICAgICAgICBNOiBwYXJzZUlzbyhtYXRjaFszXSksXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNF0pLFxuICAgICAgICAgICAgICAgIGg6IHBhcnNlSXNvKG1hdGNoWzVdKSxcbiAgICAgICAgICAgICAgICBtOiBwYXJzZUlzbyhtYXRjaFs2XSksXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbN10pLFxuICAgICAgICAgICAgICAgIHc6IHBhcnNlSXNvKG1hdGNoWzhdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7Ly8gY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKG1vbWVudChkdXJhdGlvbi5mcm9tKSwgbW9tZW50KGR1cmF0aW9uLnRvKSk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAobW9tZW50LmlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIC8vIHZlcnNpb24gbnVtYmVyXG4gICAgbW9tZW50LnZlcnNpb24gPSBWRVJTSU9OO1xuXG4gICAgLy8gZGVmYXVsdCBmb3JtYXRcbiAgICBtb21lbnQuZGVmYXVsdEZvcm1hdCA9IGlzb0Zvcm1hdDtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbiAgICBtb21lbnQuSVNPXzg2MDEgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIFBsdWdpbnMgdGhhdCBhZGQgcHJvcGVydGllcyBzaG91bGQgYWxzbyBhZGQgdGhlIGtleSBoZXJlIChudWxsIHZhbHVlKSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxuICAgIG1vbWVudC5tb21lbnRQcm9wZXJ0aWVzID0gbW9tZW50UHJvcGVydGllcztcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICBtb21lbnQudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBtb21lbnQucmVsYXRpdmVUaW1lVGhyZXNob2xkID0gZnVuY3Rpb24gKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHJlbGF0aXZlVGltZVRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVRpbWVUaHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgcmVsYXRpdmVUaW1lVGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBtb21lbnQubGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQubG9jYWxlKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBtb21lbnQubG9jYWxlID0gZnVuY3Rpb24gKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mKHZhbHVlcykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IG1vbWVudC5sb2NhbGVEYXRhKGtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgbW9tZW50LmR1cmF0aW9uLl9sb2NhbGUgPSBtb21lbnQuX2xvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9tZW50Ll9sb2NhbGUuX2FiYnI7XG4gICAgfTtcblxuICAgIG1vbWVudC5kZWZpbmVMb2NhbGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlcy5hYmJyID0gbmFtZTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdLnNldCh2YWx1ZXMpO1xuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIG1vbWVudC5sb2NhbGUobmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1vbWVudC5sYW5nRGF0YSA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLFxuICAgICAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50LmxvY2FsZURhdGEoa2V5KTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyByZXR1cm5zIGxvY2FsZSBkYXRhXG4gICAgbW9tZW50LmxvY2FsZURhdGEgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfTtcblxuICAgIC8vIGNvbXBhcmUgbW9tZW50IG9iamVjdFxuICAgIG1vbWVudC5pc01vbWVudCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE1vbWVudCB8fFxuICAgICAgICAgICAgKG9iaiAhPSBudWxsICYmIGhhc093blByb3Aob2JqLCAnX2lzQU1vbWVudE9iamVjdCcpKTtcbiAgICB9O1xuXG4gICAgLy8gZm9yIHR5cGVjaGVja2luZyBEdXJhdGlvbiBvYmplY3RzXG4gICAgbW9tZW50LmlzRHVyYXRpb24gPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9O1xuXG4gICAgZm9yIChpID0gbGlzdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbWFrZUxpc3QobGlzdHNbaV0pO1xuICAgIH1cblxuICAgIG1vbWVudC5ub3JtYWxpemVVbml0cyA9IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgIH07XG5cbiAgICBtb21lbnQuaW52YWxpZCA9IGZ1bmN0aW9uIChmbGFncykge1xuICAgICAgICB2YXIgbSA9IG1vbWVudC51dGMoTmFOKTtcbiAgICAgICAgaWYgKGZsYWdzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dGVuZChtLl9wZiwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbS5fcGYudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH07XG5cbiAgICBtb21lbnQucGFyc2Vab25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfTtcblxuICAgIG1vbWVudC5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICBtb21lbnQuaXNEYXRlID0gaXNEYXRlO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICBNb21lbnQgUHJvdG90eXBlXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cbiAgICBleHRlbmQobW9tZW50LmZuID0gTW9tZW50LnByb3RvdHlwZSwge1xuXG4gICAgICAgIGNsb25lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudCh0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICB2YWx1ZU9mIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICt0aGlzLl9kIC0gKCh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5peCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKCt0aGlzIC8gMTAwMCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9EYXRlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29mZnNldCA/IG5ldyBEYXRlKCt0aGlzKSA6IHRoaXMuX2Q7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9JU09TdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbSA9IG1vbWVudCh0aGlzKS51dGMoKTtcbiAgICAgICAgICAgIGlmICgwIDwgbS55ZWFyKCkgJiYgbS55ZWFyKCkgPD0gOTk5OSkge1xuICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uIGlzIH41MHggZmFzdGVyLCB1c2UgaXQgd2hlbiB3ZSBjYW5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0b0FycmF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBtLnllYXIoKSxcbiAgICAgICAgICAgICAgICBtLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgbS5kYXRlKCksXG4gICAgICAgICAgICAgICAgbS5ob3VycygpLFxuICAgICAgICAgICAgICAgIG0ubWludXRlcygpLFxuICAgICAgICAgICAgICAgIG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgICAgIG0ubWlsbGlzZWNvbmRzKClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNWYWxpZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzRFNUU2hpZnRlZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpICYmIGNvbXBhcmVBcnJheXModGhpcy5fYSwgKHRoaXMuX2lzVVRDID8gbW9tZW50LnV0Yyh0aGlzLl9hKSA6IG1vbWVudCh0aGlzLl9hKSkudG9BcnJheSgpKSA+IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBwYXJzaW5nRmxhZ3MgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCB0aGlzLl9wZik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW52YWxpZEF0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGYub3ZlcmZsb3c7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXRjIDogZnVuY3Rpb24gKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICBsb2NhbCA6IGZ1bmN0aW9uIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdCh0aGlzLl9kYXRlVXRjT2Zmc2V0KCksICdtJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9ybWF0IDogZnVuY3Rpb24gKGlucHV0U3RyaW5nKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nIHx8IG1vbWVudC5kZWZhdWx0Rm9ybWF0KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWRkIDogY3JlYXRlQWRkZXIoMSwgJ2FkZCcpLFxuXG4gICAgICAgIHN1YnRyYWN0IDogY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpLFxuXG4gICAgICAgIGRpZmYgOiBmdW5jdGlvbiAoaW5wdXQsIHVuaXRzLCBhc0Zsb2F0KSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IG1ha2VBcyhpbnB1dCwgdGhpcyksXG4gICAgICAgICAgICAgICAgem9uZURpZmYgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0LFxuICAgICAgICAgICAgICAgIGFuY2hvciwgZGlmZiwgb3V0cHV0LCBkYXlzQWRqdXN0O1xuXG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICAgICAgaWYgKHVuaXRzID09PSAneWVhcicgfHwgdW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICdxdWFydGVyJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTtcbiAgICAgICAgICAgICAgICBpZiAodW5pdHMgPT09ICdxdWFydGVyJykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQgLyAzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQgLyAxMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpZmYgPSB0aGlzIC0gdGhhdDtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB1bml0cyA9PT0gJ3NlY29uZCcgPyBkaWZmIC8gMWUzIDogLy8gMTAwMFxuICAgICAgICAgICAgICAgICAgICB1bml0cyA9PT0gJ21pbnV0ZScgPyBkaWZmIC8gNmU0IDogLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnaG91cicgPyBkaWZmIC8gMzZlNSA6IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnZGF5JyA/IChkaWZmIC0gem9uZURpZmYpIC8gODY0ZTUgOiAvLyAxMDAwICogNjAgKiA2MCAqIDI0LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICAgICAgICAgIHVuaXRzID09PSAnd2VlaycgPyAoZGlmZiAtIHpvbmVEaWZmKSAvIDYwNDhlNSA6IC8vIDEwMDAgKiA2MCAqIDYwICogMjQgKiA3LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICAgICAgICAgIGRpZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic1JvdW5kKG91dHB1dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbSA6IGZ1bmN0aW9uICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50LmR1cmF0aW9uKHt0bzogdGhpcywgZnJvbTogdGltZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZnJvbU5vdyA6IGZ1bmN0aW9uICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tKG1vbWVudCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSxcblxuICAgICAgICBjYWxlbmRhciA6IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYXQvdXRjL29mZnNldFxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgbW9tZW50KCksXG4gICAgICAgICAgICAgICAgc29kID0gbWFrZUFzKG5vdywgdGhpcykuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICAgICAgZGlmZiA9IHRoaXMuZGlmZihzb2QsICdkYXlzJywgdHJ1ZSksXG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZGlmZiA8IC02ID8gJ3NhbWVFbHNlJyA6XG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPCAtMSA/ICdsYXN0V2VlaycgOlxuICAgICAgICAgICAgICAgICAgICBkaWZmIDwgMCA/ICdsYXN0RGF5JyA6XG4gICAgICAgICAgICAgICAgICAgIGRpZmYgPCAxID8gJ3NhbWVEYXknIDpcbiAgICAgICAgICAgICAgICAgICAgZGlmZiA8IDIgPyAnbmV4dERheScgOlxuICAgICAgICAgICAgICAgICAgICBkaWZmIDwgNyA/ICduZXh0V2VlaycgOiAnc2FtZUVsc2UnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKGZvcm1hdCwgdGhpcywgbW9tZW50KG5vdykpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0xlYXBZZWFyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzRFNUIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF5IDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgZGF5ID0gdGhpcy5faXNVVEMgPyB0aGlzLl9kLmdldFVUQ0RheSgpIDogdGhpcy5fZC5nZXREYXkoKTtcbiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoaW5wdXQgLSBkYXksICdkJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGggOiBtYWtlQWNjZXNzb3IoJ01vbnRoJywgdHJ1ZSksXG5cbiAgICAgICAgc3RhcnRPZiA6IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHN3aXRjaCBpbnRlbnRpb25hbGx5IG9taXRzIGJyZWFrIGtleXdvcmRzXG4gICAgICAgICAgICAvLyB0byB1dGlsaXplIGZhbGxpbmcgdGhyb3VnaCB0aGUgY2FzZXMuXG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgxKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kcygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmRzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd2Vla3MgYXJlIGEgc3BlY2lhbCBjYXNlXG4gICAgICAgICAgICBpZiAodW5pdHMgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheSgwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09ICdpc29XZWVrJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNvV2Vla2RheSgxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXVhcnRlcnMgYXJlIGFsc28gc3BlY2lhbFxuICAgICAgICAgICAgaWYgKHVuaXRzID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKE1hdGguZmxvb3IodGhpcy5tb250aCgpIC8gMykgKiAzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5kT2Y6IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBpZiAodW5pdHMgPT09IHVuZGVmaW5lZCB8fCB1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0cykuYWRkKDEsICh1bml0cyA9PT0gJ2lzb1dlZWsnID8gJ3dlZWsnIDogdW5pdHMpKS5zdWJ0cmFjdCgxLCAnbXMnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0FmdGVyOiBmdW5jdGlvbiAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgICAgICB2YXIgaW5wdXRNcztcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModHlwZW9mIHVuaXRzICE9PSAndW5kZWZpbmVkJyA/IHVuaXRzIDogJ21pbGxpc2Vjb25kJyk7XG4gICAgICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG1vbWVudC5pc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IG1vbWVudChpbnB1dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICt0aGlzID4gK2lucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dE1zID0gbW9tZW50LmlzTW9tZW50KGlucHV0KSA/ICtpbnB1dCA6ICttb21lbnQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dE1zIDwgK3RoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBpc0JlZm9yZTogZnVuY3Rpb24gKGlucHV0LCB1bml0cykge1xuICAgICAgICAgICAgdmFyIGlucHV0TXM7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHR5cGVvZiB1bml0cyAhPT0gJ3VuZGVmaW5lZCcgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBtb21lbnQuaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBtb21lbnQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiArdGhpcyA8ICtpbnB1dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXRNcyA9IG1vbWVudC5pc01vbWVudChpbnB1dCkgPyAraW5wdXQgOiArbW9tZW50KGlucHV0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gK3RoaXMuY2xvbmUoKS5lbmRPZih1bml0cykgPCBpbnB1dE1zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGlzQmV0d2VlbjogZnVuY3Rpb24gKGZyb20sIHRvLCB1bml0cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNBZnRlcihmcm9tLCB1bml0cykgJiYgdGhpcy5pc0JlZm9yZSh0bywgdW5pdHMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzU2FtZTogZnVuY3Rpb24gKGlucHV0LCB1bml0cykge1xuICAgICAgICAgICAgdmFyIGlucHV0TXM7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzIHx8ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBtb21lbnQuaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBtb21lbnQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiArdGhpcyA9PT0gK2lucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dE1zID0gK21vbWVudChpbnB1dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICsodGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpKSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gKyh0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtaW46IGRlcHJlY2F0ZShcbiAgICAgICAgICAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTU0OCcsXG4gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBtb21lbnQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA8IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICksXG5cbiAgICAgICAgbWF4OiBkZXByZWNhdGUoXG4gICAgICAgICAgICAgICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTU0OCcsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyID0gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICApLFxuXG4gICAgICAgIHpvbmUgOiBkZXByZWNhdGUoXG4gICAgICAgICAgICAgICAgJ21vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiAnICtcbiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE3NzknLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgKSxcblxuICAgICAgICAvLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbiAgICAgICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAgICAgLy8gNTozMToyNiArMDIwMCBJdCBpcyBwb3NzaWJsZSB0aGF0IDU6MzE6MjYgZG9lc24ndCBleGlzdCB3aXRoIG9mZnNldFxuICAgICAgICAvLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEtlZXBpbmcgdGhlIHRpbWUgYWN0dWFsbHkgYWRkcy9zdWJ0cmFjdHMgKG9uZSBob3VyKVxuICAgICAgICAvLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbiAgICAgICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgICAgICAvLyBfY2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlIGNhc2UsIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QsIGJlY2F1c2VcbiAgICAgICAgLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbiAgICAgICAgdXRjT2Zmc2V0IDogZnVuY3Rpb24gKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3Q7XG4gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gdXRjT2Zmc2V0RnJvbVN0cmluZyhpbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNikge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNVVEMgJiYga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbEFkanVzdCA9IHRoaXMuX2RhdGVVdGNPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbEFkanVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3JTdWJ0cmFjdER1cmF0aW9uRnJvbU1vbWVudCh0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb21lbnQuZHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksIDEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb21lbnQudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogdGhpcy5fZGF0ZVV0Y09mZnNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGlzTG9jYWwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuX2lzVVRDO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzVXRjT2Zmc2V0IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzVXRjIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMDtcbiAgICAgICAgfSxcblxuICAgICAgICB6b25lQWJiciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgem9uZU5hbWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2Vab25lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3R6bSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9pID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHV0Y09mZnNldEZyb21TdHJpbmcodGhpcy5faSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGFzQWxpZ25lZEhvdXJPZmZzZXQgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG1vbWVudChpbnB1dCkudXRjT2Zmc2V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAodGhpcy51dGNPZmZzZXQoKSAtIGlucHV0KSAlIDYwID09PSAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRheXNJbk1vbnRoIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRheU9mWWVhciA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIGRheU9mWWVhciA9IHJvdW5kKChtb21lbnQodGhpcykuc3RhcnRPZignZGF5JykgLSBtb21lbnQodGhpcykuc3RhcnRPZigneWVhcicpKSAvIDg2NGU1KSArIDE7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKChpbnB1dCAtIGRheU9mWWVhciksICdkJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcXVhcnRlciA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMykgOiB0aGlzLm1vbnRoKChpbnB1dCAtIDEpICogMyArIHRoaXMubW9udGgoKSAlIDMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWtZZWFyIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgeWVhciA9IHdlZWtPZlllYXIodGhpcywgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LCB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpLnllYXI7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHllYXIgOiB0aGlzLmFkZCgoaW5wdXQgLSB5ZWFyKSwgJ3knKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc29XZWVrWWVhciA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHllYXIgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLnllYXI7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHllYXIgOiB0aGlzLmFkZCgoaW5wdXQgLSB5ZWFyKSwgJ3knKTtcbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgd2VlayA9IHRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNvV2VlayA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2Vla2RheSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSAodGhpcy5kYXkoKSArIDcgLSB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpICUgNztcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc29XZWVrZGF5IDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgICAgICAvLyBhcyBhIGdldHRlciwgcmV0dXJucyA3IGluc3RlYWQgb2YgMCAoMS03IHJhbmdlIGluc3RlYWQgb2YgMC02KVxuICAgICAgICAgICAgLy8gYXMgYSBzZXR0ZXIsIHN1bmRheSBzaG91bGQgYmVsb25nIHRvIHRoZSBwcmV2aW91cyB3ZWVrLlxuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB0aGlzLmRheSgpIHx8IDcgOiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IGlucHV0IDogaW5wdXQgLSA3KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc29XZWVrc0luWWVhciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2Vla3NJblllYXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCA6IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQgOiBmdW5jdGlvbiAodW5pdHMsIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgdW5pdDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9yICh1bml0IGluIHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHVuaXQsIHVuaXRzW3VuaXRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbdW5pdHNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgICAgIC8vIGluc3RhbmNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJldHVybiB0aGUgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAgICBsb2NhbGUgOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3TG9jYWxlRGF0YSA9IG1vbWVudC5sb2NhbGVEYXRhKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0xvY2FsZURhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBsYW5nIDogZGVwcmVjYXRlKFxuICAgICAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKSxcblxuICAgICAgICBsb2NhbGVEYXRhIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZGF0ZVV0Y09mZnNldCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9wdWxsLzE4NzFcbiAgICAgICAgICAgIHJldHVybiAtTWF0aC5yb3VuZCh0aGlzLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiByYXdNb250aFNldHRlcihtb20sIHZhbHVlKSB7XG4gICAgICAgIHZhciBkYXlPZk1vbnRoO1xuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBvdXQgb2YgaGVyZSFcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbW9tLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBUT0RPOiBBbm90aGVyIHNpbGVudCBmYWlsdXJlP1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGF5T2ZNb250aCA9IE1hdGgubWluKG1vbS5kYXRlKCksXG4gICAgICAgICAgICAgICAgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByYXdHZXR0ZXIobW9tLCB1bml0KSB7XG4gICAgICAgIHJldHVybiBtb20uX2RbJ2dldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0oKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByYXdTZXR0ZXIobW9tLCB1bml0LCB2YWx1ZSkge1xuICAgICAgICBpZiAodW5pdCA9PT0gJ01vbnRoJykge1xuICAgICAgICAgICAgcmV0dXJuIHJhd01vbnRoU2V0dGVyKG1vbSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQWNjZXNzb3IodW5pdCwga2VlcFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByYXdTZXR0ZXIodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIG1vbWVudC51cGRhdGVPZmZzZXQodGhpcywga2VlcFRpbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmF3R2V0dGVyKHRoaXMsIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG1vbWVudC5mbi5taWxsaXNlY29uZCA9IG1vbWVudC5mbi5taWxsaXNlY29uZHMgPSBtYWtlQWNjZXNzb3IoJ01pbGxpc2Vjb25kcycsIGZhbHNlKTtcbiAgICBtb21lbnQuZm4uc2Vjb25kID0gbW9tZW50LmZuLnNlY29uZHMgPSBtYWtlQWNjZXNzb3IoJ1NlY29uZHMnLCBmYWxzZSk7XG4gICAgbW9tZW50LmZuLm1pbnV0ZSA9IG1vbWVudC5mbi5taW51dGVzID0gbWFrZUFjY2Vzc29yKCdNaW51dGVzJywgZmFsc2UpO1xuICAgIC8vIFNldHRpbmcgdGhlIGhvdXIgc2hvdWxkIGtlZXAgdGhlIHRpbWUsIGJlY2F1c2UgdGhlIHVzZXIgZXhwbGljaXRseVxuICAgIC8vIHNwZWNpZmllZCB3aGljaCBob3VyIGhlIHdhbnRzLiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAvLyB0aGlzIHJ1bGUuXG4gICAgbW9tZW50LmZuLmhvdXIgPSBtb21lbnQuZm4uaG91cnMgPSBtYWtlQWNjZXNzb3IoJ0hvdXJzJywgdHJ1ZSk7XG4gICAgLy8gbW9tZW50LmZuLm1vbnRoIGlzIGRlZmluZWQgc2VwYXJhdGVseVxuICAgIG1vbWVudC5mbi5kYXRlID0gbWFrZUFjY2Vzc29yKCdEYXRlJywgdHJ1ZSk7XG4gICAgbW9tZW50LmZuLmRhdGVzID0gZGVwcmVjYXRlKCdkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLicsIG1ha2VBY2Nlc3NvcignRGF0ZScsIHRydWUpKTtcbiAgICBtb21lbnQuZm4ueWVhciA9IG1ha2VBY2Nlc3NvcignRnVsbFllYXInLCB0cnVlKTtcbiAgICBtb21lbnQuZm4ueWVhcnMgPSBkZXByZWNhdGUoJ3llYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWQuJywgbWFrZUFjY2Vzc29yKCdGdWxsWWVhcicsIHRydWUpKTtcblxuICAgIC8vIGFkZCBwbHVyYWwgbWV0aG9kc1xuICAgIG1vbWVudC5mbi5kYXlzID0gbW9tZW50LmZuLmRheTtcbiAgICBtb21lbnQuZm4ubW9udGhzID0gbW9tZW50LmZuLm1vbnRoO1xuICAgIG1vbWVudC5mbi53ZWVrcyA9IG1vbWVudC5mbi53ZWVrO1xuICAgIG1vbWVudC5mbi5pc29XZWVrcyA9IG1vbWVudC5mbi5pc29XZWVrO1xuICAgIG1vbWVudC5mbi5xdWFydGVycyA9IG1vbWVudC5mbi5xdWFydGVyO1xuXG4gICAgLy8gYWRkIGFsaWFzZWQgZm9ybWF0IG1ldGhvZHNcbiAgICBtb21lbnQuZm4udG9KU09OID0gbW9tZW50LmZuLnRvSVNPU3RyaW5nO1xuXG4gICAgLy8gYWxpYXMgaXNVdGMgZm9yIGRldi1mcmllbmRsaW5lc3NcbiAgICBtb21lbnQuZm4uaXNVVEMgPSBtb21lbnQuZm4uaXNVdGM7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIER1cmF0aW9uIFByb3RvdHlwZVxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXG4gICAgZnVuY3Rpb24gZGF5c1RvWWVhcnMgKGRheXMpIHtcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgICAgICByZXR1cm4gZGF5cyAqIDQwMCAvIDE0NjA5NztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB5ZWFyc1RvRGF5cyAoeWVhcnMpIHtcbiAgICAgICAgLy8geWVhcnMgKiAzNjUgKyBhYnNSb3VuZCh5ZWFycyAvIDQpIC1cbiAgICAgICAgLy8gICAgIGFic1JvdW5kKHllYXJzIC8gMTAwKSArIGFic1JvdW5kKHllYXJzIC8gNDAwKTtcbiAgICAgICAgcmV0dXJuIHllYXJzICogMTQ2MDk3IC8gNDAwO1xuICAgIH1cblxuICAgIGV4dGVuZChtb21lbnQuZHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGUsIHtcblxuICAgICAgICBfYnViYmxlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyxcbiAgICAgICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMsXG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2RhdGEsXG4gICAgICAgICAgICAgICAgc2Vjb25kcywgbWludXRlcywgaG91cnMsIHllYXJzID0gMDtcblxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgICAgICBzZWNvbmRzID0gYWJzUm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgICAgIG1pbnV0ZXMgPSBhYnNSb3VuZChzZWNvbmRzIC8gNjApO1xuICAgICAgICAgICAgZGF0YS5taW51dGVzID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgICAgICBob3VycyA9IGFic1JvdW5kKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgICAgICBkYXRhLmhvdXJzID0gaG91cnMgJSAyNDtcblxuICAgICAgICAgICAgZGF5cyArPSBhYnNSb3VuZChob3VycyAvIDI0KTtcblxuICAgICAgICAgICAgLy8gQWNjdXJhdGVseSBjb252ZXJ0IGRheXMgdG8geWVhcnMsIGFzc3VtZSBzdGFydCBmcm9tIHllYXIgMC5cbiAgICAgICAgICAgIHllYXJzID0gYWJzUm91bmQoZGF5c1RvWWVhcnMoZGF5cykpO1xuICAgICAgICAgICAgZGF5cyAtPSBhYnNSb3VuZCh5ZWFyc1RvRGF5cyh5ZWFycykpO1xuXG4gICAgICAgICAgICAvLyAzMCBkYXlzIHRvIGEgbW9udGhcbiAgICAgICAgICAgIC8vIFRPRE8gKGlza3Jlbik6IFVzZSBhbmNob3IgZGF0ZSAobGlrZSAxc3QgSmFuKSB0byBjb21wdXRlIHRoaXMuXG4gICAgICAgICAgICBtb250aHMgKz0gYWJzUm91bmQoZGF5cyAvIDMwKTtcbiAgICAgICAgICAgIGRheXMgJT0gMzA7XG5cbiAgICAgICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgICAgIHllYXJzICs9IGFic1JvdW5kKG1vbnRocyAvIDEyKTtcbiAgICAgICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICAgICAgZGF0YS5kYXlzID0gZGF5cztcbiAgICAgICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgICAgICAgICAgZGF0YS55ZWFycyA9IHllYXJzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFicyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9IE1hdGguYWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgICAgICB0aGlzLl9kYXlzID0gTWF0aC5hYnModGhpcy5fZGF5cyk7XG4gICAgICAgICAgICB0aGlzLl9tb250aHMgPSBNYXRoLmFicyh0aGlzLl9tb250aHMpO1xuXG4gICAgICAgICAgICB0aGlzLl9kYXRhLm1pbGxpc2Vjb25kcyA9IE1hdGguYWJzKHRoaXMuX2RhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEuc2Vjb25kcyA9IE1hdGguYWJzKHRoaXMuX2RhdGEuc2Vjb25kcyk7XG4gICAgICAgICAgICB0aGlzLl9kYXRhLm1pbnV0ZXMgPSBNYXRoLmFicyh0aGlzLl9kYXRhLm1pbnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5fZGF0YS5ob3VycyA9IE1hdGguYWJzKHRoaXMuX2RhdGEuaG91cnMpO1xuICAgICAgICAgICAgdGhpcy5fZGF0YS5tb250aHMgPSBNYXRoLmFicyh0aGlzLl9kYXRhLm1vbnRocyk7XG4gICAgICAgICAgICB0aGlzLl9kYXRhLnllYXJzID0gTWF0aC5hYnModGhpcy5fZGF0YS55ZWFycyk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWtzIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGFic1JvdW5kKHRoaXMuZGF5cygpIC8gNyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdmFsdWVPZiA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9taWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgICAodGhpcy5fbW9udGhzICUgMTIpICogMjU5MmU2ICtcbiAgICAgICAgICAgICAgdG9JbnQodGhpcy5fbW9udGhzIC8gMTIpICogMzE1MzZlNjtcbiAgICAgICAgfSxcblxuICAgICAgICBodW1hbml6ZSA6IGZ1bmN0aW9uICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gcmVsYXRpdmVUaW1lKHRoaXMsICF3aXRoU3VmZml4LCB0aGlzLmxvY2FsZURhdGEoKSk7XG5cbiAgICAgICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcy5sb2NhbGVEYXRhKCkucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhZGQgOiBmdW5jdGlvbiAoaW5wdXQsIHZhbCkge1xuICAgICAgICAgICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKG1vbWVudClcbiAgICAgICAgICAgIHZhciBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQsIHZhbCk7XG5cbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArPSBkdXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHRoaXMuX2RheXMgKz0gZHVyLl9kYXlzO1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzICs9IGR1ci5fbW9udGhzO1xuXG4gICAgICAgICAgICB0aGlzLl9idWJibGUoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3VidHJhY3QgOiBmdW5jdGlvbiAoaW5wdXQsIHZhbCkge1xuICAgICAgICAgICAgdmFyIGR1ciA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCwgdmFsKTtcblxuICAgICAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzIC09IGR1ci5fbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgdGhpcy5fZGF5cyAtPSBkdXIuX2RheXM7XG4gICAgICAgICAgICB0aGlzLl9tb250aHMgLT0gZHVyLl9tb250aHM7XG5cbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgOiBmdW5jdGlvbiAodW5pdHMpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHMudG9Mb3dlckNhc2UoKSArICdzJ10oKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhcyA6IGZ1bmN0aW9uICh1bml0cykge1xuICAgICAgICAgICAgdmFyIGRheXMsIG1vbnRocztcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgdGhpcy5fbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvWWVhcnMoZGF5cykgKiAxMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5pdHMgPT09ICdtb250aCcgPyBtb250aHMgOiBtb250aHMgLyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIG1pbGxpc2Vjb25kcyBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2YgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgKGlzc3VlICMxODY3KVxuICAgICAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZCh5ZWFyc1RvRGF5cyh0aGlzLl9tb250aHMgLyAxMikpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2Vlayc6IHJldHVybiBkYXlzIC8gNyArIHRoaXMuX21pbGxpc2Vjb25kcyAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGF5JzogcmV0dXJuIGRheXMgKyB0aGlzLl9taWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaG91cic6IHJldHVybiBkYXlzICogMjQgKyB0aGlzLl9taWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnOiByZXR1cm4gZGF5cyAqIDI0ICogNjAgKyB0aGlzLl9taWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6IHJldHVybiBkYXlzICogMjQgKiA2MCAqIDYwICsgdGhpcy5fbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzogcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApICsgdGhpcy5fbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdW5pdCAnICsgdW5pdHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBsYW5nIDogbW9tZW50LmZuLmxhbmcsXG4gICAgICAgIGxvY2FsZSA6IG1vbWVudC5mbi5sb2NhbGUsXG5cbiAgICAgICAgdG9Jc29TdHJpbmcgOiBkZXByZWNhdGUoXG4gICAgICAgICAgICAndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAnICtcbiAgICAgICAgICAgICcobm90aWNlIHRoZSBjYXBpdGFscyknLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICksXG5cbiAgICAgICAgdG9JU09TdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICAgICAgdmFyIHllYXJzID0gTWF0aC5hYnModGhpcy55ZWFycygpKSxcbiAgICAgICAgICAgICAgICBtb250aHMgPSBNYXRoLmFicyh0aGlzLm1vbnRocygpKSxcbiAgICAgICAgICAgICAgICBkYXlzID0gTWF0aC5hYnModGhpcy5kYXlzKCkpLFxuICAgICAgICAgICAgICAgIGhvdXJzID0gTWF0aC5hYnModGhpcy5ob3VycygpKSxcbiAgICAgICAgICAgICAgICBtaW51dGVzID0gTWF0aC5hYnModGhpcy5taW51dGVzKCkpLFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBNYXRoLmFicyh0aGlzLnNlY29uZHMoKSArIHRoaXMubWlsbGlzZWNvbmRzKCkgLyAxMDAwKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmFzU2Vjb25kcygpKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgICAgIC8vIGJ1dCBub3Qgb3RoZXIgSlMgKGdvb2cuZGF0ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1AwRCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAodGhpcy5hc1NlY29uZHMoKSA8IDAgPyAnLScgOiAnJykgK1xuICAgICAgICAgICAgICAgICdQJyArXG4gICAgICAgICAgICAgICAgKHllYXJzID8geWVhcnMgKyAnWScgOiAnJykgK1xuICAgICAgICAgICAgICAgIChtb250aHMgPyBtb250aHMgKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgICAgIChkYXlzID8gZGF5cyArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgKChob3VycyB8fCBtaW51dGVzIHx8IHNlY29uZHMpID8gJ1QnIDogJycpICtcbiAgICAgICAgICAgICAgICAoaG91cnMgPyBob3VycyArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgKG1pbnV0ZXMgPyBtaW51dGVzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgICAgICAoc2Vjb25kcyA/IHNlY29uZHMgKyAnUycgOiAnJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbG9jYWxlRGF0YSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9KU09OIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbW9tZW50LmR1cmF0aW9uLmZuLnRvU3RyaW5nID0gbW9tZW50LmR1cmF0aW9uLmZuLnRvSVNPU3RyaW5nO1xuXG4gICAgZnVuY3Rpb24gbWFrZUR1cmF0aW9uR2V0dGVyKG5hbWUpIHtcbiAgICAgICAgbW9tZW50LmR1cmF0aW9uLmZuW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFbbmFtZV07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yIChpIGluIHVuaXRNaWxsaXNlY29uZEZhY3RvcnMpIHtcbiAgICAgICAgaWYgKGhhc093blByb3AodW5pdE1pbGxpc2Vjb25kRmFjdG9ycywgaSkpIHtcbiAgICAgICAgICAgIG1ha2VEdXJhdGlvbkdldHRlcihpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbW9tZW50LmR1cmF0aW9uLmZuLmFzTWlsbGlzZWNvbmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcygnbXMnKTtcbiAgICB9O1xuICAgIG1vbWVudC5kdXJhdGlvbi5mbi5hc1NlY29uZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzKCdzJyk7XG4gICAgfTtcbiAgICBtb21lbnQuZHVyYXRpb24uZm4uYXNNaW51dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcygnbScpO1xuICAgIH07XG4gICAgbW9tZW50LmR1cmF0aW9uLmZuLmFzSG91cnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzKCdoJyk7XG4gICAgfTtcbiAgICBtb21lbnQuZHVyYXRpb24uZm4uYXNEYXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcygnZCcpO1xuICAgIH07XG4gICAgbW9tZW50LmR1cmF0aW9uLmZuLmFzV2Vla3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzKCd3ZWVrcycpO1xuICAgIH07XG4gICAgbW9tZW50LmR1cmF0aW9uLmZuLmFzTW9udGhzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcygnTScpO1xuICAgIH07XG4gICAgbW9tZW50LmR1cmF0aW9uLmZuLmFzWWVhcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzKCd5Jyk7XG4gICAgfTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRGVmYXVsdCBMb2NhbGVcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSwgb3RoZXIgbG9jYWxlIHdpbGwgaW5oZXJpdCBmcm9tIEVuZ2xpc2guXG4gICAgbW9tZW50LmxvY2FsZSgnZW4nLCB7XG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0b0ludChudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGFmcmlrYWFucyAoYWYpXG4vLyBhdXRob3IgOiBXZXJuZXIgTW9sbGVudHplIDogaHR0cHM6Ly9naXRodWIuY29tL3dlcm5lcm1cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FmJywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyaWVfRmVicnVhcmllX01hYXJ0X0FwcmlsX01laV9KdW5pZV9KdWxpZV9BdWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuX0ZlYl9NYXJfQXByX01laV9KdW5fSnVsX0F1Z19TZXBfT2t0X05vdl9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ1NvbmRhZ19NYWFuZGFnX0RpbnNkYWdfV29lbnNkYWdfRG9uZGVyZGFnX1ZyeWRhZ19TYXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTb25fTWFhX0Rpbl9Xb2VfRG9uX1ZyeV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1NvX01hX0RpX1dvX0RvX1ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvdm18bm0vaSxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9ebm0kL2kudGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3ZtJyA6ICdWTSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ25tJyA6ICdOTSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tWYW5kYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW03DtHJlIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbR2lzdGVyIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbTGFhc10gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdvb3IgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBnZWxlZGUnLFxuICAgICAgICAgICAgcyA6ICdcXCduIHBhYXIgc2Vrb25kZXMnLFxuICAgICAgICAgICAgbSA6ICdcXCduIG1pbnV1dCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGUnLFxuICAgICAgICAgICAgaCA6ICdcXCduIHV1cicsXG4gICAgICAgICAgICBoaCA6ICclZCB1cmUnLFxuICAgICAgICAgICAgZCA6ICdcXCduIGRhZycsXG4gICAgICAgICAgICBkZCA6ICclZCBkYWUnLFxuICAgICAgICAgICAgTSA6ICdcXCduIG1hYW5kJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1hYW5kZScsXG4gICAgICAgICAgICB5IDogJ1xcJ24gamFhcicsXG4gICAgICAgICAgICB5eSA6ICclZCBqYWFyJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwKSA/ICdzdGUnIDogJ2RlJyk7IC8vIFRoYW5rcyB0byBKb3JpcyBSw7ZsaW5nIDogaHR0cHM6Ly9naXRodWIuY29tL2pqdXBpdGVyXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNYWFuZGFnIGlzIGRpZSBlZXJzdGUgZGFnIHZhbiBkaWUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIERpZSB3ZWVrIHdhdCBkaWUgNGRlIEphbnVhcmllIGJldmF0IGlzIGRpZSBlZXJzdGUgd2VlayB2YW4gZGllIGphYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogTW9yb2NjYW4gQXJhYmljIChhci1tYSlcbi8vIGF1dGhvciA6IEVsRmFkaWxpIFlhc3NpbmUgOiBodHRwczovL2dpdGh1Yi5jb20vRWxGYWRpbGlZXG4vLyBhdXRob3IgOiBBYmRlbCBTYWlkIDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItbWEnLCB7XG4gICAgICAgIG1vbnRocyA6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfYp9mE2KPYrdivX9in2YTYpdiq2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn2KfYrdivX9in2KrZhtmK2YZf2KvZhNin2KvYp9ihX9in2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgcyA6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBtIDogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW0gOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoIDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoIDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZCA6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQgOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTSA6ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU0gOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeSA6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXkgOiAnJWQg2LPZhtmI2KfYqidcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiAxMiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IEFyYWJpYyBTYXVkaSBBcmFiaWEgKGFyLXNhKVxuLy8gYXV0aG9yIDogU3VoYWlsIEFsa293YWlsZWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3hzb2hcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgJzEnOiAn2aEnLFxuICAgICAgICAnMic6ICfZoicsXG4gICAgICAgICczJzogJ9mjJyxcbiAgICAgICAgJzQnOiAn2aQnLFxuICAgICAgICAnNSc6ICfZpScsXG4gICAgICAgICc2JzogJ9mmJyxcbiAgICAgICAgJzcnOiAn2acnLFxuICAgICAgICAnOCc6ICfZqCcsXG4gICAgICAgICc5JzogJ9mpJyxcbiAgICAgICAgJzAnOiAn2aAnXG4gICAgfSwgbnVtYmVyTWFwID0ge1xuICAgICAgICAn2aEnOiAnMScsXG4gICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAn2aQnOiAnNCcsXG4gICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAn2acnOiAnNycsXG4gICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAn2aAnOiAnMCdcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXNhJywge1xuICAgICAgICBtb250aHMgOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2YrZiF/ZitmI2YbZitmIX9mK2YjZhNmK2Yhf2KPYutiz2LfYs1/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mK2Yhf2YrZiNmG2YrZiF/ZitmI2YTZitmIX9ij2LrYs9i32LNf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHMgOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgbSA6ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tIDogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaCA6ICfYs9in2LnYqScsXG4gICAgICAgICAgICBoaCA6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQgOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkIDogJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgIE0gOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NIDogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHkgOiAn2LPZhtipJyxcbiAgICAgICAgICAgIHl5IDogJyVkINiz2YbZiNin2KonXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KS5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgIDogVHVuaXNpYW4gQXJhYmljIChhci10bilcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXRuJywge1xuICAgICAgICBtb250aHM6ICfYrNin2YbZgdmKX9mB2YrZgdix2Ypf2YXYp9ix2LNf2KPZgdix2YrZhF/Zhdin2Ypf2KzZiNin2YZf2KzZiNmK2YTZitipX9ij2YjYql/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn2KzYp9mG2YHZil/ZgdmK2YHYsdmKX9mF2KfYsdizX9ij2YHYsdmK2YRf2YXYp9mKX9is2YjYp9mGX9is2YjZitmE2YrYqV/Yo9mI2Kpf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdMVDpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0IC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBMb2NhbGU6IEFyYWJpYyAoYXIpXG4vLyBBdXRob3I6IEFiZGVsIFNhaWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcbi8vIENoYW5nZXMgaW4gbW9udGhzLCB3ZWVrZGF5czogQWhtZWQgRWxraGF0aWJcbi8vIE5hdGl2ZSBwbHVyYWwgZm9ybXM6IGZvcmFiaSBodHRwczovL2dpdGh1Yi5jb20vZm9yYWJpXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ9mhJyxcbiAgICAgICAgJzInOiAn2aInLFxuICAgICAgICAnMyc6ICfZoycsXG4gICAgICAgICc0JzogJ9mkJyxcbiAgICAgICAgJzUnOiAn2aUnLFxuICAgICAgICAnNic6ICfZpicsXG4gICAgICAgICc3JzogJ9mnJyxcbiAgICAgICAgJzgnOiAn2agnLFxuICAgICAgICAnOSc6ICfZqScsXG4gICAgICAgICcwJzogJ9mgJ1xuICAgIH0sIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAn2aInOiAnMicsXG4gICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAn2aUnOiAnNScsXG4gICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAn2agnOiAnOCcsXG4gICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgJ9mgJzogJzAnXG4gICAgfSwgcGx1cmFsRm9ybSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuID09PSAwID8gMCA6IG4gPT09IDEgPyAxIDogbiA9PT0gMiA/IDIgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMCA/IDMgOiBuICUgMTAwID49IDExID8gNCA6IDU7XG4gICAgfSwgcGx1cmFscyA9IHtcbiAgICAgICAgcyA6IFsn2KPZgtmEINmF2YYg2KvYp9mG2YrYqScsICfYq9in2YbZitipINmI2KfYrdiv2KknLCBbJ9ir2KfZhtmK2KrYp9mGJywgJ9ir2KfZhtmK2KrZitmGJ10sICclZCDYq9mI2KfZhicsICclZCDYq9in2YbZitipJywgJyVkINir2KfZhtmK2KknXSxcbiAgICAgICAgbSA6IFsn2KPZgtmEINmF2YYg2K/ZgtmK2YLYqScsICfYr9mC2YrZgtipINmI2KfYrdiv2KknLCBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sICclZCDYr9mC2KfYptmCJywgJyVkINiv2YLZitmC2KknLCAnJWQg2K/ZgtmK2YLYqSddLFxuICAgICAgICBoIDogWyfYo9mC2YQg2YXZhiDYs9in2LnYqScsICfYs9in2LnYqSDZiNin2K3Yr9ipJywgWyfYs9in2LnYqtin2YYnLCAn2LPYp9i52KrZitmGJ10sICclZCDYs9in2LnYp9iqJywgJyVkINiz2KfYudipJywgJyVkINiz2KfYudipJ10sXG4gICAgICAgIGQgOiBbJ9ij2YLZhCDZhdmGINmK2YjZhScsICfZitmI2YUg2YjYp9it2K8nLCBbJ9mK2YjZhdin2YYnLCAn2YrZiNmF2YrZhiddLCAnJWQg2KPZitin2YUnLCAnJWQg2YrZiNmF2YvYpycsICclZCDZitmI2YUnXSxcbiAgICAgICAgTSA6IFsn2KPZgtmEINmF2YYg2LTZh9ixJywgJ9i02YfYsSDZiNin2K3YrycsIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sICclZCDYo9i02YfYsScsICclZCDYtNmH2LHYpycsICclZCDYtNmH2LEnXSxcbiAgICAgICAgeSA6IFsn2KPZgtmEINmF2YYg2LnYp9mFJywgJ9i52KfZhSDZiNin2K3YrycsIFsn2LnYp9mF2KfZhicsICfYudin2YXZitmGJ10sICclZCDYo9i52YjYp9mFJywgJyVkINi52KfZhdmL2KcnLCAnJWQg2LnYp9mFJ11cbiAgICB9LCBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgdmFyIGYgPSBwbHVyYWxGb3JtKG51bWJlciksXG4gICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgaWYgKGYgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBzdHJbd2l0aG91dFN1ZmZpeCA/IDAgOiAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICAgICAgfTtcbiAgICB9LCBtb250aHMgPSBbXG4gICAgICAgICfZg9in2YbZiNmGINin2YTYq9in2YbZiiDZitmG2KfZitixJyxcbiAgICAgICAgJ9i02KjYp9i3INmB2KjYsdin2YrYsScsXG4gICAgICAgICfYotiw2KfYsSDZhdin2LHYsycsXG4gICAgICAgICfZhtmK2LPYp9mGINij2KjYsdmK2YQnLFxuICAgICAgICAn2KPZitin2LEg2YXYp9mK2YgnLFxuICAgICAgICAn2K3YstmK2LHYp9mGINmK2YjZhtmK2YgnLFxuICAgICAgICAn2KrZhdmI2LIg2YrZiNmE2YrZiCcsXG4gICAgICAgICfYotioINij2LrYs9i32LMnLFxuICAgICAgICAn2KPZitmE2YjZhCDYs9io2KrZhdio2LEnLFxuICAgICAgICAn2KrYtNix2YrZhiDYp9mE2KPZiNmEINij2YPYqtmI2KjYsScsXG4gICAgICAgICfYqti02LHZitmGINin2YTYq9in2YbZiiDZhtmI2YHZhdio2LEnLFxuICAgICAgICAn2YPYp9mG2YjZhiDYp9mE2KPZiNmEINiv2YrYs9mF2KjYsSdcbiAgICBdO1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyJywge1xuICAgICAgICBtb250aHMgOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0IDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5cyA6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9mL2Kcg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzIDogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBtIDogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbSA6IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgaCA6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgaGggOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQgOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIGRkIDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBNIDogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTSA6IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgeSA6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICAgICAgeXkgOiBwbHVyYWxpemUoJ3knKVxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b2aHZotmj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSkucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KS5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDEyICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogYXplcmJhaWphbmkgKGF6KVxuLy8gYXV0aG9yIDogdG9wY2hpeWV2IDogaHR0cHM6Ly9naXRodWIuY29tL3RvcGNoaXlldlxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6ICctaW5jaScsXG4gICAgICAgIDU6ICctaW5jaScsXG4gICAgICAgIDg6ICctaW5jaScsXG4gICAgICAgIDcwOiAnLWluY2knLFxuICAgICAgICA4MDogJy1pbmNpJyxcblxuICAgICAgICAyOiAnLW5jaScsXG4gICAgICAgIDc6ICctbmNpJyxcbiAgICAgICAgMjA6ICctbmNpJyxcbiAgICAgICAgNTA6ICctbmNpJyxcblxuICAgICAgICAzOiAnLcO8bmPDvCcsXG4gICAgICAgIDQ6ICctw7xuY8O8JyxcbiAgICAgICAgMTAwOiAnLcO8bmPDvCcsXG5cbiAgICAgICAgNjogJy1uY8SxJyxcblxuICAgICAgICA5OiAnLXVuY3UnLFxuICAgICAgICAxMDogJy11bmN1JyxcbiAgICAgICAgMzA6ICctdW5jdScsXG5cbiAgICAgICAgNjA6ICctxLFuY8SxJyxcbiAgICAgICAgOTA6ICctxLFuY8SxJ1xuICAgIH07XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2F6Jywge1xuICAgICAgICBtb250aHMgOiAneWFudmFyX2ZldnJhbF9tYXJ0X2FwcmVsX21heV9peXVuX2l5dWxfYXZxdXN0X3NlbnR5YWJyX29rdHlhYnJfbm95YWJyX2Rla2Ficicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAneWFuX2Zldl9tYXJfYXByX21heV9peW5faXlsX2F2cV9zZW5fb2t0X25veV9kZWsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ0JhemFyX0JhemFyIGVydMmZc2lfw4fJmXLFn8mZbmLJmSBheMWfYW3EsV/Dh8mZcsWfyZluYsmZX0PDvG3JmSBheMWfYW3EsV9Dw7xtyZlfxZ7JmW5iyZknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnQmF6X0J6RV/Dh0F4X8OHyZlyX0NBeF9Dw7xtX8WeyZluJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdCel9CRV/Dh0Ffw4fJmV9DQV9Dw7xfxZ7JmScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW2J1Z8O8biBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tzYWJhaCBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdbZ8mZbMmZbiBoyZlmdMmZXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tkw7xuyZluXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdba2XDp8mZbiBoyZlmdMmZXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMgc29ucmEnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDJmXZ2yZlsJyxcbiAgICAgICAgICAgIHMgOiAnYmlybmXDp8mZIHNhbml5ecmZJyxcbiAgICAgICAgICAgIG0gOiAnYmlyIGTJmXFpccmZJyxcbiAgICAgICAgICAgIG1tIDogJyVkIGTJmXFpccmZJyxcbiAgICAgICAgICAgIGggOiAnYmlyIHNhYXQnLFxuICAgICAgICAgICAgaGggOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBkIDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGfDvG4nLFxuICAgICAgICAgICAgTSA6ICdiaXIgYXknLFxuICAgICAgICAgICAgTU0gOiAnJWQgYXknLFxuICAgICAgICAgICAgeSA6ICdiaXIgaWwnLFxuICAgICAgICAgICAgeXkgOiAnJWQgaWwnXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9nZWPJmXxzyZloyZlyfGfDvG5kw7x6fGF4xZ9hbS8sXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXihnw7xuZMO8enxheMWfYW0pJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdnZWPJmSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc8mZaMmZcic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZ8O8bmTDvHonO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2F4xZ9hbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjEsW5jxLF8aW5jaXxuY2l8w7xuY8O8fG5jxLF8dW5jdSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkgeyAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICctxLFuY8SxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciAlIDEwMCAtIGEsXG4gICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGJlbGFydXNpYW4gKGJlKVxuLy8gYXV0aG9yIDogRG1pdHJ5IERlbWlkb3YgOiBodHRwczovL2dpdGh1Yi5jb20vZGVtaWRvdjkxXG4vLyBhdXRob3I6IFByYWxlc2thOiBodHRwOi8vcHJhbGVza2EucHJvL1xuLy8gQXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgZnVuY3Rpb24gcGx1cmFsKHdvcmQsIG51bSkge1xuICAgICAgICB2YXIgZm9ybXMgPSB3b3JkLnNwbGl0KCdfJyk7XG4gICAgICAgIHJldHVybiBudW0gJSAxMCA9PT0gMSAmJiBudW0gJSAxMDAgIT09IDExID8gZm9ybXNbMF0gOiAobnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApID8gZm9ybXNbMV0gOiBmb3Jtc1syXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgJ21tJzogd2l0aG91dFN1ZmZpeCA/ICfRhdCy0ZbQu9GW0L3QsF/RhdCy0ZbQu9GW0L3Ri1/RhdCy0ZbQu9GW0L0nIDogJ9GF0LLRltC70ZbQvdGDX9GF0LLRltC70ZbQvdGLX9GF0LLRltC70ZbQvScsXG4gICAgICAgICAgICAnaGgnOiB3aXRob3V0U3VmZml4ID8gJ9Cz0LDQtNC30ZbQvdCwX9Cz0LDQtNC30ZbQvdGLX9Cz0LDQtNC30ZbQvScgOiAn0LPQsNC00LfRltC90YNf0LPQsNC00LfRltC90Ytf0LPQsNC00LfRltC9JyxcbiAgICAgICAgICAgICdkZCc6ICfQtNC30LXQvdGMX9C00L3Rll/QtNC30ZHQvScsXG4gICAgICAgICAgICAnTU0nOiAn0LzQtdGB0Y/Rhl/QvNC10YHRj9GG0Ytf0LzQtdGB0Y/RhtCw0Z4nLFxuICAgICAgICAgICAgJ3l5JzogJ9Cz0L7QtF/Qs9Cw0LTRi1/Qs9Cw0LTQvtGeJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAoa2V5ID09PSAnbScpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9GF0LLRltC70ZbQvdCwJyA6ICfRhdCy0ZbQu9GW0L3Rgyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9Cz0LDQtNC30ZbQvdCwJyA6ICfQs9Cw0LTQt9GW0L3Rgyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgbW9udGhzID0ge1xuICAgICAgICAgICAgJ25vbWluYXRpdmUnOiAn0YHRgtGD0LTQt9C10L3RjF/Qu9GO0YLRi1/RgdCw0LrQsNCy0ZbQul/QutGA0LDRgdCw0LLRltC6X9GC0YDQsNCy0LXQvdGMX9GH0Y3RgNCy0LXQvdGMX9C70ZbQv9C10L3RjF/QttC90ZbQstC10L3RjF/QstC10YDQsNGB0LXQvdGMX9C60LDRgdGC0YDRi9GH0L3RltC6X9C70ZbRgdGC0LDQv9Cw0LRf0YHQvdC10LbQsNC90YwnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICAnYWNjdXNhdGl2ZSc6ICfRgdGC0YPQtNC30LXQvdGPX9C70Y7RgtCw0LPQsF/RgdCw0LrQsNCy0ZbQutCwX9C60YDQsNGB0LDQstGW0LrQsF/RgtGA0LDRntC90Y9f0YfRjdGA0LLQtdC90Y9f0LvRltC/0LXQvdGPX9C20L3RltGe0L3Rj1/QstC10YDQsNGB0L3Rj1/QutCw0YHRgtGA0YvRh9C90ZbQutCwX9C70ZbRgdGC0LDQv9Cw0LTQsF/RgdC90LXQttC90Y8nLnNwbGl0KCdfJylcbiAgICAgICAgfSxcblxuICAgICAgICBub3VuQ2FzZSA9ICgvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKykrTU1NTT8vKS50ZXN0KGZvcm1hdCkgP1xuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnIDpcbiAgICAgICAgICAgICdub21pbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gbW9udGhzW25vdW5DYXNlXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzQ2FzZVJlcGxhY2UobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IHtcbiAgICAgICAgICAgICdub21pbmF0aXZlJzogJ9C90Y/QtNC30LXQu9GPX9C/0LDQvdGP0LTQt9C10LvQsNC6X9Cw0Z7RgtC+0YDQsNC6X9GB0LXRgNCw0LTQsF/Rh9Cw0YbQstC10YBf0L/Rj9GC0L3RltGG0LBf0YHRg9Cx0L7RgtCwJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnOiAn0L3Rj9C00LfQtdC70Y5f0L/QsNC90Y/QtNC30LXQu9Cw0Lpf0LDRntGC0L7RgNCw0Lpf0YHQtdGA0LDQtNGDX9GH0LDRhtCy0LXRgF/Qv9GP0YLQvdGW0YbRg1/RgdGD0LHQvtGC0YMnLnNwbGl0KCdfJylcbiAgICAgICAgfSxcblxuICAgICAgICBub3VuQ2FzZSA9ICgvXFxbID9b0JLQsl0gPyg/OtC80ZbQvdGD0LvRg9GOfNC90LDRgdGC0YPQv9C90YPRjik/ID9cXF0gP2RkZGQvKS50ZXN0KGZvcm1hdCkgP1xuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnIDpcbiAgICAgICAgICAgICdub21pbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gd2Vla2RheXNbbm91bkNhc2VdW20uZGF5KCldO1xuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdiZScsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzQ2FzZVJlcGxhY2UsXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ9GB0YLRg9C0X9C70Y7Rgl/RgdCw0Lpf0LrRgNCw0YFf0YLRgNCw0LJf0YfRjdGA0LJf0LvRltC/X9C20L3RltCyX9Cy0LXRgF/QutCw0YHRgl/Qu9GW0YHRgl/RgdC90LXQticuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiB3ZWVrZGF5c0Nhc2VSZXBsYWNlLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9C90LRf0L/QvV/QsNGCX9GB0YBf0YfRhl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9C90LRf0L/QvV/QsNGCX9GB0YBf0YfRhl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWSDQsy4nLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZINCzLiwgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSDQsy4sIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0KHRkdC90L3RjyDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQl9Cw0Z7RgtGA0LAg0Z5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0KPRh9C+0YDQsCDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vQo10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0KMg0LzRltC90YPQu9GD0Y5dIGRkZGQgW9GeXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CjINC80ZbQvdGD0LvRi10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAn0L/RgNCw0LcgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDRgtCw0LzRgycsXG4gICAgICAgICAgICBzIDogJ9C90LXQutCw0LvRjNC60ZYg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbW0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoaCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkIDogJ9C00LfQtdC90YwnLFxuICAgICAgICAgICAgZGQgOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTSA6ICfQvNC10YHRj9GGJyxcbiAgICAgICAgICAgIE1NIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHkgOiAn0LPQvtC0JyxcbiAgICAgICAgICAgIHl5IDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0Yt80YDQsNC90ZbRhtGLfNC00L3Rj3zQstC10YfQsNGA0LAvLFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o0LTQvdGPfNCy0LXRh9Cw0YDQsCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C90L7Rh9GLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgNCw0L3RltGG0YsnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0LDRgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0ZZ80Yt80LPQsCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChudW1iZXIgJSAxMCA9PT0gMiB8fCBudW1iZXIgJSAxMCA9PT0gMykgJiYgKG51bWJlciAlIDEwMCAhPT0gMTIgJiYgbnVtYmVyICUgMTAwICE9PSAxMykgPyBudW1iZXIgKyAnLdGWJyA6IG51bWJlciArICct0YsnO1xuICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQsCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGJ1bGdhcmlhbiAoYmcpXG4vLyBhdXRob3IgOiBLcmFzZW4gQm9yaXNvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rcmF6XG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdiZycsIHtcbiAgICAgICAgbW9udGhzIDogJ9GP0L3Rg9Cw0YDQuF/RhNC10LLRgNGD0LDRgNC4X9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNC5X9GO0L3QuF/RjtC70Lhf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCy0YDQuF/QvtC60YLQvtC80LLRgNC4X9C90L7QtdC80LLRgNC4X9C00LXQutC10LzQstGA0LgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ9GP0L3RgF/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Llf0Y7QvdC4X9GO0LvQuF/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfQvdC10LTQtdC70Y9f0L/QvtC90LXQtNC10LvQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNGP0LTQsF/Rh9C10YLQstGK0YDRgtGK0Lpf0L/QtdGC0YrQul/RgdGK0LHQvtGC0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0L3QtdC0X9C/0L7QvV/QstGC0L5f0YHRgNGPX9GH0LXRgl/Qv9C10YJf0YHRitCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnRC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9CU0L3QtdGBINCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vQo9GC0YDQtSDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBb0LJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW9CS0YfQtdGA0LAg0LJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQuNC30LzQuNC90LDQu9Cw0YLQsF0gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC40LfQvNC40L3QsNC70LjRj10gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9GB0LvQtdC0ICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn0L/RgNC10LTQuCAlcycsXG4gICAgICAgICAgICBzIDogJ9C90Y/QutC+0LvQutC+INGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIG0gOiAn0LzQuNC90YPRgtCwJyxcbiAgICAgICAgICAgIG1tIDogJyVkINC80LjQvdGD0YLQuCcsXG4gICAgICAgICAgICBoIDogJ9GH0LDRgScsXG4gICAgICAgICAgICBoaCA6ICclZCDRh9Cw0YHQsCcsXG4gICAgICAgICAgICBkIDogJ9C00LXQvScsXG4gICAgICAgICAgICBkZCA6ICclZCDQtNC90LgnLFxuICAgICAgICAgICAgTSA6ICfQvNC10YHQtdGGJyxcbiAgICAgICAgICAgIE1NIDogJyVkINC80LXRgdC10YbQsCcsXG4gICAgICAgICAgICB5IDogJ9Cz0L7QtNC40L3QsCcsXG4gICAgICAgICAgICB5eSA6ICclZCDQs9C+0LTQuNC90LgnXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQtdCyfNC10L180YLQuHzQstC4fNGA0Lh80LzQuCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogQmVuZ2FsaSAoYm4pXG4vLyBhdXRob3IgOiBLYXVzaGlrIEdhbmRoaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYXVzaGlrZ2FuZGhpXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ+CnpycsXG4gICAgICAgICcyJzogJ+CnqCcsXG4gICAgICAgICczJzogJ+CnqScsXG4gICAgICAgICc0JzogJ+CnqicsXG4gICAgICAgICc1JzogJ+CnqycsXG4gICAgICAgICc2JzogJ+CnrCcsXG4gICAgICAgICc3JzogJ+CnrScsXG4gICAgICAgICc4JzogJ+CnricsXG4gICAgICAgICc5JzogJ+CnrycsXG4gICAgICAgICcwJzogJ+CnpidcbiAgICB9LFxuICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ+Cnpyc6ICcxJyxcbiAgICAgICAgJ+CnqCc6ICcyJyxcbiAgICAgICAgJ+CnqSc6ICczJyxcbiAgICAgICAgJ+Cnqic6ICc0JyxcbiAgICAgICAgJ+Cnqyc6ICc1JyxcbiAgICAgICAgJ+CnrCc6ICc2JyxcbiAgICAgICAgJ+CnrSc6ICc3JyxcbiAgICAgICAgJ+Cnric6ICc4JyxcbiAgICAgICAgJ+Cnryc6ICc5JyxcbiAgICAgICAgJ+Cnpic6ICcwJ1xuICAgIH07XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnYm4nLCB7XG4gICAgICAgIG1vbnRocyA6ICfgppzgpr7gpqjgp4Hgp5/gpr7gprDgp4Bf4Kar4KeH4Kas4KeB4Kef4Ka+4Kaw4KeAX+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaF4KaX4Ka+4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn+Cnh+CmruCnjeCmrOCmsF/gpoXgppXgp43gpp/gp4vgpqzgprBf4Kao4Kat4KeH4Kau4KeN4Kas4KawX+CmoeCmv+CmuOCnh+CmruCnjeCmrOCmsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4Kac4Ka+4Kao4KeBX+Cmq+Cnh+CmrF/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KawX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4KayX+CmheCml1/gprjgp4fgpqrgp43gpp9f4KaF4KaV4KeN4Kaf4KeLX+CmqOCmrV/gpqHgpr/gprjgp4fgpq7gp40nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+CmsOCmrOCmv+CmrOCmvuCmsF/gprjgp4vgpq7gpqzgpr7gprBf4Kau4KaZ4KeN4KaX4Kay4Kas4Ka+4KawX+CmrOCngeCmp+CmrOCmvuCmsF/gpqzgp4Pgprngprjgp43gpqrgpqTgp43gpqTgpr/gpqzgpr7gprBf4Ka24KeB4KaV4KeN4Kaw4KeB4Kas4Ka+4KawX+CmtuCmqOCmv+CmrOCmvuCmsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4KeN4Kak4Ka/X+CmtuCngeCmleCnjeCmsOCngV/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+CmsOCmrF/gprjgpq5f4Kau4KaZ4KeN4KaXX+CmrOCngV/gpqzgp43gprDgpr/gprlf4Ka24KeBX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExUUyA6ICdBIGg6bW06c3Mg4Ka44Kau4KefJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+CmhuCmnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4KaG4KaX4Ka+4Kau4KeA4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgppfgpqTgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgppfgpqRdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDgpqrgprDgp4cnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDgpobgppfgp4cnLFxuICAgICAgICAgICAgcyA6ICfgppXgpo/gppUg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIG0gOiAn4KaP4KaVIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBtbSA6ICclZCDgpq7gpr/gpqjgpr/gpp8nLFxuICAgICAgICAgICAgaCA6ICfgpo/gppUg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGhoIDogJyVkIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBkIDogJ+Cmj+CmlSDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgZGQgOiAnJWQg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIE0gOiAn4KaP4KaVIOCmruCmvuCmuCcsXG4gICAgICAgICAgICBNTSA6ICclZCDgpq7gpr7gprgnLFxuICAgICAgICAgICAgeSA6ICfgpo/gppUg4Kas4Kab4KawJyxcbiAgICAgICAgICAgIHl5IDogJyVkIOCmrOCmm+CmsCdcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cnp+CnqOCnqeCnquCnq+CnrOCnreCnruCnr+Cnpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CmsOCmvuCmpHzgprbgppXgpr7gprJ84Kam4KeB4Kaq4KeB4KawfOCmrOCmv+CmleCnh+CmsnzgprDgpr7gpqQvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijgpqbgp4Hgpqrgp4HgprB84Kas4Ka/4KaV4KeH4KayfOCmsOCmvuCmpCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy9CZW5nYWxpIGlzIGEgdmFzdCBsYW5ndWFnZSBpdHMgc3Bva2VuXG4gICAgICAgIC8vaW4gZGlmZmVyZW50IGZvcm1zIGluIHZhcmlvdXMgcGFydHMgb2YgdGhlIHdvcmxkLlxuICAgICAgICAvL0kgaGF2ZSBqdXN0IGdlbmVyYWxpemVkIHdpdGggbW9zdCBjb21tb24gb25lIHVzZWRcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ka24KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqbgp4Hgpqrgp4HgprAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmrOCmv+CmleCnh+Cmsic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IHRpYmV0YW4gKGJvKVxuLy8gYXV0aG9yIDogVGh1cHRlbiBOLiBDaGFrcmlzaGFyIDogaHR0cHM6Ly9naXRodWIuY29tL3ZhanJhZG9nXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ+C8oScsXG4gICAgICAgICcyJzogJ+C8oicsXG4gICAgICAgICczJzogJ+C8oycsXG4gICAgICAgICc0JzogJ+C8pCcsXG4gICAgICAgICc1JzogJ+C8pScsXG4gICAgICAgICc2JzogJ+C8picsXG4gICAgICAgICc3JzogJ+C8pycsXG4gICAgICAgICc4JzogJ+C8qCcsXG4gICAgICAgICc5JzogJ+C8qScsXG4gICAgICAgICcwJzogJ+C8oCdcbiAgICB9LFxuICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ+C8oSc6ICcxJyxcbiAgICAgICAgJ+C8oic6ICcyJyxcbiAgICAgICAgJ+C8oyc6ICczJyxcbiAgICAgICAgJ+C8pCc6ICc0JyxcbiAgICAgICAgJ+C8pSc6ICc1JyxcbiAgICAgICAgJ+C8pic6ICc2JyxcbiAgICAgICAgJ+C8pyc6ICc3JyxcbiAgICAgICAgJ+C8qCc6ICc4JyxcbiAgICAgICAgJ+C8qSc6ICc5JyxcbiAgICAgICAgJ+C8oCc6ICcwJ1xuICAgIH07XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnYm8nLCB7XG4gICAgICAgIG1vbnRocyA6ICfgvZ/gvrPgvIvgvZbgvIvgvZHgvYTgvIvgvZTgvbxf4L2f4L6z4LyL4L2W4LyL4L2C4L2J4L2y4L2m4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9guC9puC9tOC9mOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvZ7gvbLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2j4L6U4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9keC+suC9tOC9guC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvZHgvbTgvZPgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2i4L6S4L6x4L2R4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9keC9guC9tOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2C4L2F4L2y4L2C4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9guC9ieC9suC9puC8i+C9lCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4L2f4L6z4LyL4L2W4LyL4L2R4L2E4LyL4L2U4L28X+C9n+C+s+C8i+C9luC8i+C9guC9ieC9suC9puC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvYLgvabgvbTgvZjgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2e4L2y4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9o+C+lOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvrLgvbTgvYLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2R4L204L2T4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9ouC+kuC+seC9keC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvYLgvbTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9guC9heC9suC9guC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvYLgvYngvbLgvabgvIvgvZQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+C9guC9n+C9oOC8i+C9ieC9suC8i+C9mOC8i1/gvYLgvZ/gvaDgvIvgvZ/gvrPgvIvgvZbgvItf4L2C4L2f4L2g4LyL4L2Y4L2y4L2C4LyL4L2R4L2Y4L2i4LyLX+C9guC9n+C9oOC8i+C9o+C+t+C9guC8i+C9lOC8i1/gvYLgvZ/gvaDgvIvgvZXgvbTgvaLgvIvgvZbgvbRf4L2C4L2f4L2g4LyL4L2U4LyL4L2m4L2E4L2m4LyLX+C9guC9n+C9oOC8i+C9puC+pOC9uuC9k+C8i+C9lOC8iycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfgvYngvbLgvIvgvZjgvItf4L2f4L6z4LyL4L2W4LyLX+C9mOC9suC9guC8i+C9keC9mOC9ouC8i1/gvaPgvrfgvYLgvIvgvZTgvItf4L2V4L204L2i4LyL4L2W4L20X+C9lOC8i+C9puC9hOC9puC8i1/gvabgvqTgvbrgvZPgvIvgvZTgvIsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+C9ieC9suC8i+C9mOC8i1/gvZ/gvrPgvIvgvZbgvItf4L2Y4L2y4L2C4LyL4L2R4L2Y4L2i4LyLX+C9o+C+t+C9guC8i+C9lOC8i1/gvZXgvbTgvaLgvIvgvZbgvbRf4L2U4LyL4L2m4L2E4L2m4LyLX+C9puC+pOC9uuC9k+C8i+C9lOC8iycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+C9keC9suC8i+C9ouC9suC9hF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4L2m4L2E4LyL4L2J4L2y4L2TXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdb4L2W4L2R4L204L2T4LyL4L2V4L6y4L2C4LyL4L2i4L6X4L264L2m4LyL4L2YXSwgTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb4L2B4LyL4L2m4L2EXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb4L2W4L2R4L204L2T4LyL4L2V4L6y4L2C4LyL4L2Y4L2Q4L2g4LyL4L2YXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg4L2j4LyLJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg4L2m4L6U4L2T4LyL4L2jJyxcbiAgICAgICAgICAgIHMgOiAn4L2j4L2Y4LyL4L2m4L2EJyxcbiAgICAgICAgICAgIG0gOiAn4L2m4L6Q4L2i4LyL4L2Y4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIG1tIDogJyVkIOC9puC+kOC9ouC8i+C9mCcsXG4gICAgICAgICAgICBoIDogJ+C9huC9tOC8i+C9muC9vOC9keC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBoaCA6ICclZCDgvYbgvbTgvIvgvZrgvbzgvZEnLFxuICAgICAgICAgICAgZCA6ICfgvYngvbLgvZPgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgZGQgOiAnJWQg4L2J4L2y4L2T4LyLJyxcbiAgICAgICAgICAgIE0gOiAn4L2f4L6z4LyL4L2W4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIE1NIDogJyVkIOC9n+C+s+C8i+C9licsXG4gICAgICAgICAgICB5IDogJ+C9o+C9vOC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICB5eSA6ICclZCDgvaPgvbwnXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgvKHgvKLgvKPgvKTgvKXgvKbgvKfgvKjgvKngvKBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gvZjgvZrgvZPgvIvgvZjgvbx84L2e4L284L2C4L2m4LyL4L2A4L2mfOC9ieC9suC9k+C8i+C9guC9tOC9hHzgvZHgvYLgvbzgvYTgvIvgvZHgvYJ84L2Y4L2a4L2T4LyL4L2Y4L28LyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o4L2J4L2y4L2T4LyL4L2C4L204L2EfOC9keC9guC9vOC9hOC8i+C9keC9gnzgvZjgvZrgvZPgvIvgvZjgvbwpJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZjgvZrgvZPgvIvgvZjgvbwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9nuC9vOC9guC9puC8i+C9gOC9pic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2J4L2y4L2T4LyL4L2C4L204L2EJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZHgvYLgvbzgvYTgvIvgvZHgvYInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9mOC9muC9k+C8i+C9mOC9vCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBicmV0b24gKGJyKVxuLy8gYXV0aG9yIDogSmVhbi1CYXB0aXN0ZSBMZSBEdWlnb3UgOiBodHRwczovL2dpdGh1Yi5jb20vamJsZWR1aWdvdVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24obnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICdtbSc6ICdtdW51dGVubicsXG4gICAgICAgICAgICAnTU0nOiAnbWl6JyxcbiAgICAgICAgICAgICdkZCc6ICdkZXZlemgnXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBtdXRhdGlvbihmb3JtYXRba2V5XSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcGVjaWFsTXV0YXRpb25Gb3JZZWFycyhudW1iZXIpIHtcbiAgICAgICAgc3dpdGNoIChsYXN0TnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyBibG9heic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyB2bG9heic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsYXN0TnVtYmVyKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyID4gOSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROdW1iZXIobnVtYmVyICUgMTApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbXV0YXRpb24odGV4dCwgbnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBzb2Z0TXV0YXRpb24odGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc29mdE11dGF0aW9uKHRleHQpIHtcbiAgICAgICAgdmFyIG11dGF0aW9uVGFibGUgPSB7XG4gICAgICAgICAgICAnbSc6ICd2JyxcbiAgICAgICAgICAgICdiJzogJ3YnLFxuICAgICAgICAgICAgJ2QnOiAneidcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG11dGF0aW9uVGFibGVbdGV4dC5jaGFyQXQoMCldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdXRhdGlvblRhYmxlW3RleHQuY2hhckF0KDApXSArIHRleHQuc3Vic3RyaW5nKDEpO1xuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdicicsIHtcbiAgICAgICAgbW9udGhzIDogJ0dlbnZlcl9DXFwnaHdldnJlcl9NZXVyemhfRWJyZWxfTWFlX01lemhldmVuX0dvdWVyZV9Fb3N0X0d3ZW5nb2xvX0hlcmVfRHVfS2VyenUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0dlbl9DXFwnaHdlX01ldV9FYnJfTWFlX0V2ZV9Hb3VfRW9zX0d3ZV9IZXJfRHVfS2VyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdWxfTHVuX01ldXJ6aF9NZXJjXFwnaGVyX1lhb3VfR3dlbmVyX1NhZG9ybicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdWxfTHVuX01ldV9NZXJfWWFvX0d3ZV9TYWQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X0x1X01lX01lcl9ZYV9Hd19TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdoW2VdbW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaFtlXW1tOnNzIEEnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgW2Egdml6XSBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgW2Egdml6XSBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIFthIHZpel0gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0hpeml2IGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tXYXJjXFwnaG9hemggZGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2RhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tEZWNcXCdoIGRhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFtwYXNldCBkYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2EtYmVubiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIFxcJ3pvJyxcbiAgICAgICAgICAgIHMgOiAndW4gbmViZXVkIHNlZ29uZGVubm/DuScsXG4gICAgICAgICAgICBtIDogJ3VyIHZ1bnV0ZW5uJyxcbiAgICAgICAgICAgIG1tIDogcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uLFxuICAgICAgICAgICAgaCA6ICd1biBldXInLFxuICAgICAgICAgICAgaGggOiAnJWQgZXVyJyxcbiAgICAgICAgICAgIGQgOiAndW4gZGV2ZXpoJyxcbiAgICAgICAgICAgIGRkIDogcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uLFxuICAgICAgICAgICAgTSA6ICd1ciBtaXonLFxuICAgICAgICAgICAgTU0gOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICB5IDogJ3VyIGJsb2F6JyxcbiAgICAgICAgICAgIHl5IDogc3BlY2lhbE11dGF0aW9uRm9yWWVhcnNcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oYcOxfHZldCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IChudW1iZXIgPT09IDEpID8gJ2HDsScgOiAndmV0JztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBib3NuaWFuIChicylcbi8vIGF1dGhvciA6IE5lZGltIENob2xpY2ggOiBodHRwczovL2dpdGh1Yi5jb20vZnJvbnR5YXJkXG4vLyBiYXNlZCBvbiAoaHIpIHRyYW5zbGF0aW9uIGJ5IEJvamFuIE1hcmtvdmnEh1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRuYSBtaW51dGEnIDogJ2plZG5lIG1pbnV0ZSc7XG4gICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZGFuIHNhdCcgOiAnamVkbm9nIHNhdGEnO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0YSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0aSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2RhbmEnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2EnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2knO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnYnMnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hai5fanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuIE1NLiBZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgIDogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5ICA6ICdbc3V0cmEgdV0gTFQnLFxuXG4gICAgICAgICAgICBuZXh0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSAgOiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsaV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdCAgIDogJ3ByaWplICVzJyxcbiAgICAgICAgICAgIHMgICAgICA6ICdwYXIgc2VrdW5kaScsXG4gICAgICAgICAgICBtICAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbSAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoICAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkICAgICAgOiAnZGFuJyxcbiAgICAgICAgICAgIGRkICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gICAgICA6ICdtamVzZWMnLFxuICAgICAgICAgICAgTU0gICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSAgICAgIDogJ2dvZGludScsXG4gICAgICAgICAgICB5eSAgICAgOiB0cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBjYXRhbGFuIChjYSlcbi8vIGF1dGhvciA6IEp1YW4gRy4gSHVydGFkbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFuZ2h1cnRhZG9cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2NhJywge1xuICAgICAgICBtb250aHMgOiAnZ2VuZXJfZmVicmVyX21hcsOnX2FicmlsX21haWdfanVueV9qdWxpb2xfYWdvc3Rfc2V0ZW1icmVfb2N0dWJyZV9ub3ZlbWJyZV9kZXNlbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnZ2VuLl9mZWJyLl9tYXIuX2Fici5fbWFpLl9qdW4uX2p1bC5fYWcuX3NldC5fb2N0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ2RpdW1lbmdlX2RpbGx1bnNfZGltYXJ0c19kaW1lY3Jlc19kaWpvdXNfZGl2ZW5kcmVzX2Rpc3NhYnRlJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2RnLl9kbC5fZHQuX2RjLl9kai5fZHYuX2RzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnRGdfRGxfRHRfRGNfRGpfRHZfRHMnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1thdnVpIGEgJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tkZW3DoCBhICcgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSAnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2FoaXIgYSAnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tlbF0gZGRkZCBbcGFzc2F0IGEgJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnZmEgJXMnLFxuICAgICAgICAgICAgcyA6ICd1bnMgc2Vnb25zJyxcbiAgICAgICAgICAgIG0gOiAndW4gbWludXQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRzJyxcbiAgICAgICAgICAgIGggOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGggOiAnJWQgaG9yZXMnLFxuICAgICAgICAgICAgZCA6ICd1biBkaWEnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGllcycsXG4gICAgICAgICAgICBNIDogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTSA6ICclZCBtZXNvcycsXG4gICAgICAgICAgICB5IDogJ3VuIGFueScsXG4gICAgICAgICAgICB5eSA6ICclZCBhbnlzJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShyfG58dHzDqHxhKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAobnVtYmVyID09PSAxKSA/ICdyJyA6XG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMikgPyAnbicgOlxuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDMpID8gJ3InIDpcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSA0KSA/ICd0JyA6ICfDqCc7XG4gICAgICAgICAgICBpZiAocGVyaW9kID09PSAndycgfHwgcGVyaW9kID09PSAnVycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogY3plY2ggKGNzKVxuLy8gYXV0aG9yIDogcGV0cmJlbGEgOiBodHRwczovL2dpdGh1Yi5jb20vcGV0cmJlbGFcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgdmFyIG1vbnRocyA9ICdsZWRlbl/Dum5vcl9ixZllemVuX2R1YmVuX2t2xJt0ZW5fxI1lcnZlbl/EjWVydmVuZWNfc3JwZW5fesOhxZnDrV/FmcOtamVuX2xpc3RvcGFkX3Byb3NpbmVjJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdsZWRfw7pub19ixZllX2R1Yl9rdsSbX8SNdm5fxI12Y19zcnBfesOhxZlfxZnDrWpfbGlzX3Bybycuc3BsaXQoJ18nKTtcblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiAobiA+IDEpICYmIChuIDwgNSkgJiYgKH5+KG4gLyAxMCkgIT09IDEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAncyc6ICAvLyBhIGZldyBzZWNvbmRzIC8gaW4gYSBmZXcgc2Vjb25kcyAvIGEgZmV3IHNlY29uZHMgYWdvXG4gICAgICAgICAgICByZXR1cm4gKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpID8gJ3DDoXIgc2VrdW5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgIGNhc2UgJ20nOiAgLy8gYSBtaW51dGUgLyBpbiBhIG1pbnV0ZSAvIGEgbWludXRlIGFnb1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbWludXRhJyA6IChpc0Z1dHVyZSA/ICdtaW51dHUnIDogJ21pbnV0b3UnKTtcbiAgICAgICAgY2FzZSAnbW0nOiAvLyA5IG1pbnV0ZXMgLyBpbiA5IG1pbnV0ZXMgLyA5IG1pbnV0ZXMgYWdvXG4gICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWludXR5JyA6ICdtaW51dCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ21pbnV0YW1pJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdoJzogIC8vIGFuIGhvdXIgLyBpbiBhbiBob3VyIC8gYW4gaG91ciBhZ29cbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2hvZGluYScgOiAoaXNGdXR1cmUgPyAnaG9kaW51JyA6ICdob2Rpbm91Jyk7XG4gICAgICAgIGNhc2UgJ2hoJzogLy8gOSBob3VycyAvIGluIDkgaG91cnMgLyA5IGhvdXJzIGFnb1xuICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2hvZGlueScgOiAnaG9kaW4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdob2RpbmFtaSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZCc6ICAvLyBhIGRheSAvIGluIGEgZGF5IC8gYSBkYXkgYWdvXG4gICAgICAgICAgICByZXR1cm4gKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpID8gJ2RlbicgOiAnZG5lbSc7XG4gICAgICAgIGNhc2UgJ2RkJzogLy8gOSBkYXlzIC8gaW4gOSBkYXlzIC8gOSBkYXlzIGFnb1xuICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2RueScgOiAnZG7DrScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RueSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTSc6ICAvLyBhIG1vbnRoIC8gaW4gYSBtb250aCAvIGEgbW9udGggYWdvXG4gICAgICAgICAgICByZXR1cm4gKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpID8gJ23Em3PDrWMnIDogJ23Em3PDrWNlbSc7XG4gICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ23Em3PDrWNlJyA6ICdtxJtzw61jxa8nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtxJtzw61jaSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneSc6ICAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICByZXR1cm4gKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpID8gJ3JvaycgOiAncm9rZW0nO1xuICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdyb2t5JyA6ICdsZXQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdsZXR5JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2NzJywge1xuICAgICAgICBtb250aHMgOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0IDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1BhcnNlIDogKGZ1bmN0aW9uIChtb250aHMsIG1vbnRoc1Nob3J0KSB7XG4gICAgICAgICAgICB2YXIgaSwgX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIHVzZSBjdXN0b20gcGFyc2VyIHRvIHNvbHZlIHByb2JsZW0gd2l0aCBKdWx5ICjEjWVydmVuZWMpXG4gICAgICAgICAgICAgICAgX21vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyBtb250aHNbaV0gKyAnJHxeJyArIG1vbnRoc1Nob3J0W2ldICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9tb250aHNQYXJzZTtcbiAgICAgICAgfShtb250aHMsIG1vbnRoc1Nob3J0KSksXG4gICAgICAgIHdlZWtkYXlzIDogJ25lZMSbbGVfcG9uZMSbbMOtX8O6dGVyw71fc3TFmWVkYV/EjXR2cnRla19ww6F0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICduZV9wb1/DunRfc3RfxI10X3DDoV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QuIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZG5lcyB2XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3rDrXRyYSB2XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBuZWTEm2xpIHZdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2ZSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZlIMSNdHZydGVrIHZdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgcMOhdGVrIHZdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Ygc29ib3R1IHZdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t2xI1lcmEgdl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3UgbmVkxJtsaSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDqV0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO9XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IHNvYm90dSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAncMWZZWQgJXMnLFxuICAgICAgICAgICAgcyA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2UgOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBjaHV2YXNoIChjdilcbi8vIGF1dGhvciA6IEFuYXRvbHkgTWlyb25vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taXJvbnRvbGlcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2N2Jywge1xuICAgICAgICBtb250aHMgOiAn0LrEg9GA0LvQsNGHX9C90LDRgMSD0YFf0L/Rg9GIX9Cw0LrQsF/QvNCw0Llfw6fEldGA0YLQvNC1X9GD0YLEg1/Dp9GD0YDQu9CwX9Cw0LLEg9C9X9GO0L/QsF/Rh9Oz0Lpf0YDQsNGI0YLQsNCyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfQusSD0YBf0L3QsNGAX9C/0YPRiF/QsNC60LBf0LzQsNC5X8OnxJXRgF/Rg9GCxINfw6fRg9GAX9Cw0LJf0Y7Qv9CwX9GH07PQul/RgNCw0YgnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9Cy0YvRgNGB0LDRgNC90LjQutGD0L1f0YLRg9C90YLQuNC60YPQvV/Ri9GC0LvQsNGA0LjQutGD0L1f0Y7QvdC60YPQvV/QusSVw6fQvdC10YDQvdC40LrRg9C9X9GN0YDQvdC10LrRg9C9X9GIxIPQvNCw0YLQutGD0L0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0LLRi9GAX9GC0YPQvV/Ri9GC0Ltf0Y7QvV/QusSVw6df0Y3RgNC9X9GIxIPQvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0LLRgF/RgtC9X9GL0YJf0Y7QvV/QusOnX9GN0YBf0YjQvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVkgW8On0YPQu9GF0LhdIE1NTU0gW9GD0LnEg9GFxJXQvV0gRFst0LzEldGIxJVdJyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZIFvDp9GD0LvRhdC4XSBNTU1NIFvRg9C5xIPRhcSV0L1dIERbLdC8xJXRiMSVXSwgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBZWVlZIFvDp9GD0LvRhdC4XSBNTU1NIFvRg9C5xIPRhcSV0L1dIERbLdC8xJXRiMSVXSwgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQn9Cw0Y/QvV0gTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cr0YDQsNC9XSBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbxJTQvdC10YBdIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbw4fQuNGC0LXRgV0gZGRkZCBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9CY0YDRgtC9xJVdIGRkZGQgTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6IGZ1bmN0aW9uIChvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWZmaXggPSAv0YHQtdGF0LXRgiQvaS5leGVjKG91dHB1dCkgPyAn0YDQtdC9JyA6IC/Dp9GD0LskL2kuZXhlYyhvdXRwdXQpID8gJ9GC0LDQvScgOiAn0YDQsNC9JztcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0ICsgYWZmaXg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdCA6ICclcyDQutCw0Y/Qu9C70LAnLFxuICAgICAgICAgICAgcyA6ICfQv8SV0YAt0LjQuiDDp9C10LrQutGD0L3RgicsXG4gICAgICAgICAgICBtIDogJ9C/xJXRgCDQvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIG1tIDogJyVkINC80LjQvdGD0YInLFxuICAgICAgICAgICAgaCA6ICfQv8SV0YAg0YHQtdGF0LXRgicsXG4gICAgICAgICAgICBoaCA6ICclZCDRgdC10YXQtdGCJyxcbiAgICAgICAgICAgIGQgOiAn0L/EldGAINC60YPQvScsXG4gICAgICAgICAgICBkZCA6ICclZCDQutGD0L0nLFxuICAgICAgICAgICAgTSA6ICfQv8SV0YAg0YPQucSD0YUnLFxuICAgICAgICAgICAgTU0gOiAnJWQg0YPQucSD0YUnLFxuICAgICAgICAgICAgeSA6ICfQv8SV0YAgw6fRg9C7JyxcbiAgICAgICAgICAgIHl5IDogJyVkIMOn0YPQuydcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0t0LzEldGILyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC3QvMSV0YgnLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogV2Vsc2ggKGN5KVxuLy8gYXV0aG9yIDogUm9iZXJ0IEFsbGVuXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdjeScsIHtcbiAgICAgICAgbW9udGhzOiAnSW9uYXdyX0Nod2Vmcm9yX01hd3J0aF9FYnJpbGxfTWFpX01laGVmaW5fR29yZmZlbm5hZl9Bd3N0X01lZGlfSHlkcmVmX1RhY2h3ZWRkX1JoYWdmeXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSW9uX0Nod2VfTWF3X0Vicl9NYWlfTWVoX0dvcl9Bd3NfTWVkX0h5ZF9UYWNoX1JoYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnRHlkZCBTdWxfRHlkZCBMbHVuX0R5ZGQgTWF3cnRoX0R5ZGQgTWVyY2hlcl9EeWRkIElhdV9EeWRkIEd3ZW5lcl9EeWRkIFNhZHdybicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bF9MbHVuX01hd19NZXJfSWF1X0d3ZV9TYWQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTGxfTWFfTWVfSWFfR3dfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIC8vIHRpbWUgZm9ybWF0cyBhcmUgdGhlIHNhbWUgYXMgZW4tZ2JcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIZWRkaXcgYW1dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbWWZvcnkgYW1dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYW1dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRGRvZSBhbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkaXdldGhhZiBhbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ21ld24gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHluIMO0bCcsXG4gICAgICAgICAgICBzOiAneWNoeWRpZyBlaWxpYWRhdScsXG4gICAgICAgICAgICBtOiAnbXVudWQnLFxuICAgICAgICAgICAgbW06ICclZCBtdW51ZCcsXG4gICAgICAgICAgICBoOiAnYXdyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgYXdyJyxcbiAgICAgICAgICAgIGQ6ICdkaXdybm9kJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGl3cm5vZCcsXG4gICAgICAgICAgICBNOiAnbWlzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWlzJyxcbiAgICAgICAgICAgIHk6ICdibHd5ZGR5bicsXG4gICAgICAgICAgICB5eTogJyVkIGZseW5lZGQnXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGZlZHxhaW58YWZ8aWx8eWRkfGVkfGVnKS8sXG4gICAgICAgIC8vIHRyYWRpdGlvbmFsIG9yZGluYWwgbnVtYmVycyBhYm92ZSAzMSBhcmUgbm90IGNvbW1vbmx5IHVzZWQgaW4gY29sbG9xdWlhbCBXZWxzaFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlcixcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJyxcbiAgICAgICAgICAgICAgICBsb29rdXAgPSBbXG4gICAgICAgICAgICAgICAgICAgICcnLCAnYWYnLCAnaWwnLCAneWRkJywgJ3lkZCcsICdlZCcsICdlZCcsICdlZCcsICdmZWQnLCAnZmVkJywgJ2ZlZCcsIC8vIDFhZiB0byAxMGZlZFxuICAgICAgICAgICAgICAgICAgICAnZWcnLCAnZmVkJywgJ2VnJywgJ2VnJywgJ2ZlZCcsICdlZycsICdlZycsICdmZWQnLCAnZWcnLCAnZmVkJyAvLyAxMWVnIHRvIDIwZmVkXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKGIgPiAyMCkge1xuICAgICAgICAgICAgICAgIGlmIChiID09PSA0MCB8fCBiID09PSA1MCB8fCBiID09PSA2MCB8fCBiID09PSA4MCB8fCBiID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2ZlZCc7IC8vIG5vdCAzMGFpbiwgNzBhaW4gb3IgOTBhaW5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYWluJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGIgPiAwKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbG9va3VwW2JdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogZGFuaXNoIChkYSlcbi8vIGF1dGhvciA6IFVscmlrIE5pZWxzZW4gOiBodHRwczovL2dpdGh1Yi5jb20vbXJiYXNlXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdkYScsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcl9mZWJydWFyX21hcnRzX2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW5fZmViX21hcl9hcHJfbWFqX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc8O4bmRhZ19tYW5kYWdfdGlyc2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbMO4cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdzw7huX21hbl90aXJfb25zX3Rvcl9mcmVfbMO4cicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnc8O4X21hX3RpX29uX3RvX2ZyX2zDuCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBbZC5dIEQuIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tJIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW0kgbW9yZ2VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tJIGfDpXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbc2lkc3RlXSBkZGRkIFtrbF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgc2lkZW4nLFxuICAgICAgICAgICAgcyA6ICdmw6Ugc2VrdW5kZXInLFxuICAgICAgICAgICAgbSA6ICdldCBtaW51dCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dHRlcicsXG4gICAgICAgICAgICBoIDogJ2VuIHRpbWUnLFxuICAgICAgICAgICAgaGggOiAnJWQgdGltZXInLFxuICAgICAgICAgICAgZCA6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGFnZScsXG4gICAgICAgICAgICBNIDogJ2VuIG3DpW5lZCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtw6VuZWRlcicsXG4gICAgICAgICAgICB5IDogJ2V0IMOlcicsXG4gICAgICAgICAgICB5eSA6ICclZCDDpXInXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogYXVzdHJpYW4gZ2VybWFuIChkZS1hdClcbi8vIGF1dGhvciA6IGxsdWNocyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sbHVjaHNcbi8vIGF1dGhvcjogTWVuZWxpb24gRWxlbnPDumxlOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuLy8gYXV0aG9yIDogTWFydGluIEdyb2xsZXIgOiBodHRwczovL2dpdGh1Yi5jb20vTWFkTUdcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICdtJzogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgICdoJzogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgICdkJzogWydlaW4gVGFnJywgJ2VpbmVtIFRhZyddLFxuICAgICAgICAgICAgJ2RkJzogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgICdNJzogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgICdNTSc6IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgJ3knOiBbJ2VpbiBKYWhyJywgJ2VpbmVtIEphaHInXSxcbiAgICAgICAgICAgICd5eSc6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RlLWF0Jywge1xuICAgICAgICBtb250aHMgOiAnSsOkbm5lcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKw6RuLl9GZWJyLl9NcnouX0Fwci5fTWFpX0p1bi5fSnVsLl9BdWcuX1NlcHQuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW01vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tHZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzIDogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW0gOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoIDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogZ2VybWFuIChkZSlcbi8vIGF1dGhvciA6IGxsdWNocyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sbHVjaHNcbi8vIGF1dGhvcjogTWVuZWxpb24gRWxlbnPDumxlOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgJ20nOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgJ2gnOiBbJ2VpbmUgU3R1bmRlJywgJ2VpbmVyIFN0dW5kZSddLFxuICAgICAgICAgICAgJ2QnOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICAnZGQnOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgJ00nOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgJ01NJzogW251bWJlciArICcgTW9uYXRlJywgbnVtYmVyICsgJyBNb25hdGVuJ10sXG4gICAgICAgICAgICAneSc6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgJ3l5JzogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUnLCB7XG4gICAgICAgIG1vbnRocyA6ICdKYW51YXJfRmVicnVhcl9Nw6Ryel9BcHJpbF9NYWlfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuLl9GZWJyLl9NcnouX0Fwci5fTWFpX0p1bi5fSnVsLl9BdWcuX1NlcHQuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW01vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tHZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzIDogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW0gOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoIDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogbW9kZXJuIGdyZWVrIChlbClcbi8vIGF1dGhvciA6IEFnZ2Vsb3MgS2FyYWxpYXMgOiBodHRwczovL2dpdGh1Yi5jb20vbWVoaWVsXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbCcsIHtcbiAgICAgICAgbW9udGhzTm9taW5hdGl2ZUVsIDogJ86ZzrHOvc6/z4XOrM+BzrnOv8+CX86mzrXOss+Bzr/Phc6sz4HOuc6/z4JfzpzOrM+Bz4TOuc6/z4JfzpHPgM+Bzq/Ou865zr/Pgl/OnM6szrnOv8+CX86Zzr/Pjc69zrnOv8+CX86Zzr/Pjc67zrnOv8+CX86Rz43Os86/z4XPg8+Ezr/Pgl/Oo861z4DPhM6tzrzOss+BzrnOv8+CX86fzrrPhM+OzrLPgc65zr/Pgl/Onc6/zq3OvM6yz4HOuc6/z4JfzpTOtc66zq3OvM6yz4HOuc6/z4InLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc0dlbml0aXZlRWwgOiAnzpnOsc69zr/Phc6xz4HOr86/z4VfzqbOtc6yz4HOv8+FzrHPgc6vzr/PhV/OnM6xz4HPhM6vzr/PhV/Okc+Az4HOuc67zq/Ov8+FX86czrHOkM6/z4VfzpnOv8+Fzr3Or86/z4VfzpnOv8+FzrvOr86/z4VfzpHPhc6zzr/Pjc+Dz4TOv8+FX86jzrXPgM+EzrXOvM6yz4HOr86/z4Vfzp/Ous+Ez4nOss+Bzq/Ov8+FX86dzr/Otc68zrLPgc6vzr/PhV/OlM61zrrOtc68zrLPgc6vzr/PhScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzIDogZnVuY3Rpb24gKG1vbWVudFRvRm9ybWF0LCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICgvRC8udGVzdChmb3JtYXQuc3Vic3RyaW5nKDAsIGZvcm1hdC5pbmRleE9mKCdNTU1NJykpKSkgeyAvLyBpZiB0aGVyZSBpcyBhIGRheSBudW1iZXIgYmVmb3JlICdNTU1NJ1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNHZW5pdGl2ZUVsW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzTm9taW5hdGl2ZUVsW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA6ICfOmc6xzr1fzqbOtc6yX86czrHPgV/Okc+Az4FfzpzOsc+KX86Zzr/Phc69X86Zzr/Phc67X86Rz4XOs1/Oo861z4Bfzp/Ous+EX86dzr/OtV/OlM61zronLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ86az4XPgc65zrHOus6uX86UzrXPhc+Ezq3Pgc6xX86kz4HOr8+EzrdfzqTOtc+EzqzPgc+EzrdfzqDOrc68z4DPhM63X86gzrHPgc6xz4POus61z4XOrl/Oo86szrLOss6xz4TOvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfOms+Fz4FfzpTOtc+FX86kz4HOuV/OpM61z4RfzqDOtc68X86gzrHPgV/Oo86xzrInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ86az4VfzpTOtV/OpM+BX86kzrVfzqDOtV/OoM6xX86jzrEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ868zrwnIDogJ86czpwnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfPgM68JyA6ICfOoM6cJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKVswXSA9PT0gJ868Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2UgOiAvW86gzpxdXFwuP86cP1xcLj8vaSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTIDogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyRWwgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vOo86uzrzOtc+BzrEge31dIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW86Rz43Pgc65zr8ge31dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW3t9XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vOp864zrXPgiB7fV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW8+Ezr8gz4DPgc6/zrfOs86/z43OvM61zr3Ov10gZGRkZCBbe31dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW8+EzrfOvSDPgM+Bzr/Ot86zzr/Pjc68zrXOvc63XSBkZGRkIFt7fV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IGZ1bmN0aW9uIChrZXksIG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyRWxba2V5XSxcbiAgICAgICAgICAgICAgICBob3VycyA9IG1vbSAmJiBtb20uaG91cnMoKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuYXBwbHkobW9tKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKCd7fScsIChob3VycyAlIDEyID09PSAxID8gJ8+Dz4TOtycgOiAnz4PPhM65z4InKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfPg861ICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgz4DPgc65zr0nLFxuICAgICAgICAgICAgcyA6ICfOu86vzrPOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEnLFxuICAgICAgICAgICAgbSA6ICfOrc69zrEgzrvOtc+Az4TPjCcsXG4gICAgICAgICAgICBtbSA6ICclZCDOu861z4DPhM6sJyxcbiAgICAgICAgICAgIGggOiAnzrzOr86xIM+Oz4HOsScsXG4gICAgICAgICAgICBoaCA6ICclZCDPjs+BzrXPgicsXG4gICAgICAgICAgICBkIDogJ868zq/OsSDOvM6tz4HOsScsXG4gICAgICAgICAgICBkZCA6ICclZCDOvM6tz4HOtc+CJyxcbiAgICAgICAgICAgIE0gOiAnzq3Ovc6xz4IgzrzOrs69zrHPgicsXG4gICAgICAgICAgICBNTSA6ICclZCDOvM6uzr3Otc+CJyxcbiAgICAgICAgICAgIHkgOiAnzq3Ovc6xz4Igz4fPgc+Mzr3Ov8+CJyxcbiAgICAgICAgICAgIHl5IDogJyVkIM+Hz4HPjM69zrnOsSdcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Oty8sXG4gICAgICAgIG9yZGluYWw6ICclZM63JyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGF1c3RyYWxpYW4gZW5nbGlzaCAoZW4tYXUpXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1hdScsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHMgOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBtIDogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaCA6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQgOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNIDogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHkgOiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGNhbmFkaWFuIGVuZ2xpc2ggKGVuLWNhKVxuLy8gYXV0aG9yIDogSm9uYXRoYW4gQWJvdXJiaWggOiBodHRwczovL2dpdGh1Yi5jb20vam9uYmNhXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1jYScsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0sIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSwgWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSwgWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHMgOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBtIDogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaCA6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQgOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNIDogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHkgOiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBncmVhdCBicml0YWluIGVuZ2xpc2ggKGVuLWdiKVxuLy8gYXV0aG9yIDogQ2hyaXMgR2VkcmltIDogaHR0cHM6Ly9naXRodWIuY29tL2NocmlzZ2VkcmltXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1nYicsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGFnbycsXG4gICAgICAgICAgICBzIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgbSA6ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaCA6ICclZCBob3VycycsXG4gICAgICAgICAgICBkIDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTSA6ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5IDogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eSA6ICclZCB5ZWFycydcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKH5+KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBlc3BlcmFudG8gKGVvKVxuLy8gYXV0aG9yIDogQ29saW4gRGVhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jb2xpbmRlYW5cbi8vIGtvbWVudG86IE1pIGVzdGFzIG1hbGNlcnRhIHNlIG1pIGtvcmVrdGUgdHJha3RpcyBha3V6YXRpdm9qbiBlbiB0aXUgdHJhZHVrby5cbi8vICAgICAgICAgIFNlIG5lLCBib252b2x1IGtvcmVrdGkga2FqIGF2aXppIG1pbiBwb3Iga2UgbWkgcG92YXMgbGVybmkhXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbycsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcm9fZmVicnVhcm9fbWFydG9fYXByaWxvX21ham9fanVuaW9fanVsaW9fYcWtZ3VzdG9fc2VwdGVtYnJvX29rdG9icm9fbm92ZW1icm9fZGVjZW1icm8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hxa1nX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnRGltYW7EiW9fTHVuZG9fTWFyZG9fTWVya3JlZG9fxLRhxa1kb19WZW5kcmVkb19TYWJhdG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnRGltX0x1bl9NYXJkX01lcmtfxLRhxa1fVmVuX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnRGlfTHVfTWFfTWVfxLRhX1ZlX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEwgOiAnRFstYW4gZGVdIE1NTU0sIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0RbLWFuIGRlXSBNTU1NLCBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL1thcF1cXC50XFwubS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSA9PT0gJ3AnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwLnQubS4nIDogJ1AuVC5NLic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2EudC5tLicgOiAnQS5ULk0uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tIb2RpYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tNb3JnYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbSGllcmHFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW3Bhc2ludGFdIGRkZGQgW2plXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnamUgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICdhbnRhxa0gJXMnLFxuICAgICAgICAgICAgcyA6ICdzZWt1bmRvaicsXG4gICAgICAgICAgICBtIDogJ21pbnV0bycsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dG9qJyxcbiAgICAgICAgICAgIGggOiAnaG9ybycsXG4gICAgICAgICAgICBoaCA6ICclZCBob3JvaicsXG4gICAgICAgICAgICBkIDogJ3RhZ28nLC8vbmUgJ2RpdXJubycsIMSJYXIgZXN0YXMgdXppdGEgcG9yIHByb2tzaW11bW9cbiAgICAgICAgICAgIGRkIDogJyVkIHRhZ29qJyxcbiAgICAgICAgICAgIE0gOiAnbW9uYXRvJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vbmF0b2onLFxuICAgICAgICAgICAgeSA6ICdqYXJvJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGphcm9qJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfWEvLFxuICAgICAgICBvcmRpbmFsIDogJyVkYScsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBzcGFuaXNoIChlcylcbi8vIGF1dGhvciA6IEp1bGlvIE5hcHVyw60gOiBodHRwczovL2dpdGh1Yi5jb20vanVsaW9uY1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPSAnZW5lLl9mZWIuX21hci5fYWJyLl9tYXkuX2p1bi5fanVsLl9hZ28uX3NlcC5fb2N0Ll9ub3YuX2RpYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpO1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzJywge1xuICAgICAgICBtb250aHMgOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90W20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzIDogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ0RvX0x1X01hX01pX0p1X1ZpX1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzIDogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgbSA6ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoIDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQgOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZCA6ICclZCBkw61hcycsXG4gICAgICAgICAgICBNIDogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTSA6ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5IDogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXkgOiAnJWQgYcOxb3MnXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbCA6ICclZMK6JyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGVzdG9uaWFuIChldClcbi8vIGF1dGhvciA6IEhlbnJ5IEtlaGxtYW5uIDogaHR0cHM6Ly9naXRodWIuY29tL21hZGhlbnJ5XG4vLyBpbXByb3ZlbWVudHMgOiBJbGxpbWFyIFRhbWJlayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWd1bGthXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAncycgOiBbJ23DtW5lIHNla3VuZGknLCAnbcO1bmkgc2VrdW5kJywgJ3BhYXIgc2VrdW5kaXQnXSxcbiAgICAgICAgICAgICdtJyA6IFsnw7xoZSBtaW51dGknLCAnw7xrcyBtaW51dCddLFxuICAgICAgICAgICAgJ21tJzogW251bWJlciArICcgbWludXRpJywgbnVtYmVyICsgJyBtaW51dGl0J10sXG4gICAgICAgICAgICAnaCcgOiBbJ8O8aGUgdHVubmknLCAndHVuZCBhZWdhJywgJ8O8a3MgdHVuZCddLFxuICAgICAgICAgICAgJ2hoJzogW251bWJlciArICcgdHVubmknLCBudW1iZXIgKyAnIHR1bmRpJ10sXG4gICAgICAgICAgICAnZCcgOiBbJ8O8aGUgcMOkZXZhJywgJ8O8a3MgcMOkZXYnXSxcbiAgICAgICAgICAgICdNJyA6IFsna3V1IGFqYScsICdrdXUgYWVnYScsICfDvGtzIGt1dSddLFxuICAgICAgICAgICAgJ01NJzogW251bWJlciArICcga3V1JywgbnVtYmVyICsgJyBrdXVkJ10sXG4gICAgICAgICAgICAneScgOiBbJ8O8aGUgYWFzdGEnLCAnYWFzdGEnLCAnw7xrcyBhYXN0YSddLFxuICAgICAgICAgICAgJ3l5JzogW251bWJlciArICcgYWFzdGEnLCBudW1iZXIgKyAnIGFhc3RhdCddXG4gICAgICAgIH07XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0W2tleV1bMl0gPyBmb3JtYXRba2V5XVsyXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZSA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2V0Jywge1xuICAgICAgICBtb250aHMgICAgICAgIDogJ2phYW51YXJfdmVlYnJ1YXJfbcOkcnRzX2FwcmlsbF9tYWlfanV1bmlfanV1bGlfYXVndXN0X3NlcHRlbWJlcl9va3Rvb2Jlcl9ub3ZlbWJlcl9kZXRzZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0ICAgOiAnamFhbl92ZWVicl9tw6RydHNfYXByX21haV9qdXVuaV9qdXVsaV9hdWdfc2VwdF9va3Rfbm92X2RldHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzICAgICAgOiAncMO8aGFww6Rldl9lc21hc3DDpGV2X3RlaXNpcMOkZXZfa29sbWFww6Rldl9uZWxqYXDDpGV2X3JlZWRlX2xhdXDDpGV2Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1BfRV9UX0tfTl9SX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluICAgOiAnUF9FX1RfS19OX1JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCAgIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgICAgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCAgIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgIDogJ0QuIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5ICA6ICdbVMOkbmEsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5ICA6ICdbSG9tbWUsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdbSsOkcmdtaW5lXSBkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgIDogJ1tFaWxlLF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW0VlbG1pbmVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIHDDpHJhc3QnLFxuICAgICAgICAgICAgcGFzdCAgIDogJyVzIHRhZ2FzaScsXG4gICAgICAgICAgICBzICAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbSAgICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoICAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGggICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQgICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZCAgICAgOiAnJWQgcMOkZXZhJyxcbiAgICAgICAgICAgIE0gICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTSAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeSAgICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5ICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWVcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBldXNrYXJhIChldSlcbi8vIGF1dGhvciA6IEVuZWtvIElsbGFycmFtZW5kaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9laWxsYXJyYVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnZXUnLCB7XG4gICAgICAgIG1vbnRocyA6ICd1cnRhcnJpbGFfb3RzYWlsYV9tYXJ0eG9hX2FwaXJpbGFfbWFpYXR6YV9la2FpbmFfdXp0YWlsYV9hYnV6dHVhX2lyYWlsYV91cnJpYV9hemFyb2FfYWJlbmR1YScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAndXJ0Ll9vdHMuX21hci5fYXBpLl9tYWkuX2VrYS5fdXp0Ll9hYnUuX2lyYS5fdXJyLl9hemEuX2FiZS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ2lnYW5kZWFfYXN0ZWxlaGVuYV9hc3RlYXJ0ZWFfYXN0ZWF6a2VuYV9vc3RlZ3VuYV9vc3RpcmFsYV9sYXJ1bmJhdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnaWcuX2FsLl9hci5fYXouX29nLl9vbC5fbHIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdpZ19hbF9hcl9hel9vZ19vbF9scicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVlba29dIE1NTU1bcmVuXSBEW2FdJyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZW2tvXSBNTU1NW3Jlbl0gRFthXSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIFlZWVlba29dIE1NTU1bcmVuXSBEW2FdIExUJyxcbiAgICAgICAgICAgIGwgOiAnWVlZWS1NLUQnLFxuICAgICAgICAgICAgbGwgOiAnWVlZWVtrb10gTU1NIERbYV0nLFxuICAgICAgICAgICAgbGxsIDogJ1lZWVlba29dIE1NTSBEW2FdIExUJyxcbiAgICAgICAgICAgIGxsbGwgOiAnZGRkLCBZWVlZW2tvXSBNTU0gRFthXSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tnYXVyXSBMVFtldGFuXScsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tiaWhhcl0gTFRbZXRhbl0nLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBMVFtldGFuXScsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1thdHpvXSBMVFtldGFuXScsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbYXVycmVrb10gZGRkZCBMVFtldGFuXScsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMgYmFycnUnLFxuICAgICAgICAgICAgcGFzdCA6ICdkdWVsYSAlcycsXG4gICAgICAgICAgICBzIDogJ3NlZ3VuZG8gYmF0enVrJyxcbiAgICAgICAgICAgIG0gOiAnbWludXR1IGJhdCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dHUnLFxuICAgICAgICAgICAgaCA6ICdvcmR1IGJhdCcsXG4gICAgICAgICAgICBoaCA6ICclZCBvcmR1JyxcbiAgICAgICAgICAgIGQgOiAnZWd1biBiYXQnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZWd1bicsXG4gICAgICAgICAgICBNIDogJ2hpbGFiZXRlIGJhdCcsXG4gICAgICAgICAgICBNTSA6ICclZCBoaWxhYmV0ZScsXG4gICAgICAgICAgICB5IDogJ3VydGUgYmF0JyxcbiAgICAgICAgICAgIHl5IDogJyVkIHVydGUnXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogUGVyc2lhbiAoZmEpXG4vLyBhdXRob3IgOiBFYnJhaGltIEJ5YWdvd2kgOiBodHRwczovL2dpdGh1Yi5jb20vZWJyYW1pbmlvXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ9uxJyxcbiAgICAgICAgJzInOiAn27InLFxuICAgICAgICAnMyc6ICfbsycsXG4gICAgICAgICc0JzogJ9u0JyxcbiAgICAgICAgJzUnOiAn27UnLFxuICAgICAgICAnNic6ICfbticsXG4gICAgICAgICc3JzogJ9u3JyxcbiAgICAgICAgJzgnOiAn27gnLFxuICAgICAgICAnOSc6ICfbuScsXG4gICAgICAgICcwJzogJ9uwJ1xuICAgIH0sIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ9uxJzogJzEnLFxuICAgICAgICAn27InOiAnMicsXG4gICAgICAgICfbsyc6ICczJyxcbiAgICAgICAgJ9u0JzogJzQnLFxuICAgICAgICAn27UnOiAnNScsXG4gICAgICAgICfbtic6ICc2JyxcbiAgICAgICAgJ9u3JzogJzcnLFxuICAgICAgICAn27gnOiAnOCcsXG4gICAgICAgICfbuSc6ICc5JyxcbiAgICAgICAgJ9uwJzogJzAnXG4gICAgfTtcblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdmYScsIHtcbiAgICAgICAgbW9udGhzIDogJ9qY2KfZhtmI24zZh1/ZgdmI2LHbjNmHX9mF2KfYsdizX9ii2YjYsduM2YRf2YXZh1/amNmI2KbZhl/amNmI2KbbjNmHX9in2YjYql/Ys9m+2KrYp9mF2KjYsV/Yp9qp2KrYqNixX9mG2YjYp9mF2KjYsV/Yr9iz2KfZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ9qY2KfZhtmI24zZh1/ZgdmI2LHbjNmHX9mF2KfYsdizX9ii2YjYsduM2YRf2YXZh1/amNmI2KbZhl/amNmI2KbbjNmHX9in2YjYql/Ys9m+2KrYp9mF2KjYsV/Yp9qp2KrYqNixX9mG2YjYp9mF2KjYsV/Yr9iz2KfZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9uM2qlcXHUyMDBj2LTZhtio2Ydf2K/ZiNi02YbYqNmHX9iz2YdcXHUyMDBj2LTZhtio2Ydf2obZh9in2LHYtNmG2KjZh1/ZvtmG2KxcXHUyMDBj2LTZhtio2Ydf2KzZhdi52Ydf2LTZhtio2YcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn24zaqVxcdTIwMGPYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZh1xcdTIwMGPYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrFxcdTIwMGPYtNmG2KjZh1/YrNmF2LnZh1/YtNmG2KjZhycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn24xf2K9f2LNf2oZf2b5f2Kxf2LQnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9mC2KjZhCDYp9iyINi42YfYsXzYqNi52K8g2KfYsiDYuNmH2LEvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAv2KjYudivINin2LIg2LjZh9ixLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZgtio2YQg2KfYsiDYuNmH2LEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9io2LnYryDYp9iyINi42YfYsSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb2KfZhdix2YjYsiDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb2YHYsdiv2Kcg2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW9iz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vYr9uM2LHZiNiyINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFvZvtuM2LRdIFvYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9iv2LEgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDZvtuM2LQnLFxuICAgICAgICAgICAgcyA6ICfahtmG2K/bjNmGINir2KfZhtuM2YcnLFxuICAgICAgICAgICAgbSA6ICfbjNqpINiv2YLbjNmC2YcnLFxuICAgICAgICAgICAgbW0gOiAnJWQg2K/ZgtuM2YLZhycsXG4gICAgICAgICAgICBoIDogJ9uM2qkg2LPYp9i52KonLFxuICAgICAgICAgICAgaGggOiAnJWQg2LPYp9i52KonLFxuICAgICAgICAgICAgZCA6ICfbjNqpINix2YjYsicsXG4gICAgICAgICAgICBkZCA6ICclZCDYsdmI2LInLFxuICAgICAgICAgICAgTSA6ICfbjNqpINmF2KfZhycsXG4gICAgICAgICAgICBNTSA6ICclZCDZhdin2YcnLFxuICAgICAgICAgICAgeSA6ICfbjNqpINiz2KfZhCcsXG4gICAgICAgICAgICB5eSA6ICclZCDYs9in2YQnXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vbsC3buV0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KS5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ92YUvLFxuICAgICAgICBvcmRpbmFsIDogJyVk2YUnLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDEyIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBmaW5uaXNoIChmaSlcbi8vIGF1dGhvciA6IFRhcm1vIEFpZGFudGF1c3RhIDogaHR0cHM6Ly9naXRodWIuY29tL2JsZWFkb2ZcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgdmFyIG51bWJlcnNQYXN0ID0gJ25vbGxhIHlrc2kga2Frc2kga29sbWUgbmVsasOkIHZpaXNpIGt1dXNpIHNlaXRzZW3DpG4ga2FoZGVrc2FuIHloZGVrc8Okbicuc3BsaXQoJyAnKSxcbiAgICAgICAgbnVtYmVyc0Z1dHVyZSA9IFtcbiAgICAgICAgICAgICdub2xsYScsICd5aGRlbicsICdrYWhkZW4nLCAna29sbWVuJywgJ25lbGrDpG4nLCAndmlpZGVuJywgJ2t1dWRlbicsXG4gICAgICAgICAgICBudW1iZXJzUGFzdFs3XSwgbnVtYmVyc1Bhc3RbOF0sIG51bWJlcnNQYXN0WzldXG4gICAgICAgIF07XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAnbXV1dGFtYW4gc2VrdW5uaW4nIDogJ211dXRhbWEgc2VrdW50aSc7XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ21pbnV1dGluJyA6ICdtaW51dXR0aSc7XG4gICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ21pbnV1dGluJyA6ICdtaW51dXR0aWEnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3R1bm5pbicgOiAndHVudGknO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICd0dW5uaW4nIDogJ3R1bnRpYSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAncMOkaXbDpG4nIDogJ3DDpGl2w6QnO1xuICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdww6RpdsOkbicgOiAncMOkaXbDpMOkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdrdXVrYXVkZW4nIDogJ2t1dWthdXNpJztcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAna3V1a2F1ZGVuJyA6ICdrdXVrYXV0dGEnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3Z1b2RlbicgOiAndnVvc2knO1xuICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICd2dW9kZW4nIDogJ3Z1b3R0YSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB2ZXJiYWxOdW1iZXIobnVtYmVyLCBpc0Z1dHVyZSkgKyAnICcgKyByZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmVyYmFsTnVtYmVyKG51bWJlciwgaXNGdXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciA8IDEwID8gKGlzRnV0dXJlID8gbnVtYmVyc0Z1dHVyZVtudW1iZXJdIDogbnVtYmVyc1Bhc3RbbnVtYmVyXSkgOiBudW1iZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZpJywge1xuICAgICAgICBtb250aHMgOiAndGFtbWlrdXVfaGVsbWlrdXVfbWFhbGlza3V1X2h1aHRpa3V1X3RvdWtva3V1X2tlc8Oka3V1X2hlaW7DpGt1dV9lbG9rdXVfc3l5c2t1dV9sb2tha3V1X21hcnJhc2t1dV9qb3VsdWt1dScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAndGFtbWlfaGVsbWlfbWFhbGlzX2h1aHRpX3RvdWtvX2tlc8OkX2hlaW7DpF9lbG9fc3l5c19sb2thX21hcnJhc19qb3VsdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc3VubnVudGFpX21hYW5hbnRhaV90aWlzdGFpX2tlc2tpdmlpa2tvX3RvcnN0YWlfcGVyamFudGFpX2xhdWFudGFpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3N1X21hX3RpX2tlX3RvX3BlX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdzdV9tYV90aV9rZV90b19wZV9sYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISC5tbScsXG4gICAgICAgICAgICBMVFMgOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0RvIE1NTU1bdGFdIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0RvIE1NTU1bdGFdIFlZWVksIFtrbG9dIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRG8gTU1NTVt0YV0gWVlZWSwgW2tsb10gTFQnLFxuICAgICAgICAgICAgbCA6ICdELk0uWVlZWScsXG4gICAgICAgICAgICBsbCA6ICdEbyBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGwgOiAnRG8gTU1NIFlZWVksIFtrbG9dIExUJyxcbiAgICAgICAgICAgIGxsbGwgOiAnZGRkLCBEbyBNTU0gWVlZWSwgW2tsb10gTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbdMOkbsOkw6RuXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1todW9tZW5uYV0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBba2xvXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tlaWxlbl0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW3ZpaW1lXSBkZGRkW25hXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMgcMOkw6RzdMOkJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgc2l0dGVuJyxcbiAgICAgICAgICAgIHMgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5IDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXkgOiB0cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBmYXJvZXNlIChmbylcbi8vIGF1dGhvciA6IFJhZ25hciBKb2hhbm5lc2VuIDogaHR0cHM6Ly9naXRodWIuY29tL3JhZ25hcjEyM1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnZm8nLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcsOtbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnamFuX2ZlYl9tYXJfYXByX21haV9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ3N1bm51ZGFndXJfbcOhbmFkYWd1cl90w71zZGFndXJfbWlrdWRhZ3VyX2jDs3NkYWd1cl9mcsOtZ2dqYWRhZ3VyX2xleWdhcmRhZ3VyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3N1bl9tw6FuX3TDvXNfbWlrX2jDs3NfZnLDrV9sZXknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3N1X23DoV90w71fbWlfaMOzX2ZyX2xlJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBELiBNTU1NLCBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW8ONIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW8ONIG1vcmdpbiBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbw40gZ2rDoXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbc8Otw7BzdHVdIGRkZGQgW2tsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAndW0gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBzw63DsGFuaScsXG4gICAgICAgICAgICBzIDogJ2bDoSBzZWt1bmQnLFxuICAgICAgICAgICAgbSA6ICdlaW4gbWludXR0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0dGlyJyxcbiAgICAgICAgICAgIGggOiAnZWluIHTDrW1pJyxcbiAgICAgICAgICAgIGhoIDogJyVkIHTDrW1hcicsXG4gICAgICAgICAgICBkIDogJ2VpbiBkYWd1cicsXG4gICAgICAgICAgICBkZCA6ICclZCBkYWdhcicsXG4gICAgICAgICAgICBNIDogJ2VpbiBtw6FuYcOwaScsXG4gICAgICAgICAgICBNTSA6ICclZCBtw6FuYcOwaXInLFxuICAgICAgICAgICAgeSA6ICdlaXR0IMOhcicsXG4gICAgICAgICAgICB5eSA6ICclZCDDoXInXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogY2FuYWRpYW4gZnJlbmNoIChmci1jYSlcbi8vIGF1dGhvciA6IEpvbmF0aGFuIEFib3VyYmloIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmJjYVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnZnItY2EnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnRGlfTHVfTWFfTWVfSmVfVmVfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQXVqb3VyZFxcJ2h1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdkYW5zICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHMgOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgbSA6ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaCA6ICd1bmUgaGV1cmUnLFxuICAgICAgICAgICAgaGggOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQgOiAndW4gam91cicsXG4gICAgICAgICAgICBkZCA6ICclZCBqb3VycycsXG4gICAgICAgICAgICBNIDogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5IDogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGFucydcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8KS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnJyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogZnJlbmNoIChmcilcbi8vIGF1dGhvciA6IEpvaG4gRmlzY2hlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qZnJvZmZpY2VcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyJywge1xuICAgICAgICBtb250aHMgOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ0RpX0x1X01hX01lX0plX1ZlX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0F1am91cmRcXCdodWkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRGVtYWluIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hpZXIgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGVybmllciDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzIDogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG0gOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkIDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQgOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTSA6ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeSA6ICd1biBhbicsXG4gICAgICAgICAgICB5eSA6ICclZCBhbnMnXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyfCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJycpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogZnJpc2lhbiAoZnkpXG4vLyBhdXRob3IgOiBSb2JpbiB2YW4gZGVyIFZsaWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3JvYmluMHZhbjBkZXIwdlxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICB2YXIgbW9udGhzU2hvcnRXaXRoRG90cyA9ICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21haV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZXMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID0gJ2phbl9mZWJfbXJ0X2Fwcl9tYWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVzJy5zcGxpdCgnXycpO1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2Z5Jywge1xuICAgICAgICBtb250aHMgOiAnamFubmV3YXJpc19mZWJyZXdhcmlzX21hYXJ0X2FwcmlsX21hYWllX2p1bnlfanVseV9hdWd1c3R1c19zZXB0aW1iZXJfb2t0b2Jlcl9ub3ZpbWJlcl9kZXNpbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5cyA6ICdzbmVpbl9tb2FuZGVpX3RpaXNkZWlfd29hbnNkZWlfdG9uZ2Vyc2RlaV9mcmVlZF9zbmVvbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdzaS5fbW8uX3RpLl93by5fdG8uX2ZyLl9zby4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1NpX01vX1RpX1dvX1RvX0ZyX1NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2hqb2VkIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vYXJuIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1c3RlciBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbw7RmcsO7bmVdIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdvZXIgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBseW4nLFxuICAgICAgICAgICAgcyA6ICdpbiBwZWFyIHNla29uZGVuJyxcbiAgICAgICAgICAgIG0gOiAnaWVuIG1pbsO6dCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVuJyxcbiAgICAgICAgICAgIGggOiAnaWVuIG9lcmUnLFxuICAgICAgICAgICAgaGggOiAnJWQgb2VyZW4nLFxuICAgICAgICAgICAgZCA6ICdpZW4gZGVpJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIE0gOiAnaWVuIG1vYW5uZScsXG4gICAgICAgICAgICBNTSA6ICclZCBtb2FubmVuJyxcbiAgICAgICAgICAgIHkgOiAnaWVuIGppZXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgamllcnJlbidcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCkgPyAnc3RlJyA6ICdkZScpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogZ2FsaWNpYW4gKGdsKVxuLy8gYXV0aG9yIDogSnVhbiBHLiBIdXJ0YWRvIDogaHR0cHM6Ly9naXRodWIuY29tL2p1YW5naHVydGFkb1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2wnLCB7XG4gICAgICAgIG1vbnRocyA6ICdYYW5laXJvX0ZlYnJlaXJvX01hcnpvX0FicmlsX01haW9fWHXDsW9fWHVsbG9fQWdvc3RvX1NldGVtYnJvX091dHVicm9fTm92ZW1icm9fRGVjZW1icm8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ1hhbi5fRmViLl9NYXIuX0Fici5fTWFpLl9YdcOxLl9YdWwuX0Fnby5fU2V0Ll9PdXQuX05vdi5fRGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnRG9taW5nb19MdW5zX01hcnRlc19Nw6lyY29yZXNfWG92ZXNfVmVucmVzX1PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnRG9tLl9MdW4uX01hci5fTcOpci5fWG92Ll9WZW4uX1PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdEb19MdV9NYV9Nw6lfWG9fVmVfU8OhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG94ZSAnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ8OhcycgOiAnw6EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7HDoSAnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ8OhcycgOiAnw6EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgWycgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAnw6FzJyA6ICdhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tvbnRlICcgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAnw6EnIDogJ2EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tvXSBkZGRkIFtwYXNhZG8gJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICfDoXMnIDogJ2EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gJ3VucyBzZWd1bmRvcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW5zIHNlZ3VuZG9zJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbiAnICsgc3RyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3QgOiAnaGFpICVzJyxcbiAgICAgICAgICAgIHMgOiAndW5zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG0gOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaCA6ICd1bmhhIGhvcmEnLFxuICAgICAgICAgICAgaGggOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZCA6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIE0gOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHkgOiAndW4gYW5vJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGFub3MnXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbCA6ICclZMK6JyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IEhlYnJldyAoaGUpXG4vLyBhdXRob3IgOiBUb21lciBDb2hlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS90b21lclxuLy8gYXV0aG9yIDogTW9zaGUgU2ltYW50b3YgOiBodHRwczovL2dpdGh1Yi5jb20vRGV2ZWxvcG1lbnRJTFxuLy8gYXV0aG9yIDogVGFsIEF0ZXIgOiBodHRwczovL2dpdGh1Yi5jb20vVGFsQXRlclxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnaGUnLCB7XG4gICAgICAgIG1vbnRocyA6ICfXmdeg15XXkNeoX9ek15HXqNeV15DXqF/Xnteo16Vf15DXpNeo15nXnF/XnteQ15lf15nXldeg15lf15nXldec15lf15DXldeS15XXodeYX9eh16TXmNee15HXqF/XkNeV16fXmNeV15HXqF/XoNeV15HXnteR16hf15PXptee15HXqCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn15nXoNeV17Nf16TXkdeo17Nf157XqNelX9eQ16TXqNezX9ee15DXmV/XmdeV16DXmV/XmdeV15zXmV/XkNeV15LXs1/Xodek15jXs1/XkNeV16fXs1/XoNeV15HXs1/Xk9em157Xsycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn16jXkNep15XXn1/Xqdeg15lf16nXnNeZ16nXmV/XqNeR15nXoteZX9eX157Xmdep15lf16nXmdep15lf16nXkdeqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9eQ17Nf15HXs1/XktezX9eT17Nf15TXs1/XldezX9ep17MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9eQX9eRX9eSX9eTX9eUX9eVX9epJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBb15FdTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIFvXkV1NTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIFvXkV1NTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgbCA6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbCA6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIGxsbCA6ICdEIE1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIGxsbGwgOiAnZGRkLCBEIE1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9eU15nXldedINeR1r5dTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb157Xl9eoINeR1r5dTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBb15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW9eQ16rXnteV15wg15HWvl1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb15HXmdeV151dIGRkZGQgW9eU15DXl9eo15XXnyDXkdep16LXlF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9eR16LXldeTICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn15zXpNeg15kgJXMnLFxuICAgICAgICAgICAgcyA6ICfXnteh16TXqCDXqdeg15nXldeqJyxcbiAgICAgICAgICAgIG0gOiAn15PXp9eUJyxcbiAgICAgICAgICAgIG1tIDogJyVkINeT16fXldeqJyxcbiAgICAgICAgICAgIGggOiAn16nXoteUJyxcbiAgICAgICAgICAgIGhoIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXqdei16rXmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXqdei15XXqic7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZCA6ICfXmdeV150nLFxuICAgICAgICAgICAgZGQgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9eZ15XXnteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINeZ157XmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBNIDogJ9eX15XXk9epJyxcbiAgICAgICAgICAgIE1NIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXl9eV15PXqdeZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINeX15XXk9ep15nXnSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeSA6ICfXqdeg15QnLFxuICAgICAgICAgICAgeXkgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9ep16DXqteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgJSAxMCA9PT0gMCAmJiBudW1iZXIgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXlCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXmdedJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBoaW5kaSAoaGkpXG4vLyBhdXRob3IgOiBNYXlhbmsgU2luZ2hhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXlhbmtzaW5naGFsXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ+ClpycsXG4gICAgICAgICcyJzogJ+ClqCcsXG4gICAgICAgICczJzogJ+ClqScsXG4gICAgICAgICc0JzogJ+ClqicsXG4gICAgICAgICc1JzogJ+ClqycsXG4gICAgICAgICc2JzogJ+ClrCcsXG4gICAgICAgICc3JzogJ+ClrScsXG4gICAgICAgICc4JzogJ+ClricsXG4gICAgICAgICc5JzogJ+ClrycsXG4gICAgICAgICcwJzogJ+ClpidcbiAgICB9LFxuICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgJ+Clpic6ICcwJ1xuICAgIH07XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnaGknLCB7XG4gICAgICAgIG1vbnRocyA6ICfgpJzgpKjgpLXgpLDgpYBf4KSr4KS84KSw4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYjgpLJf4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS44KWN4KSkX+CkuOCkv+CkpOCkruCljeCkrOCksF/gpIXgpJXgpY3gpJ/gpYLgpKzgpLBf4KSo4KS14KSu4KWN4KSs4KSwX+CkpuCkv+CkuOCkruCljeCkrOCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4KSc4KSoLl/gpKvgpLzgpLAuX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYguX+CkruCkiF/gpJzgpYLgpKhf4KSc4KWB4KSyLl/gpIXgpJcuX+CkuOCkv+CkpC5f4KSF4KSV4KWN4KSf4KWCLl/gpKjgpLUuX+CkpuCkv+CkuC4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+CksOCkteCkv+CkteCkvuCksF/gpLjgpYvgpK7gpLXgpL7gpLBf4KSu4KSC4KSX4KSy4KS14KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpJfgpYHgpLDgpYLgpLXgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KS14KS+4KSwX+CktuCkqOCkv+CkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfgpLDgpLXgpL9f4KS44KWL4KSuX+CkruCkguCkl+Cksl/gpKzgpYHgpKdf4KSX4KWB4KSw4KWCX+CktuClgeCkleCljeCksF/gpLbgpKjgpL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+CksF/gpLjgpYtf4KSu4KSCX+CkrOClgV/gpJfgpYFf4KS24KWBX+Ckticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdBIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExUUyA6ICdBIGg6bW06c3Mg4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgpJXgpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgpKrgpL/gpJvgpLLgpYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDgpK7gpYfgpIInLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDgpKrgpLngpLLgpYcnLFxuICAgICAgICAgICAgcyA6ICfgpJXgpYHgpJsg4KS54KWAIOCkleCljeCkt+CkoycsXG4gICAgICAgICAgICBtIDogJ+Ckj+CklSDgpK7gpL/gpKjgpJ8nLFxuICAgICAgICAgICAgbW0gOiAnJWQg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIGggOiAn4KSP4KSVIOCkmOCkguCkn+CkvicsXG4gICAgICAgICAgICBoaCA6ICclZCDgpJjgpILgpJ/gpYcnLFxuICAgICAgICAgICAgZCA6ICfgpI/gpJUg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBNIDogJ+Ckj+CklSDgpK7gpLngpYDgpKjgpYcnLFxuICAgICAgICAgICAgTU0gOiAnJWQg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIHkgOiAn4KSP4KSVIOCkteCksOCljeCktycsXG4gICAgICAgICAgICB5eSA6ICclZCDgpLXgpLDgpY3gpLcnXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIEhpbmRpIG5vdGF0aW9uIGZvciBtZXJpZGllbXMgYXJlIHF1aXRlIGZ1enp5IGluIHByYWN0aWNlLiBXaGlsZSB0aGVyZSBleGlzdHNcbiAgICAgICAgLy8gYSByaWdpZCBub3Rpb24gb2YgYSAnUGFoYXInIGl0IGlzIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIEhpbmRpLlxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSkfOCkuOClgeCkrOCkuXzgpKbgpYvgpKrgpLngpLB84KS24KS+4KSuLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOClgeCkrOCkuScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpYvgpKrgpLngpLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CktuCkvuCkricpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpYHgpKzgpLknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCli+CkquCkueCksCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS24KS+4KSuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogaHJ2YXRza2kgKGhyKVxuLy8gYXV0aG9yIDogQm9qYW4gTWFya292acSHIDogaHR0cHM6Ly9naXRodWIuY29tL2JtYXJrb3ZpY1xuXG4vLyBiYXNlZCBvbiAoc2wpIHRyYW5zbGF0aW9uIGJ5IFJvYmVydCBTZWRvdsWhZWtcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnamVkbmEgbWludXRhJyA6ICdqZWRuZSBtaW51dGUnO1xuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRlJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRhbiBzYXQnIDogJ2plZG5vZyBzYXRhJztcbiAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW5hJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlYyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNhJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2hyJywge1xuICAgICAgICBtb250aHMgOiAnc2plxI1hbmpfdmVsamHEjWFfb8W+dWpha190cmF2YW5qX3N2aWJhbmpfbGlwYW5qX3NycGFual9rb2xvdm96X3J1amFuX2xpc3RvcGFkX3N0dWRlbmlfcHJvc2luYWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ3NqZS5fdmVsLl9vxb51Ll90cmEuX3N2aS5fbGlwLl9zcnAuX2tvbC5fcnVqLl9saXMuX3N0dS5fcHJvLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuIE1NLiBZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgIDogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5ICA6ICdbc3V0cmEgdV0gTFQnLFxuXG4gICAgICAgICAgICBuZXh0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSAgOiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsaV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdCAgIDogJ3ByaWplICVzJyxcbiAgICAgICAgICAgIHMgICAgICA6ICdwYXIgc2VrdW5kaScsXG4gICAgICAgICAgICBtICAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbSAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoICAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkICAgICAgOiAnZGFuJyxcbiAgICAgICAgICAgIGRkICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gICAgICA6ICdtamVzZWMnLFxuICAgICAgICAgICAgTU0gICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSAgICAgIDogJ2dvZGludScsXG4gICAgICAgICAgICB5eSAgICAgOiB0cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBodW5nYXJpYW4gKGh1KVxuLy8gYXV0aG9yIDogQWRhbSBCcnVubmVyIDogaHR0cHM6Ly9naXRodWIuY29tL2FkYW1icnVubmVyXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciB3ZWVrRW5kaW5ncyA9ICd2YXPDoXJuYXAgaMOpdGbFkW4ga2VkZGVuIHN6ZXJkw6FuIGNzw7x0w7ZydMO2a8O2biBww6ludGVrZW4gc3pvbWJhdG9uJy5zcGxpdCgnICcpO1xuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgbnVtID0gbnVtYmVyLFxuICAgICAgICAgICAgc3VmZml4O1xuXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4KSA/ICduw6low6FueSBtw6Fzb2RwZXJjJyA6ICduw6low6FueSBtw6Fzb2RwZXJjZSc7XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIHBlcmMnIDogJyBwZXJjZScpO1xuICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIHBlcmMnIDogJyBwZXJjZScpO1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDs3JhJyA6ICcgw7Nyw6FqYScpO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOzcmEnIDogJyDDs3LDoWphJyk7XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIG5hcCcgOiAnIG5hcGphJyk7XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgbmFwJyA6ICcgbmFwamEnKTtcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgaMOzbmFwJyA6ICcgaMOzbmFwamEnKTtcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBow7NuYXAnIDogJyBow7NuYXBqYScpO1xuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDqXYnIDogJyDDqXZlJyk7XG4gICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw6l2JyA6ICcgw6l2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWsoaXNGdXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIChpc0Z1dHVyZSA/ICcnIDogJ1ttw7psdF0gJykgKyAnWycgKyB3ZWVrRW5kaW5nc1t0aGlzLmRheSgpXSArICddIExUWy1rb3JdJztcbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnaHUnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51w6FyX2ZlYnJ1w6FyX23DoXJjaXVzX8OhcHJpbGlzX23DoWp1c19qw7puaXVzX2rDumxpdXNfYXVndXN6dHVzX3N6ZXB0ZW1iZXJfb2t0w7NiZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbcOhcmNfw6Fwcl9tw6FqX2rDum5fasO6bF9hdWdfc3plcHRfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ3Zhc8Ohcm5hcF9ow6l0ZsWRX2tlZGRfc3plcmRhX2Nzw7x0w7ZydMO2a19ww6ludGVrX3N6b21iYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAndmFzX2jDqXRfa2VkZF9zemVfY3PDvHRfcMOpbl9zem8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3ZfaF9rX3N6ZV9jc19wX3N6bycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVkuIE1NTU0gRC4nLFxuICAgICAgICAgICAgTExMIDogJ1lZWVkuIE1NTU0gRC4sIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnWVlZWS4gTU1NTSBELiwgZGRkZCBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2RlfGR1L2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgxKS50b0xvd2VyQ2FzZSgpID09PSAndSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID09PSB0cnVlID8gJ2RlJyA6ICdERSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID09PSB0cnVlID8gJ2R1JyA6ICdEVSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbbWFdIExUWy1rb3JdJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW2hvbG5hcF0gTFRbLWtvcl0nLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdlZWsuY2FsbCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1t0ZWduYXBdIExUWy1rb3JdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3ZWVrLmNhbGwodGhpcywgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyBtw7psdmEnLFxuICAgICAgICAgICAgcGFzdCA6ICclcycsXG4gICAgICAgICAgICBzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5IDogdHJhbnNsYXRlXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogQXJtZW5pYW4gKGh5LWFtKVxuLy8gYXV0aG9yIDogQXJtZW5kYXJhYnlhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcm1lbmRhcmFieWFuXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIGZ1bmN0aW9uIG1vbnRoc0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgbW9udGhzID0ge1xuICAgICAgICAgICAgJ25vbWluYXRpdmUnOiAn1bDVuNaC1bbVvtWh1oBf1oPVpdW/1oDVvtWh1oBf1bTVodaA1b9f1aHVutaA1avVrF/VtNWh1bXVq9W9X9Ww1bjWgtW21avVvV/VsNW41oLVrNWr1b1f1oXVo9W41b3Vv9W41b1f1b3VpdW61b/VpdW01aLVpdaAX9Ww1bjVr9W/1aXVtNWi1aXWgF/VttW41bXVpdW01aLVpdaAX9Wk1aXVr9W/1aXVtNWi1aXWgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgICdhY2N1c2F0aXZlJzogJ9Ww1bjWgtW21b7VodaA1atf1oPVpdW/1oDVvtWh1oDVq1/VtNWh1oDVv9WrX9Wh1brWgNWr1azVq1/VtNWh1bXVq9W91atf1bDVuNaC1bbVq9W91atf1bDVuNaC1azVq9W91atf1oXVo9W41b3Vv9W41b3Vq1/VvdWl1brVv9Wl1bTVotWl1oDVq1/VsNW41a/Vv9Wl1bTVotWl1oDVq1/VttW41bXVpdW01aLVpdaA1atf1aTVpdWv1b/VpdW01aLVpdaA1asnLnNwbGl0KCdfJylcbiAgICAgICAgfSxcblxuICAgICAgICBub3VuQ2FzZSA9ICgvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKykrTU1NTT8vKS50ZXN0KGZvcm1hdCkgP1xuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnIDpcbiAgICAgICAgICAgICdub21pbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gbW9udGhzW25vdW5DYXNlXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1Nob3J0Q2FzZVJlcGxhY2UobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciBtb250aHNTaG9ydCA9ICfVsNW21b5f1oPVv9aAX9W01oDVv1/VodW61oBf1bTVtdW9X9Ww1bbVvV/VsNWs1b1f1oXVo9W9X9W91brVv1/VsNWv1b9f1bbVtNWiX9Wk1a/Vvycuc3BsaXQoJ18nKTtcblxuICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSAn1a/Vq9aA1aHVr9WrX9Wl1oDVr9W41oLVt9Wh1aLVqdWrX9Wl1oDVpdaE1bfVodWi1anVq1/VudW41oDVpdaE1bfVodWi1anVq1/VsNWr1bbVo9W31aHVotWp1atf1bjWgtaA1aLVodWpX9W31aHVotWh1aknLnNwbGl0KCdfJyk7XG5cbiAgICAgICAgcmV0dXJuIHdlZWtkYXlzW20uZGF5KCldO1xuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdoeS1hbScsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzQ2FzZVJlcGxhY2UsXG4gICAgICAgIG1vbnRoc1Nob3J0IDogbW9udGhzU2hvcnRDYXNlUmVwbGFjZSxcbiAgICAgICAgd2Vla2RheXMgOiB3ZWVrZGF5c0Nhc2VSZXBsYWNlLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9Wv1oDVr1/VpdaA1a9f1aXWgNaEX9W51oDWhF/VsNW21aNf1bjWgtaA1aJf1bfVotWpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfVr9aA1a9f1aXWgNWvX9Wl1oDWhF/VudaA1oRf1bDVttWjX9W41oLWgNWiX9W31aLVqScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZINWpLicsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkg1akuLCBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZINWpLiwgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vVodW11b3WhdaAXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9W+1aHVstWoXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Wl1oDVpdWvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBb1oXWgNWoINWq1aHVtNWoXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vVodW21oHVodWuXSBkZGRkIFvWhdaA1agg1arVodW01ahdIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDVsNWl1b/VuCcsXG4gICAgICAgICAgICBwYXN0IDogJyVzINWh1bzVodW7JyxcbiAgICAgICAgICAgIHMgOiAn1bTVqyDWhNWh1bbVqyDVvtWh1bXWgNWv1bXVodW2JyxcbiAgICAgICAgICAgIG0gOiAn1oDVuNW61aUnLFxuICAgICAgICAgICAgbW0gOiAnJWQg1oDVuNW61aUnLFxuICAgICAgICAgICAgaCA6ICfVqtWh1bQnLFxuICAgICAgICAgICAgaGggOiAnJWQg1arVodW0JyxcbiAgICAgICAgICAgIGQgOiAn1oXWgCcsXG4gICAgICAgICAgICBkZCA6ICclZCDWhdaAJyxcbiAgICAgICAgICAgIE0gOiAn1aHVtNWr1b0nLFxuICAgICAgICAgICAgTU0gOiAnJWQg1aHVtNWr1b0nLFxuICAgICAgICAgICAgeSA6ICfVv9Wh1oDVqycsXG4gICAgICAgICAgICB5eSA6ICclZCDVv9Wh1oDVqydcbiAgICAgICAgfSxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv1aPVq9W31aXWgNW+1aF81aHVvNWh1b7VuNW/1b7VoXzWgdWl1oDVpdWv1b7VoXzVpdaA1aXVr9W41bXVodW2LyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o1oHVpdaA1aXVr9W+1aF81aXWgNWl1a/VuNW11aHVtikkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVo9Wr1bfVpdaA1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aHVvNWh1b7VuNW/1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1oHVpdaA1aXVr9W+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wl1oDVpdWv1bjVtdWh1bYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9fFxcZHsxLDJ9LSjVq9W2fNaA1aQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICBjYXNlICdERERvJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdWr1bYnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3WgNWkJztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogQmFoYXNhIEluZG9uZXNpYSAoaWQpXG4vLyBhdXRob3IgOiBNb2hhbW1hZCBTYXRyaW8gVXRvbW8gOiBodHRwczovL2dpdGh1Yi5jb20vdHlva1xuLy8gcmVmZXJlbmNlOiBodHRwOi8vaWQud2lraXNvdXJjZS5vcmcvd2lraS9QZWRvbWFuX1VtdW1fRWphYW5fQmFoYXNhX0luZG9uZXNpYV95YW5nX0Rpc2VtcHVybmFrYW5cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2lkJywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyaV9GZWJydWFyaV9NYXJldF9BcHJpbF9NZWlfSnVuaV9KdWxpX0FndXN0dXNfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGVzZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NZWlfSnVuX0p1bF9BZ3NfU2VwX09rdF9Ob3ZfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdNaW5nZ3VfU2VuaW5fU2VsYXNhX1JhYnVfS2FtaXNfSnVtYXRfU2FidHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnTWluX1Nlbl9TZWxfUmFiX0thbV9KdW1fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdNZ19Tbl9TbF9SYl9LbV9KbV9TYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISC5tbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQuc3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3BhZ2l8c2lhbmd8c29yZXxtYWxhbS8sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NpYW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb3JlJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NpYW5nJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc29yZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tCZXNvayBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW0tlbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ2RkZGQgW2xhbHUgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdkYWxhbSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIHlhbmcgbGFsdScsXG4gICAgICAgICAgICBzIDogJ2JlYmVyYXBhIGRldGlrJyxcbiAgICAgICAgICAgIG0gOiAnc2VtZW5pdCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtZW5pdCcsXG4gICAgICAgICAgICBoIDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGphbScsXG4gICAgICAgICAgICBkIDogJ3NlaGFyaScsXG4gICAgICAgICAgICBkZCA6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE0gOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTSA6ICclZCBidWxhbicsXG4gICAgICAgICAgICB5IDogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXkgOiAnJWQgdGFodW4nXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBpY2VsYW5kaWMgKGlzKVxuLy8gYXV0aG9yIDogSGlucmlrIMOWcm4gU2lndXLDsHNzb24gOiBodHRwczovL2dpdGh1Yi5jb20vaGlucmlrXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIGlmIChuICUgMTAwID09PSAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobiAlIDEwID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ25va2tyYXIgc2Vrw7puZHVyJyA6ICdub2trcnVtIHNla8O6bmR1bSc7XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbcOtbsO6dGEnIDogJ23DrW7DunR1JztcbiAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ23DrW7DunR1cicgOiAnbcOtbsO6dHVtJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DrW7DunRhJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOtbsO6dHUnO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAna2x1a2t1c3R1bmRpcicgOiAna2x1a2t1c3R1bmR1bScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdrbHVra3VzdHVuZCc7XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RhZ3VyJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdkYWcnIDogJ2RlZ2knO1xuICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RhZ2FyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdkYWdhJyA6ICdkw7ZndW0nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZGFndXInO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdkYWcnIDogJ2RlZ2knKTtcbiAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbcOhbnXDsHVyJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtw6FudcOwJyA6ICdtw6FudcOwaSc7XG4gICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOhbnXDsGlyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdtw6FudcOwaScgOiAnbcOhbnXDsHVtJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DoW51w7B1cic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ23DoW51w7AnIDogJ23DoW51w7BpJyk7XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJpJztcbiAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FydW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICfDoXInIDogJ8OhcmknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdpcycsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbsO6YXJfZmVicsO6YXJfbWFyc19hcHLDrWxfbWHDrV9qw7puw61fasO6bMOtX8OhZ8O6c3Rfc2VwdGVtYmVyX29rdMOzYmVyX27Ds3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnamFuX2ZlYl9tYXJfYXByX21hw61fasO6bl9qw7psX8OhZ8O6X3NlcF9va3RfbsOzdl9kZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ3N1bm51ZGFndXJfbcOhbnVkYWd1cl/DvnJpw7BqdWRhZ3VyX21pw7B2aWt1ZGFndXJfZmltbXR1ZGFndXJfZsO2c3R1ZGFndXJfbGF1Z2FyZGFndXInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnc3VuX23DoW5fw75yaV9tacOwX2ZpbV9mw7ZzX2xhdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnU3VfTcOhX8Oecl9NaV9GaV9Gw7ZfTGEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIFtrbC5dIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIFtrbC5dIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW8OtIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW8OhIG1vcmd1biBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbw60gZ8OmciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tzw63DsGFzdGFdIGRkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2VmdGlyICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnZnlyaXIgJXMgc8Otw7BhbicsXG4gICAgICAgICAgICBzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCA6ICdrbHVra3VzdHVuZCcsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGl0YWxpYW4gKGl0KVxuLy8gYXV0aG9yIDogTG9yZW56byA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGllbVxuLy8gYXV0aG9yOiBNYXR0aWEgTGFyZW50aXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub3N0YWxnaWF6XG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdpdCcsIHtcbiAgICAgICAgbW9udGhzIDogJ2dlbm5haW9fZmViYnJhaW9fbWFyem9fYXByaWxlX21hZ2dpb19naXVnbm9fbHVnbGlvX2Fnb3N0b19zZXR0ZW1icmVfb3R0b2JyZV9ub3ZlbWJyZV9kaWNlbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnZ2VuX2ZlYl9tYXJfYXByX21hZ19naXVfbHVnX2Fnb19zZXRfb3R0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ0RvbWVuaWNhX0x1bmVkw6xfTWFydGVkw6xfTWVyY29sZWTDrF9HaW92ZWTDrF9WZW5lcmTDrF9TYWJhdG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnRG9tX0x1bl9NYXJfTWVyX0dpb19WZW5fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdEX0xfTWFfTWVfR19WX1MnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW09nZ2kgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEb21hbmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthbGxlXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0llcmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbGEgc2NvcnNhXSBkZGRkIFthbGxlXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tsbyBzY29yc29dIGRkZGQgW2FsbGVdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKC9eWzAtOV0uKyQvKS50ZXN0KHMpID8gJ3RyYScgOiAnaW4nKSArICcgJyArIHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdCA6ICclcyBmYScsXG4gICAgICAgICAgICBzIDogJ2FsY3VuaSBzZWNvbmRpJyxcbiAgICAgICAgICAgIG0gOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoIDogJ3VuXFwnb3JhJyxcbiAgICAgICAgICAgIGhoIDogJyVkIG9yZScsXG4gICAgICAgICAgICBkIDogJ3VuIGdpb3JubycsXG4gICAgICAgICAgICBkZCA6ICclZCBnaW9ybmknLFxuICAgICAgICAgICAgTSA6ICd1biBtZXNlJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1lc2knLFxuICAgICAgICAgICAgeSA6ICd1biBhbm5vJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGFubmknXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogamFwYW5lc2UgKGphKVxuLy8gYXV0aG9yIDogTEkgTG9uZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXJ5b25cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2phJywge1xuICAgICAgICBtb250aHMgOiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfml6Xmm5zml6Vf5pyI5puc5pelX+eBq+abnOaXpV/msLTmm5zml6Vf5pyo5puc5pelX+mHkeabnOaXpV/lnJ/mm5zml6UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn5pelX+aciF/ngatf5rC0X+acqF/ph5Ff5ZyfJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfml6Vf5pyIX+eBq1/msLRf5pyoX+mHkV/lnJ8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnQWjmmYJt5YiGJyxcbiAgICAgICAgICAgIExUUyA6ICdMVHPnp5InLFxuICAgICAgICAgICAgTCA6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEwgOiAnWVlZWeW5tE3mnIhE5pelTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdZWVlZ5bm0TeaciETml6VMVCBkZGRkJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5Y2I5YmNfOWNiOW+jC9pLFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfljYjlvownO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WNiOWJjSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Y2I5b6MJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vku4rml6VdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+aYjuaXpV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnW+adpemAsV1kZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW+aYqOaXpV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+WJjemAsV1kZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclc+W+jCcsXG4gICAgICAgICAgICBwYXN0IDogJyVz5YmNJyxcbiAgICAgICAgICAgIHMgOiAn5pWw56eSJyxcbiAgICAgICAgICAgIG0gOiAnMeWIhicsXG4gICAgICAgICAgICBtbSA6ICclZOWIhicsXG4gICAgICAgICAgICBoIDogJzHmmYLplpMnLFxuICAgICAgICAgICAgaGggOiAnJWTmmYLplpMnLFxuICAgICAgICAgICAgZCA6ICcx5pelJyxcbiAgICAgICAgICAgIGRkIDogJyVk5pelJyxcbiAgICAgICAgICAgIE0gOiAnMeODtuaciCcsXG4gICAgICAgICAgICBNTSA6ICclZOODtuaciCcsXG4gICAgICAgICAgICB5IDogJzHlubQnLFxuICAgICAgICAgICAgeXkgOiAnJWTlubQnXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogR2VvcmdpYW4gKGthKVxuLy8gYXV0aG9yIDogSXJha2xpIEphbmlhc2h2aWxpIDogaHR0cHM6Ly9naXRodWIuY29tL2lyYWtsaS1qYW5pYXNodmlsaVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICBmdW5jdGlvbiBtb250aHNDYXNlUmVwbGFjZShtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIG1vbnRocyA9IHtcbiAgICAgICAgICAgICdub21pbmF0aXZlJzogJ+GDmOGDkOGDnOGDleGDkOGDoOGDmF/hg5fhg5Thg5Hhg5Thg6Dhg5Xhg5Dhg5rhg5hf4YOb4YOQ4YOg4YOi4YOYX+GDkOGDnuGDoOGDmOGDmuGDmF/hg5vhg5Dhg5jhg6Hhg5hf4YOY4YOV4YOc4YOY4YOh4YOYX+GDmOGDleGDmuGDmOGDoeGDmF/hg5Dhg5Lhg5Xhg5jhg6Hhg6Lhg51f4YOh4YOU4YOl4YOi4YOU4YOb4YOR4YOU4YOg4YOYX+GDneGDpeGDouGDneGDm+GDkeGDlOGDoOGDmF/hg5zhg53hg5Thg5vhg5Hhg5Thg6Dhg5hf4YOT4YOU4YOZ4YOU4YOb4YOR4YOU4YOg4YOYJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnOiAn4YOY4YOQ4YOc4YOV4YOQ4YOg4YOhX+GDl+GDlOGDkeGDlOGDoOGDleGDkOGDmuGDoV/hg5vhg5Dhg6Dhg6Lhg6Ff4YOQ4YOe4YOg4YOY4YOa4YOY4YOhX+GDm+GDkOGDmOGDoeGDoV/hg5jhg5Xhg5zhg5jhg6Hhg6Ff4YOY4YOV4YOa4YOY4YOh4YOhX+GDkOGDkuGDleGDmOGDoeGDouGDoV/hg6Hhg5Thg6Xhg6Lhg5Thg5vhg5Hhg5Thg6Dhg6Ff4YOd4YOl4YOi4YOd4YOb4YOR4YOU4YOg4YOhX+GDnOGDneGDlOGDm+GDkeGDlOGDoOGDoV/hg5Phg5Thg5nhg5Thg5vhg5Hhg5Thg6Dhg6EnLnNwbGl0KCdfJylcbiAgICAgICAgfSxcblxuICAgICAgICBub3VuQ2FzZSA9ICgvRFtvRF0gKk1NTU0/LykudGVzdChmb3JtYXQpID9cbiAgICAgICAgICAgICdhY2N1c2F0aXZlJyA6XG4gICAgICAgICAgICAnbm9taW5hdGl2ZSc7XG5cbiAgICAgICAgcmV0dXJuIG1vbnRoc1tub3VuQ2FzZV1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSB7XG4gICAgICAgICAgICAnbm9taW5hdGl2ZSc6ICfhg5nhg5Xhg5jhg6Dhg5Bf4YOd4YOg4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDoeGDkOGDm+GDqOGDkOGDkeGDkOGDl+GDmF/hg53hg5fhg67hg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOu4YOj4YOX4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDnuGDkOGDoOGDkOGDoeGDmeGDlOGDleGDmF/hg6jhg5Dhg5Hhg5Dhg5fhg5gnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICAnYWNjdXNhdGl2ZSc6ICfhg5nhg5Xhg5jhg6Dhg5Dhg6Ff4YOd4YOg4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDoeGDkOGDm+GDqOGDkOGDkeGDkOGDl+GDoV/hg53hg5fhg67hg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOu4YOj4YOX4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDnuGDkOGDoOGDkOGDoeGDmeGDlOGDleGDoV/hg6jhg5Dhg5Hhg5Dhg5fhg6EnLnNwbGl0KCdfJylcbiAgICAgICAgfSxcblxuICAgICAgICBub3VuQ2FzZSA9ICgvKOGDrOGDmOGDnOGDkHzhg6jhg5Thg5vhg5Phg5Thg5IpLykudGVzdChmb3JtYXQpID9cbiAgICAgICAgICAgICdhY2N1c2F0aXZlJyA6XG4gICAgICAgICAgICAnbm9taW5hdGl2ZSc7XG5cbiAgICAgICAgcmV0dXJuIHdlZWtkYXlzW25vdW5DYXNlXVttLmRheSgpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgna2EnLCB7XG4gICAgICAgIG1vbnRocyA6IG1vbnRoc0Nhc2VSZXBsYWNlLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfhg5jhg5Dhg5xf4YOX4YOU4YORX+GDm+GDkOGDoF/hg5Dhg57hg6Bf4YOb4YOQ4YOYX+GDmOGDleGDnF/hg5jhg5Xhg5pf4YOQ4YOS4YOVX+GDoeGDlOGDpV/hg53hg6Xhg6Jf4YOc4YOd4YOUX+GDk+GDlOGDmScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiB3ZWVrZGF5c0Nhc2VSZXBsYWNlLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+GDmeGDleGDmF/hg53hg6Dhg6hf4YOh4YOQ4YObX+GDneGDl+GDrl/hg67hg6Phg5df4YOe4YOQ4YOgX+GDqOGDkOGDkScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4YOZ4YOVX+GDneGDoF/hg6Hhg5Bf4YOd4YOXX+GDruGDo1/hg57hg5Bf4YOo4YOQJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vhg5Phg6bhg5Thg6FdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+GDruGDleGDkOGDml0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb4YOS4YOj4YOo4YOY4YOcXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdb4YOo4YOU4YOb4YOT4YOU4YOSXSBkZGRkIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vhg6zhg5jhg5zhg5BdIGRkZGQgTFQt4YOW4YOUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgvKOGDrOGDkOGDm+GDmHzhg6zhg6Phg5fhg5h84YOh4YOQ4YOQ4YOX4YOYfOGDrOGDlOGDmuGDmCkvKS50ZXN0KHMpID9cbiAgICAgICAgICAgICAgICAgICAgcy5yZXBsYWNlKC/hg5gkLywgJ+GDqOGDmCcpIDpcbiAgICAgICAgICAgICAgICAgICAgcyArICfhg6jhg5gnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3QgOiBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIGlmICgoLyjhg6zhg5Dhg5vhg5h84YOs4YOj4YOX4YOYfOGDoeGDkOGDkOGDl+GDmHzhg5Phg6bhg5R84YOX4YOV4YOUKS8pLnRlc3QocykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvKOGDmHzhg5QpJC8sICfhg5jhg6Eg4YOs4YOY4YOcJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoL+GDrOGDlOGDmuGDmC8pLnRlc3QocykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgv4YOs4YOU4YOa4YOYJC8sICfhg6zhg5rhg5jhg6Eg4YOs4YOY4YOcJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHMgOiAn4YOg4YOQ4YOb4YOT4YOU4YOc4YOY4YOb4YOUIOGDrOGDkOGDm+GDmCcsXG4gICAgICAgICAgICBtIDogJ+GDrOGDo+GDl+GDmCcsXG4gICAgICAgICAgICBtbSA6ICclZCDhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgaCA6ICfhg6Hhg5Dhg5Dhg5fhg5gnLFxuICAgICAgICAgICAgaGggOiAnJWQg4YOh4YOQ4YOQ4YOX4YOYJyxcbiAgICAgICAgICAgIGQgOiAn4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOGDk+GDpuGDlCcsXG4gICAgICAgICAgICBNIDogJ+GDl+GDleGDlCcsXG4gICAgICAgICAgICBNTSA6ICclZCDhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgeSA6ICfhg6zhg5Thg5rhg5gnLFxuICAgICAgICAgICAgeXkgOiAnJWQg4YOs4YOU4YOa4YOYJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC8wfDEt4YOa4YOYfOGDm+GDlC1cXGR7MSwyfXxcXGR7MSwyfS3hg5QvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3hg5rhg5gnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKG51bWJlciA8IDIwKSB8fCAobnVtYmVyIDw9IDEwMCAmJiAobnVtYmVyICUgMjAgPT09IDApKSB8fCAobnVtYmVyICUgMTAwID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4YOb4YOULScgKyBudW1iZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLeGDlCc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLFxuICAgICAgICAgICAgZG95IDogN1xuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGtobWVyIChrbSlcbi8vIGF1dGhvciA6IEtydXkgVmFubmEgOiBodHRwczovL2dpdGh1Yi5jb20va3J1eXZhbm5hXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbScsIHtcbiAgICAgICAgbW9udGhzOiAn4Z6Y4Z6A4Z6a4Z62X+GegOGeu+GemOGfkuGel+GfiF/hnpjhnrfhnpPhnrZf4Z6Y4Z+B4Z6f4Z62X+Gep+Gen+Gel+Getl/hnpjhnrfhnpDhnrvhnpPhnrZf4Z6A4Z6A4Z+S4Z6A4Z6K4Z62X+Gen+GeuOGeoOGetl/hnoDhnonhn5LhnonhnrZf4Z6P4Z674Z6b4Z62X+GenOGet+GeheGfkuGehuGet+GegOGetl/hnpLhn5LhnpPhnrwnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4Z6Y4Z6A4Z6a4Z62X+GegOGeu+GemOGfkuGel+GfiF/hnpjhnrfhnpPhnrZf4Z6Y4Z+B4Z6f4Z62X+Gep+Gen+Gel+Getl/hnpjhnrfhnpDhnrvhnpPhnrZf4Z6A4Z6A4Z+S4Z6A4Z6K4Z62X+Gen+GeuOGeoOGetl/hnoDhnonhn5LhnonhnrZf4Z6P4Z674Z6b4Z62X+GenOGet+GeheGfkuGehuGet+GegOGetl/hnpLhn5LhnpPhnrwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn4Z6i4Z624Z6R4Z634Z6P4Z+S4Z6ZX+GeheGfkOGek+GfkuGekV/hnqLhnoThn5LhnoLhnrbhnppf4Z6W4Z674Z6SX+GeluGfkuGemuGeoOGen+GfkuGelOGej+Get+GfjV/hnp/hnrvhnoDhn5Lhnppf4Z6f4Z+F4Z6a4Z+NJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Z6i4Z624Z6R4Z634Z6P4Z+S4Z6ZX+GeheGfkOGek+GfkuGekV/hnqLhnoThn5LhnoLhnrbhnppf4Z6W4Z674Z6SX+GeluGfkuGemuGeoOGen+GfkuGelOGej+Get+GfjV/hnp/hnrvhnoDhn5Lhnppf4Z6f4Z+F4Z6a4Z+NJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+GeouGetuGekeGet+Gej+GfkuGemV/hnoXhn5DhnpPhn5LhnpFf4Z6i4Z6E4Z+S4Z6C4Z624Z6aX+GeluGeu+Gekl/hnpbhn5LhnprhnqDhnp/hn5LhnpThno/hnrfhn41f4Z6f4Z674Z6A4Z+S4Z6aX+Gen+GfheGemuGfjScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vhnpDhn5LhnoThn4PhnpPhn4gg4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+Gen+GfkuGeouGfguGegCDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+GemOGfkuGen+Get+Gem+GemOGet+GeiSDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb4Z6f4Z6U4Z+S4Z6P4Z624Z6g4Z+N4Z6Y4Z674Z6TXSBb4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPhnpHhn4Dhno8nLFxuICAgICAgICAgICAgcGFzdDogJyVz4Z6Y4Z674Z6TJyxcbiAgICAgICAgICAgIHM6ICfhnpThn4nhnrvhnpPhn5LhnpjhnrbhnpPhnpzhnrfhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgbTogJ+GemOGeveGemeGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBtbTogJyVkIOGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBoOiAn4Z6Y4Z694Z6Z4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGQ6ICfhnpjhnr3hnpnhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgZGQ6ICclZCDhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgTTogJ+GemOGeveGemeGegeGfgicsXG4gICAgICAgICAgICBNTTogJyVkIOGegeGfgicsXG4gICAgICAgICAgICB5OiAn4Z6Y4Z694Z6Z4Z6G4Z+S4Z6T4Z624Z+GJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Z6G4Z+S4Z6T4Z624Z+GJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0IC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBrb3JlYW4gKGtvKVxuLy9cbi8vIGF1dGhvcnNcbi8vXG4vLyAtIEt5dW5nd29vaywgUGFyayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9reXVuZ3cwMGtcbi8vIC0gSmVlZXl1bCBMZWUgPGplZWV5dWxAZ21haWwuY29tPlxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ2tvJywge1xuICAgICAgICBtb250aHMgOiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJzHsm5RfMuyblF8z7JuUXzTsm5RfNeyblF827JuUXzfsm5RfOOyblF857JuUXzEw7JuUXzEx7JuUXzEy7JuUJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfsnbzsmpTsnbxf7JuU7JqU7J28X+2ZlOyalOydvF/siJjsmpTsnbxf66qp7JqU7J28X+q4iOyalOydvF/thqDsmpTsnbwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn7J28X+yblF/tmZRf7IiYX+uqqV/quIhf7YagJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfsnbxf7JuUX+2ZlF/siJhf66qpX+q4iF/thqAnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnQSBo7IucIG3rtoQnLFxuICAgICAgICAgICAgTFRTIDogJ0EgaOyLnCBt67aEIHPstIgnLFxuICAgICAgICAgICAgTCA6ICdZWVlZLk1NLkREJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVnrhYQgTU1NTSBE7J28JyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZ64WEIE1NTU0gROydvCBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ1lZWVnrhYQgTU1NTSBE7J28IGRkZGQgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICfsmKTripggTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICfrgrTsnbwgTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ+yWtOygnCBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICfsp4Drgpzso7wgZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg7ZuEJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg7KCEJyxcbiAgICAgICAgICAgIHMgOiAn66qH7LSIJyxcbiAgICAgICAgICAgIHNzIDogJyVk7LSIJyxcbiAgICAgICAgICAgIG0gOiAn7J2867aEJyxcbiAgICAgICAgICAgIG1tIDogJyVk67aEJyxcbiAgICAgICAgICAgIGggOiAn7ZWc7Iuc6rCEJyxcbiAgICAgICAgICAgIGhoIDogJyVk7Iuc6rCEJyxcbiAgICAgICAgICAgIGQgOiAn7ZWY66OoJyxcbiAgICAgICAgICAgIGRkIDogJyVk7J28JyxcbiAgICAgICAgICAgIE0gOiAn7ZWc64usJyxcbiAgICAgICAgICAgIE1NIDogJyVk64usJyxcbiAgICAgICAgICAgIHkgOiAn7J2864WEJyxcbiAgICAgICAgICAgIHl5IDogJyVk64WEJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2UgOiAvXFxkezEsMn3snbwvLFxuICAgICAgICBvcmRpbmFsIDogJyVk7J28JyxcbiAgICAgICAgbWVyaWRpZW1QYXJzZSA6IC/smKTsoIR87Jik7ZuELyxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuID09PSAn7Jik7ZuEJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc1VwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91ciA8IDEyID8gJ+yYpOyghCcgOiAn7Jik7ZuEJztcbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBMdXhlbWJvdXJnaXNoIChsYilcbi8vIGF1dGhvciA6IG13ZWltZXJza2lyY2ggOiBodHRwczovL2dpdGh1Yi5jb20vbXdlaW1lcnNraXJjaCwgRGF2aWQgUmFpc29uIDogaHR0cHM6Ly9naXRodWIuY29tL2t3aXNhdHpcblxuLy8gTm90ZTogTHV4ZW1ib3VyZ2lzaCBoYXMgYSB2ZXJ5IHBhcnRpY3VsYXIgcGhvbm9sb2dpY2FsIHJ1bGUgKCdFaWZlbGVyIFJlZ2VsJykgdGhhdCBjYXVzZXMgdGhlXG4vLyBkZWxldGlvbiBvZiB0aGUgZmluYWwgJ24nIGluIGNlcnRhaW4gY29udGV4dHMuIFRoYXQncyB3aGF0IHRoZSAnZWlmZWxlclJlZ2VsQXBwbGllc1RvV2Vla2RheSdcbi8vIGFuZCAnZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyJyBtZXRob2RzIGFyZSBtZWFudCBmb3JcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICdtJzogWydlbmcgTWludXR0JywgJ2VuZ2VyIE1pbnV0dCddLFxuICAgICAgICAgICAgJ2gnOiBbJ2VuZyBTdG9ubicsICdlbmdlciBTdG9ubiddLFxuICAgICAgICAgICAgJ2QnOiBbJ2VlbiBEYWcnLCAnZW5nZW0gRGFnJ10sXG4gICAgICAgICAgICAnTSc6IFsnZWUgTW91bnQnLCAnZW5nZW0gTW91bnQnXSxcbiAgICAgICAgICAgICd5JzogWydlZSBKb2VyJywgJ2VuZ2VtIEpvZXInXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0Z1dHVyZVRpbWUoc3RyaW5nKSB7XG4gICAgICAgIHZhciBudW1iZXIgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKCcgJykpO1xuICAgICAgICBpZiAoZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiAnYSAnICsgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnYW4gJyArIHN0cmluZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUGFzdFRpbWUoc3RyaW5nKSB7XG4gICAgICAgIHZhciBudW1iZXIgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKCcgJykpO1xuICAgICAgICBpZiAoZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiAndmlydSAnICsgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAndmlydW4gJyArIHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdvcmQgYmVmb3JlIHRoZSBnaXZlbiBudW1iZXIgbG9zZXMgdGhlICctbicgZW5kaW5nLlxuICAgICAqIGUuZy4gJ2FuIDEwIERlZWcnIGJ1dCAnYSA1IERlZWcnXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbnVtYmVyIHtpbnRlZ2VyfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpIHtcbiAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIE51bWJlciAtLT4gYWx3YXlzIHRydWVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwKSB7XG4gICAgICAgICAgICAvLyBPbmx5IDEgZGlnaXRcbiAgICAgICAgICAgIGlmICg0IDw9IG51bWJlciAmJiBudW1iZXIgPD0gNykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwMCkge1xuICAgICAgICAgICAgLy8gMiBkaWdpdHNcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCwgZmlyc3REaWdpdCA9IG51bWJlciAvIDEwO1xuICAgICAgICAgICAgaWYgKGxhc3REaWdpdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIoZmlyc3REaWdpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKGxhc3REaWdpdCk7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTAwMDApIHtcbiAgICAgICAgICAgIC8vIDMgb3IgNCBkaWdpdHMgLS0+IHJlY3Vyc2l2ZWx5IGNoZWNrIGZpcnN0IGRpZ2l0XG4gICAgICAgICAgICB3aGlsZSAobnVtYmVyID49IDEwKSB7XG4gICAgICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbnl0aGluZyBsYXJnZXIgdGhhbiA0IGRpZ2l0czogcmVjdXJzaXZlbHkgY2hlY2sgZmlyc3Qgbi0zIGRpZ2l0c1xuICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTAwMDtcbiAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdsYicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZlYnJ1YXJfTcOkZXJ6X0FicsOrbGxfTWVlX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuLl9GZWJyLl9NcnouX0Fici5fTWVlX0p1bi5fSnVsLl9BdWcuX1NlcHQuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1Nvbm5kZWdfTcOpaW5kZWdfRMOrbnNjaGRlZ19Nw6t0dHdvY2hfRG9ubmVzY2hkZWdfRnJlaWRlZ19TYW1zY2hkZWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTcOpLl9Ew6suX03Dqy5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTcOpX0TDq19Nw6tfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0gW0F1ZXJdJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MgW0F1ZXJdJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXV0IHVtXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNdWVyIHVtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0fDq3NjaHRlciB1bV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgZGF0ZSBzdHJpbmcgZm9yICdEw6tuc2NoZGVnJyAoVHVlc2RheSkgYW5kICdEb25uZXNjaGRlZycgKFRodXJzZGF5KSBkdWUgdG8gcGhvbm9sb2dpY2FsIHJ1bGVcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tMZXNjaHRlbl0gZGRkZCBbdW1dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW0xlc2NodGVdIGRkZGQgW3VtXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiBwcm9jZXNzRnV0dXJlVGltZSxcbiAgICAgICAgICAgIHBhc3QgOiBwcm9jZXNzUGFzdFRpbWUsXG4gICAgICAgICAgICBzIDogJ2UgcHVlciBTZWtvbm5lbicsXG4gICAgICAgICAgICBtIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tIDogJyVkIE1pbnV0dGVuJyxcbiAgICAgICAgICAgIGggOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGggOiAnJWQgU3Rvbm5lbicsXG4gICAgICAgICAgICBkIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkIDogJyVkIERlZWcnLFxuICAgICAgICAgICAgTSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTSA6ICclZCBNw6lpbnQnLFxuICAgICAgICAgICAgeSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eSA6ICclZCBKb2VyJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogTGl0aHVhbmlhbiAobHQpXG4vLyBhdXRob3IgOiBNaW5kYXVnYXMgTW96xatyYXMgOiBodHRwczovL2dpdGh1Yi5jb20vbW1venVyYXNcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgdmFyIHVuaXRzID0ge1xuICAgICAgICAnbScgOiAnbWludXTEl19taW51dMSXc19taW51dMSZJyxcbiAgICAgICAgJ21tJzogJ21pbnV0xJdzX21pbnXEjWnFs19taW51dGVzJyxcbiAgICAgICAgJ2gnIDogJ3ZhbGFuZGFfdmFsYW5kb3NfdmFsYW5kxIUnLFxuICAgICAgICAnaGgnOiAndmFsYW5kb3NfdmFsYW5kxbNfdmFsYW5kYXMnLFxuICAgICAgICAnZCcgOiAnZGllbmFfZGllbm9zX2RpZW7EhScsXG4gICAgICAgICdkZCc6ICdkaWVub3NfZGllbsWzX2RpZW5hcycsXG4gICAgICAgICdNJyA6ICdtxJdudW9fbcSXbmVzaW9fbcSXbmVzxK8nLFxuICAgICAgICAnTU0nOiAnbcSXbmVzaWFpX23El25lc2nFs19txJduZXNpdXMnLFxuICAgICAgICAneScgOiAnbWV0YWlfbWV0xbNfbWV0dXMnLFxuICAgICAgICAneXknOiAnbWV0YWlfbWV0xbNfbWV0dXMnXG4gICAgfSxcbiAgICB3ZWVrRGF5cyA9ICdzZWttYWRpZW5pc19waXJtYWRpZW5pc19hbnRyYWRpZW5pc190cmXEjWlhZGllbmlzX2tldHZpcnRhZGllbmlzX3Blbmt0YWRpZW5pc1/FoWXFoXRhZGllbmlzJy5zcGxpdCgnXycpO1xuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2Vjb25kcyhudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiAna2VsaW9zIHNla3VuZMSXcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAna2VsacWzIHNla3VuZMW+acWzJyA6ICdrZWxpYXMgc2VrdW5kZXMnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybXMoa2V5KVswXSA6IChpc0Z1dHVyZSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzJdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcGVjaWFsKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDAgfHwgKG51bWJlciA+IDEwICYmIG51bWJlciA8IDIwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIHVuaXRzW2tleV0uc3BsaXQoJ18nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyB0cmFuc2xhdGVTaW5ndWxhcihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleVswXSwgaXNGdXR1cmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoc3BlY2lhbChudW1iZXIpID8gZm9ybXMoa2V5KVsxXSA6IGZvcm1zKGtleSlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIGZvcm1zKGtleSlbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoc3BlY2lhbChudW1iZXIpID8gZm9ybXMoa2V5KVsxXSA6IGZvcm1zKGtleSlbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVXZWVrRGF5KG1vbWVudCwgZm9ybWF0KSB7XG4gICAgICAgIHZhciBub21pbmF0aXZlID0gZm9ybWF0LmluZGV4T2YoJ2RkZGQgSEg6bW0nKSA9PT0gLTEsXG4gICAgICAgICAgICB3ZWVrRGF5ID0gd2Vla0RheXNbbW9tZW50LmRheSgpXTtcblxuICAgICAgICByZXR1cm4gbm9taW5hdGl2ZSA/IHdlZWtEYXkgOiB3ZWVrRGF5LnN1YnN0cmluZygwLCB3ZWVrRGF5Lmxlbmd0aCAtIDIpICsgJ8SvJztcbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnbHQnLCB7XG4gICAgICAgIG1vbnRocyA6ICdzYXVzaW9fdmFzYXJpb19rb3ZvX2JhbGFuZMW+aW9fZ2VndcW+xJdzX2JpcsW+ZWxpb19saWVwb3NfcnVncGrFq8SNaW9fcnVnc8SXam9fc3BhbGlvX2xhcGtyacSNaW9fZ3J1b2TFvmlvJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdzYXVfdmFzX2tvdl9iYWxfZ2VnX2Jpcl9saWVfcmdwX3Jnc19zcGFfbGFwX2dyZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiByZWxhdGl2ZVdlZWtEYXksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnU2VrX1Bpcl9BbnRfVHJlX0tldF9QZW5fxaBlxaEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1NfUF9BX1RfS19Qbl/FoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXScsXG4gICAgICAgICAgICBMTEwgOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBMVCBbdmFsLl0nLFxuICAgICAgICAgICAgTExMTCA6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIGRkZGQsIExUIFt2YWwuXScsXG4gICAgICAgICAgICBsIDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgbGwgOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dJyxcbiAgICAgICAgICAgIGxsbCA6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIExUIFt2YWwuXScsXG4gICAgICAgICAgICBsbGxsIDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgZGRkLCBMVCBbdmFsLl0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbxaBpYW5kaWVuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tSeXRval0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tWYWthcl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW1ByYcSXanVzxK9dIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3BvICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAncHJpZcWhICVzJyxcbiAgICAgICAgICAgIHMgOiB0cmFuc2xhdGVTZWNvbmRzLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgbW0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoIDogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIGRkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTSA6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgTU0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5IDogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS1vamkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICctb2ppJztcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGxhdHZpYW4gKGx2KVxuLy8gYXV0aG9yIDogS3Jpc3RhcHMgS2FybHNvbnMgOiBodHRwczovL2dpdGh1Yi5jb20vc2tha3JpXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciB1bml0cyA9IHtcbiAgICAgICAgJ21tJzogJ21pbsWrdGlfbWluxat0ZXNfbWluxat0ZV9taW7Fq3RlcycsXG4gICAgICAgICdoaCc6ICdzdHVuZHVfc3R1bmRhc19zdHVuZGFfc3R1bmRhcycsXG4gICAgICAgICdkZCc6ICdkaWVudV9kaWVuYXNfZGllbmFfZGllbmFzJyxcbiAgICAgICAgJ01NJzogJ23Ek25lc2lfbcSTbmXFoXVzX23Ek25lc2lzX23Ek25lxaFpJyxcbiAgICAgICAgJ3l5JzogJ2dhZHVfZ2FkdXNfZ2Fkc19nYWRpJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQod29yZCwgbnVtYmVyLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSAmJiBudW1iZXIgIT09IDExID8gZm9ybXNbMl0gOiBmb3Jtc1szXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSAmJiBudW1iZXIgIT09IDExID8gZm9ybXNbMF0gOiBmb3Jtc1sxXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIGZvcm1hdCh1bml0c1trZXldLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdsdicsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnbEgXJpc19mZWJydcSBcmlzX21hcnRzX2FwcsSrbGlzX21haWpzX2rFq25panNfasWrbGlqc19hdWd1c3RzX3NlcHRlbWJyaXNfb2t0b2JyaXNfbm92ZW1icmlzX2RlY2VtYnJpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnamFuX2ZlYl9tYXJfYXByX21haV9qxatuX2rFq2xfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc3bEk3RkaWVuYV9waXJtZGllbmFfb3RyZGllbmFfdHJlxaFkaWVuYV9jZXR1cnRkaWVuYV9waWVrdGRpZW5hX3Nlc3RkaWVuYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdl9QX09fVF9DX1BrX1MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N2X1BfT19UX0NfUGtfUycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NJyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgZGRkZCwgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbxaBvZGllbiBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbUsSrdCBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW1Zha2FyIHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbUGFnxIFqdcWhxIFdIGRkZGQgW3B1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMgdsSTbMSBaycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGFncsSBaycsXG4gICAgICAgICAgICBzIDogJ2Rhxb5hcyBzZWt1bmRlcycsXG4gICAgICAgICAgICBtIDogJ21pbsWrdGknLFxuICAgICAgICAgICAgbW0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaCA6ICdzdHVuZHUnLFxuICAgICAgICAgICAgaGggOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZCA6ICdkaWVudScsXG4gICAgICAgICAgICBkZCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNIDogJ23Ek25lc2knLFxuICAgICAgICAgICAgTU0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeSA6ICdnYWR1JyxcbiAgICAgICAgICAgIHl5IDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbFxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IG1hY2Vkb25pYW4gKG1rKVxuLy8gYXV0aG9yIDogQm9yaXNsYXYgTWlja292IDogaHR0cHM6Ly9naXRodWIuY29tL0IwazBcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ21rJywge1xuICAgICAgICBtb250aHMgOiAn0ZjQsNC90YPQsNGA0Lhf0YTQtdCy0YDRg9Cw0YDQuF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDRmF/RmNGD0L3QuF/RmNGD0LvQuF/QsNCy0LPRg9GB0YJf0YHQtdC/0YLQtdC80LLRgNC4X9C+0LrRgtC+0LzQstGA0Lhf0L3QvtC10LzQstGA0Lhf0LTQtdC60LXQvNCy0YDQuCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn0ZjQsNC9X9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQs1/RgdC10L9f0L7QutGCX9C90L7QtV/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9C90LXQtNC10LvQsF/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNCwX9GH0LXRgtCy0YDRgtC+0Lpf0L/QtdGC0L7Qul/RgdCw0LHQvtGC0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0L3QtdC0X9C/0L7QvV/QstGC0L5f0YHRgNC1X9GH0LXRgl/Qv9C10YJf0YHQsNCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfQvWVf0L9vX9Cy0YJf0YHRgF/Rh9C1X9C/0LVf0YFhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnRC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9CU0LXQvdC10YEg0LLQvl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb0KPRgtGA0LUg0LLQvl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBb0LLQvl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb0JLRh9C10YDQsCDQstC+XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JLQviDQuNC30LzQuNC90LDRgtCw0YLQsF0gZGRkZCBb0LLQvl0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JLQviDQuNC30LzQuNC90LDRgtC40L7Rgl0gZGRkZCBb0LLQvl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAn0L/QvtGB0LvQtSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ9C/0YDQtdC0ICVzJyxcbiAgICAgICAgICAgIHMgOiAn0L3QtdC60L7Qu9C60YMg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgbSA6ICfQvNC40L3Rg9GC0LAnLFxuICAgICAgICAgICAgbW0gOiAnJWQg0LzQuNC90YPRgtC4JyxcbiAgICAgICAgICAgIGggOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoIDogJyVkINGH0LDRgdCwJyxcbiAgICAgICAgICAgIGQgOiAn0LTQtdC9JyxcbiAgICAgICAgICAgIGRkIDogJyVkINC00LXQvdCwJyxcbiAgICAgICAgICAgIE0gOiAn0LzQtdGB0LXRhicsXG4gICAgICAgICAgICBNTSA6ICclZCDQvNC10YHQtdGG0LgnLFxuICAgICAgICAgICAgeSA6ICfQs9C+0LTQuNC90LAnLFxuICAgICAgICAgICAgeXkgOiAnJWQg0LPQvtC00LjQvdC4J1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0LXQsnzQtdC9fNGC0Lh80LLQuHzRgNC4fNC80LgpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBsYXN0MkRpZ2l0cyA9IG51bWJlciAlIDEwMDtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdCyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdC9JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPiAxMCAmJiBsYXN0MkRpZ2l0cyA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCy0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgNC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA3IHx8IGxhc3REaWdpdCA9PT0gOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC80LgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IG1hbGF5YWxhbSAobWwpXG4vLyBhdXRob3IgOiBGbG95ZCBQaW5rIDogaHR0cHM6Ly9naXRodWIuY29tL2Zsb3lkcGlua1xuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnbWwnLCB7XG4gICAgICAgIG1vbnRocyA6ICfgtJzgtKjgtYHgtLXgtLDgtL9f4LSr4LWG4LSs4LWN4LSw4LWB4LS14LSw4LS/X+C0ruC0vuC1vOC0muC1jeC0muC1jV/gtI/gtKrgtY3gtLDgtL/gtb1f4LSu4LWH4LSv4LWNX+C0nOC1guC1ul/gtJzgtYLgtLLgtYhf4LST4LSX4LS44LWN4LSx4LWN4LSx4LWNX+C0uOC1huC0quC1jeC0seC1jeC0seC0guC0rOC1vF/gtJLgtJXgtY3gtJ/gtYvgtKzgtbxf4LSo4LS14LSC4LSs4LW8X+C0oeC0v+C0uOC0guC0rOC1vCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4LSc4LSo4LWBLl/gtKvgtYbgtKzgtY3gtLDgtYEuX+C0ruC0vuC1vC5f4LSP4LSq4LWN4LSw4LS/Ll/gtK7gtYfgtK/gtY1f4LSc4LWC4LW6X+C0nOC1guC0suC1iC5f4LST4LSXLl/gtLjgtYbgtKrgtY3gtLHgtY3gtLEuX+C0kuC0leC1jeC0n+C1iy5f4LSo4LS14LSCLl/gtKHgtL/gtLjgtIIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfgtJ7gtL7gtK/gtLHgtL7gtLTgtY3gtJpf4LSk4LS/4LSZ4LWN4LSV4LSz4LS+4LS04LWN4LSaX+C0muC1iuC0teC1jeC0teC0vuC0tOC1jeC0ml/gtKzgtYHgtKfgtKjgtL7gtLTgtY3gtJpf4LS14LWN4LSv4LS+4LS04LS+4LS04LWN4LSaX+C0teC1huC0s+C1jeC0s+C0v+C0r+C0vuC0tOC1jeC0ml/gtLbgtKjgtL/gtK/gtL7gtLTgtY3gtJonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn4LSe4LS+4LSv4LW8X+C0pOC0v+C0meC1jeC0leC1vl/gtJrgtYrgtLXgtY3gtLVf4LSs4LWB4LSn4LW7X+C0teC1jeC0r+C0vuC0tOC0gl/gtLXgtYbgtLPgtY3gtLPgtL9f4LS24LSo4LS/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfgtJ7gtL5f4LSk4LS/X+C0muC1il/gtKzgtYFf4LS14LWN4LSv4LS+X+C0teC1hl/gtLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnQSBoOm1tIC3gtKjgtYEnLFxuICAgICAgICAgICAgTFRTIDogJ0EgaDptbTpzcyAt4LSo4LWBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+C0h+C0qOC1jeC0qOC1jV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4LSo4LS+4LSz4LWGXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgtIfgtKjgtY3gtKjgtLLgtYZdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgtJXgtLTgtL/gtJ7gtY3gtJ5dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDgtJXgtLTgtL/gtJ7gtY3gtJ7gtY0nLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDgtK7gtYHgtbvgtKrgtY0nLFxuICAgICAgICAgICAgcyA6ICfgtIXgtb3gtKog4LSo4LS/4LSu4LS/4LS34LSZ4LWN4LSZ4LW+JyxcbiAgICAgICAgICAgIG0gOiAn4LSS4LSw4LWBIOC0ruC0v+C0qOC0v+C0seC1jeC0seC1jScsXG4gICAgICAgICAgICBtbSA6ICclZCDgtK7gtL/gtKjgtL/gtLHgtY3gtLHgtY0nLFxuICAgICAgICAgICAgaCA6ICfgtJLgtLDgtYEg4LSu4LSj4LS/4LSV4LWN4LSV4LWC4LW8JyxcbiAgICAgICAgICAgIGhoIDogJyVkIOC0ruC0o+C0v+C0leC1jeC0leC1guC1vCcsXG4gICAgICAgICAgICBkIDogJ+C0kuC0sOC1gSDgtKbgtL/gtLXgtLjgtIInLFxuICAgICAgICAgICAgZGQgOiAnJWQg4LSm4LS/4LS14LS44LSCJyxcbiAgICAgICAgICAgIE0gOiAn4LSS4LSw4LWBIOC0ruC0vuC0uOC0gicsXG4gICAgICAgICAgICBNTSA6ICclZCDgtK7gtL7gtLjgtIInLFxuICAgICAgICAgICAgeSA6ICfgtJLgtLDgtYEg4LS14LW84LS34LSCJyxcbiAgICAgICAgICAgIHl5IDogJyVkIOC0teC1vOC0t+C0gidcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C0sOC0vuC0pOC1jeC0sOC0v3zgtLDgtL7gtLXgtL/gtLLgtYZ84LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jXzgtLXgtYjgtJXgtYHgtKjgtY3gtKjgtYfgtLDgtIJ84LSw4LS+4LSk4LWN4LSw4LS/L2ksXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNfOC0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gnzgtLDgtL7gtKTgtY3gtLDgtL8pJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtKTgtY3gtLDgtL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0sOC0vuC0teC0v+C0suC1hic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LS14LWI4LSV4LWB4LSo4LWN4LSo4LWH4LSw4LSCJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtKTgtY3gtLDgtL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IE1hcmF0aGkgKG1yKVxuLy8gYXV0aG9yIDogSGFyc2hhZCBLYWxlIDogaHR0cHM6Ly9naXRodWIuY29tL2thbGVodlxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfgpacnLFxuICAgICAgICAnMic6ICfgpagnLFxuICAgICAgICAnMyc6ICfgpaknLFxuICAgICAgICAnNCc6ICfgpaonLFxuICAgICAgICAnNSc6ICfgpasnLFxuICAgICAgICAnNic6ICfgpawnLFxuICAgICAgICAnNyc6ICfgpa0nLFxuICAgICAgICAnOCc6ICfgpa4nLFxuICAgICAgICAnOSc6ICfgpa8nLFxuICAgICAgICAnMCc6ICfgpaYnXG4gICAgfSxcbiAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICfgpacnOiAnMScsXG4gICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICfgpaonOiAnNCcsXG4gICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICfgpa0nOiAnNycsXG4gICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICfgpaYnOiAnMCdcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ21yJywge1xuICAgICAgICBtb250aHMgOiAn4KSc4KS+4KSo4KWH4KS14KS+4KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCkvuCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSP4KSq4KWN4KSw4KS/4KSyX+CkruClh1/gpJzgpYLgpKhf4KSc4KWB4KSy4KWIX+CkkeCkl+CkuOCljeCkn1/gpLjgpKrgpY3gpJ/gpYfgpILgpKzgpLBf4KSR4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkteCljeCkueClh+CkguCkrOCksF/gpKHgpL/gpLjgpYfgpILgpKzgpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4KSc4KS+4KSo4KWHLl/gpKvgpYfgpKzgpY3gpLDgpYEuX+CkruCkvuCksOCljeCkmi5f4KSP4KSq4KWN4KSw4KS/Ll/gpK7gpYcuX+CknOClguCkqC5f4KSc4KWB4KSy4KWILl/gpJHgpJcuX+CkuOCkquCljeCkn+Clh+Ckgi5f4KSR4KSV4KWN4KSf4KWLLl/gpKjgpYvgpLXgpY3gpLngpYfgpIIuX+CkoeCkv+CkuOClh+Ckgi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+CksOCkteCkv+CkteCkvuCksF/gpLjgpYvgpK7gpLXgpL7gpLBf4KSu4KSC4KSX4KSz4KS14KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpJfgpYHgpLDgpYLgpLXgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KS14KS+4KSwX+CktuCkqOCkv+CkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfgpLDgpLXgpL9f4KS44KWL4KSuX+CkruCkguCkl+Cks1/gpKzgpYHgpKdf4KSX4KWB4KSw4KWCX+CktuClgeCkleCljeCksF/gpLbgpKjgpL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+CksF/gpLjgpYtf4KSu4KSCX+CkrOClgV/gpJfgpYFf4KS24KWBX+Ckticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdBIGg6bW0g4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgICAgIExUUyA6ICdBIGg6bW06c3Mg4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4KSJ4KSm4KWN4KSv4KS+XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgpJXgpL7gpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CkruCkvuCkl+ClgOCksl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIOCkqOCkguCkpOCksCcsXG4gICAgICAgICAgICBwYXN0IDogJyVzIOCkquClguCksOCljeCkteClgCcsXG4gICAgICAgICAgICBzIDogJ+CkuOClh+CkleCkguCkpicsXG4gICAgICAgICAgICBtOiAn4KSP4KSVIOCkruCkv+CkqOCkv+CknycsXG4gICAgICAgICAgICBtbTogJyVkIOCkruCkv+CkqOCkv+Ckn+ClhycsXG4gICAgICAgICAgICBoIDogJ+Ckj+CklSDgpKTgpL7gpLgnLFxuICAgICAgICAgICAgaGggOiAnJWQg4KSk4KS+4KS4JyxcbiAgICAgICAgICAgIGQgOiAn4KSP4KSVIOCkpuCkv+CkteCkuCcsXG4gICAgICAgICAgICBkZCA6ICclZCDgpKbgpL/gpLXgpLgnLFxuICAgICAgICAgICAgTSA6ICfgpI/gpJUg4KSu4KS54KS/4KSo4KS+JyxcbiAgICAgICAgICAgIE1NIDogJyVkIOCkruCkueCkv+CkqOClhycsXG4gICAgICAgICAgICB5IDogJ+Ckj+CklSDgpLXgpLDgpY3gpLcnLFxuICAgICAgICAgICAgeXkgOiAnJWQg4KS14KSw4KWN4KS34KWHJ1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSk4KWN4KSw4KWAfOCkuOCkleCkvuCks+ClgHzgpKbgpYHgpKrgpL7gpLDgpYB84KS44KS+4KSv4KSC4KSV4KS+4KSz4KWALyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOCljeCksOClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkleCkvuCks+ClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpYHgpKrgpL7gpLDgpYAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkr+CkguCkleCkvuCks+ClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcilcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpY3gpLDgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkleCkvuCks+ClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KWB4KSq4KS+4KSw4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCljeCksOClgCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBCYWhhc2EgTWFsYXlzaWEgKG1zLU1ZKVxuLy8gYXV0aG9yIDogV2VsZGFuIEphbWlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS93ZWxkYW5cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ21zLW15Jywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyaV9GZWJydWFyaV9NYWNfQXByaWxfTWVpX0p1bl9KdWxhaV9PZ29zX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rpc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfT2dzX1NlcF9Pa3RfTm92X0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnQWhhZF9Jc25pbl9TZWxhc2FfUmFidV9LaGFtaXNfSnVtYWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0FoZF9Jc25fU2VsX1JhYl9LaGFfSnVtX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnQWhfSXNfU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xULnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gTFQnXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHRlbmdhaGFyaXxwZXRhbmd8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3RlbmdhaGFyaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAncGV0YW5nJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RlbmdhaGFyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BldGFuZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tFc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbS2VsbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ2RkZGQgW2xlcGFzIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyB5YW5nIGxlcGFzJyxcbiAgICAgICAgICAgIHMgOiAnYmViZXJhcGEgc2FhdCcsXG4gICAgICAgICAgICBtIDogJ3NlbWluaXQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWluaXQnLFxuICAgICAgICAgICAgaCA6ICdzZWphbScsXG4gICAgICAgICAgICBoaCA6ICclZCBqYW0nLFxuICAgICAgICAgICAgZCA6ICdzZWhhcmknLFxuICAgICAgICAgICAgZGQgOiAnJWQgaGFyaScsXG4gICAgICAgICAgICBNIDogJ3NlYnVsYW4nLFxuICAgICAgICAgICAgTU0gOiAnJWQgYnVsYW4nLFxuICAgICAgICAgICAgeSA6ICdzZXRhaHVuJyxcbiAgICAgICAgICAgIHl5IDogJyVkIHRhaHVuJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogQnVybWVzZSAobXkpXG4vLyBhdXRob3IgOiBTcXVhciB0ZWFtLCBteXNxdWFyLmNvbVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfhgYEnLFxuICAgICAgICAnMic6ICfhgYInLFxuICAgICAgICAnMyc6ICfhgYMnLFxuICAgICAgICAnNCc6ICfhgYQnLFxuICAgICAgICAnNSc6ICfhgYUnLFxuICAgICAgICAnNic6ICfhgYYnLFxuICAgICAgICAnNyc6ICfhgYcnLFxuICAgICAgICAnOCc6ICfhgYgnLFxuICAgICAgICAnOSc6ICfhgYknLFxuICAgICAgICAnMCc6ICfhgYAnXG4gICAgfSwgbnVtYmVyTWFwID0ge1xuICAgICAgICAn4YGBJzogJzEnLFxuICAgICAgICAn4YGCJzogJzInLFxuICAgICAgICAn4YGDJzogJzMnLFxuICAgICAgICAn4YGEJzogJzQnLFxuICAgICAgICAn4YGFJzogJzUnLFxuICAgICAgICAn4YGGJzogJzYnLFxuICAgICAgICAn4YGHJzogJzcnLFxuICAgICAgICAn4YGIJzogJzgnLFxuICAgICAgICAn4YGJJzogJzknLFxuICAgICAgICAn4YGAJzogJzAnXG4gICAgfTtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnbXknLCB7XG4gICAgICAgIG1vbnRoczogJ+GAh+GAlOGAuuGAlOGAneGAq+GAm+GArl/hgJbhgLHhgJbhgLHhgKzhgLrhgJ3hgKvhgJvhgK5f4YCZ4YCQ4YC6X+GAp+GAleGAvOGArl/hgJnhgLFf4YCH4YC94YCU4YC6X+GAh+GAsOGAnOGAreGAr+GAhOGAul/hgJ7hgLzhgILhgK/hgJDhgLpf4YCF4YCA4YC64YCQ4YCE4YC64YCY4YCsX+GAoeGAseGArOGAgOGAuuGAkOGAreGAr+GAmOGArF/hgJThgK3hgK/hgJ3hgIThgLrhgJjhgKxf4YCS4YCu4YCH4YCE4YC64YCY4YCsJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJ+GAh+GAlOGAul/hgJbhgLFf4YCZ4YCQ4YC6X+GAleGAvOGArl/hgJnhgLFf4YCH4YC94YCU4YC6X+GAnOGAreGAr+GAhOGAul/hgJ7hgLxf4YCF4YCA4YC6X+GAoeGAseGArOGAgOGAul/hgJThgK3hgK9f4YCS4YCuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ+GAkOGAlOGAhOGAuuGAueGAguGAlOGAveGAsV/hgJDhgJThgIThgLrhgLnhgJzhgKxf4YCh4YCE4YC64YC54YCC4YCrX+GAl+GAr+GAkuGAueGAk+GAn+GAsOGAuF/hgIDhgLzhgKzhgJ7hgJXhgJDhgLHhgLhf4YCe4YCx4YCs4YCA4YC84YCsX+GAheGAlOGAsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+GAlOGAveGAsV/hgJzhgKxf4YCE4YC64YC54YCC4YCrX+GAn+GAsOGAuF/hgIDhgLzhgKxf4YCe4YCx4YCsX+GAlOGAsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfhgJThgL3hgLFf4YCc4YCsX+GAhOGAuuGAueGAguGAq1/hgJ/hgLDhgLhf4YCA4YC84YCsX+GAnuGAseGArF/hgJThgLEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GAmuGAlOGAsS5dIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4YCZ4YCU4YCA4YC64YCW4YC84YCU4YC6XSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vhgJnhgJThgLEu4YCAXSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vhgJXhgLzhgK7hgLjhgIHhgLLhgLfhgJ7hgLHhgKxdIGRkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+GAnOGArOGAmeGAiuGAuuGAtyAlcyDhgJnhgL7hgKwnLFxuICAgICAgICAgICAgcGFzdDogJ+GAnOGAveGAlOGAuuGAgeGAsuGAt+GAnuGAseGArCAlcyDhgIAnLFxuICAgICAgICAgICAgczogJ+GAheGAgOGAueGAgOGAlOGAui7hgKHhgJThgIrhgLrhgLjhgIThgJrhgLonLFxuICAgICAgICAgICAgbTogJ+GAkOGAheGAuuGAmeGAreGAlOGAheGAuicsXG4gICAgICAgICAgICBtbTogJyVkIOGAmeGAreGAlOGAheGAuicsXG4gICAgICAgICAgICBoOiAn4YCQ4YCF4YC64YCU4YCs4YCb4YCuJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4YCU4YCs4YCb4YCuJyxcbiAgICAgICAgICAgIGQ6ICfhgJDhgIXhgLrhgJvhgIDhgLonLFxuICAgICAgICAgICAgZGQ6ICclZCDhgJvhgIDhgLonLFxuICAgICAgICAgICAgTTogJ+GAkOGAheGAuuGAnCcsXG4gICAgICAgICAgICBNTTogJyVkIOGAnCcsXG4gICAgICAgICAgICB5OiAn4YCQ4YCF4YC64YCU4YC+4YCF4YC6JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4YCU4YC+4YCF4YC6J1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4YGB4YGC4YGD4YGE4YGF4YGG4YGH4YGI4YGJ4YGAXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0IC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBub3J3ZWdpYW4gYm9rbcOlbCAobmIpXG4vLyBhdXRob3JzIDogRXNwZW4gSG92bGFuZHNkYWwgOiBodHRwczovL2dpdGh1Yi5jb20vcmV4eGFyc1xuLy8gICAgICAgICAgIFNpZ3VyZCBHYXJ0bWFubiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaWd1cmRnYVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnbmInLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcmlsX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW5fZmViX21hcl9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc8O4bmRhZ19tYW5kYWdfdGlyc2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbMO4cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdzw7huX21hbl90aXJzX29uc190b3JzX2ZyZV9sw7hyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdzw7hfbWFfdGlfb25fdG9fZnJfbMO4Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0gubW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xULnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QuIE1NTU0gWVlZWSBba2wuXSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRC4gTU1NTSBZWVlZIFtrbC5dIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2kgbW9yZ2VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaSBnw6VyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9ycmlnZV0gZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2ZvciAlcyBzaWRlbicsXG4gICAgICAgICAgICBzIDogJ25vZW4gc2VrdW5kZXInLFxuICAgICAgICAgICAgbSA6ICdldHQgbWludXR0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0dGVyJyxcbiAgICAgICAgICAgIGggOiAnZW4gdGltZScsXG4gICAgICAgICAgICBoaCA6ICclZCB0aW1lcicsXG4gICAgICAgICAgICBkIDogJ2VuIGRhZycsXG4gICAgICAgICAgICBkZCA6ICclZCBkYWdlcicsXG4gICAgICAgICAgICBNIDogJ2VuIG3DpW5lZCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtw6VuZWRlcicsXG4gICAgICAgICAgICB5IDogJ2V0dCDDpXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgw6VyJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IG5lcGFsaS9uZXBhbGVzZVxuLy8gYXV0aG9yIDogc3V2YXNoIDogaHR0cHM6Ly9naXRodWIuY29tL3N1dmFzaFxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfgpacnLFxuICAgICAgICAnMic6ICfgpagnLFxuICAgICAgICAnMyc6ICfgpaknLFxuICAgICAgICAnNCc6ICfgpaonLFxuICAgICAgICAnNSc6ICfgpasnLFxuICAgICAgICAnNic6ICfgpawnLFxuICAgICAgICAnNyc6ICfgpa0nLFxuICAgICAgICAnOCc6ICfgpa4nLFxuICAgICAgICAnOSc6ICfgpa8nLFxuICAgICAgICAnMCc6ICfgpaYnXG4gICAgfSxcbiAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICfgpacnOiAnMScsXG4gICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICfgpaonOiAnNCcsXG4gICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICfgpa0nOiAnNycsXG4gICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICfgpaYnOiAnMCdcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ25lJywge1xuICAgICAgICBtb250aHMgOiAn4KSc4KSo4KS14KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KS/4KSyX+CkruCkiF/gpJzgpYHgpKhf4KSc4KWB4KSy4KS+4KSIX+CkheCkl+Ckt+CljeCkn1/gpLjgpYfgpKrgpY3gpJ/gpYfgpK7gpY3gpKzgpLBf4KSF4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkreClh+CkruCljeCkrOCksF/gpKHgpL/gpLjgpYfgpK7gpY3gpKzgpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ+CknOCkqC5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KS/Ll/gpK7gpIhf4KSc4KWB4KSoX+CknOClgeCksuCkvuCkiC5f4KSF4KSXLl/gpLjgpYfgpKrgpY3gpJ8uX+CkheCkleCljeCkn+Cliy5f4KSo4KWL4KSt4KWHLl/gpKHgpL/gpLjgpYcuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfgpIbgpIfgpKTgpKzgpL7gpLBf4KS44KWL4KSu4KSs4KS+4KSwX+CkruCkmeCljeCkl+CksuCkrOCkvuCksF/gpKzgpYHgpKfgpKzgpL7gpLBf4KSs4KS/4KS54KS/4KSs4KS+4KSwX+CktuClgeCkleCljeCksOCkrOCkvuCksF/gpLbgpKjgpL/gpKzgpL7gpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn4KSG4KSH4KSkLl/gpLjgpYvgpK4uX+CkruCkmeCljeCkl+Cksi5f4KSs4KWB4KSnLl/gpKzgpL/gpLngpL8uX+CktuClgeCkleCljeCksC5f4KS24KSo4KS/Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4KSG4KSHLl/gpLjgpYsuX+CkruCkmeCljV/gpKzgpYEuX+CkrOCkvy5f4KS24KWBLl/gpLYuJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0HgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTFRTIDogJ0HgpJXgpYsgaDptbTpzcyDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSwgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSwgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKTgpYB84KSs4KS/4KS54KS+4KSofOCkpuCkv+CkieCkgeCkuOCli3zgpKzgpYfgpLLgpYHgpJXgpL584KS44KS+4KSB4KSdfOCksOCkvuCkpOClgC8sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKTgpYAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAzID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKzgpL/gpLngpL7gpKgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KS/4KSJ4KSB4KS44KWLJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKzgpYfgpLLgpYHgpJXgpL4nIHx8IG1lcmlkaWVtID09PSAn4KS44KS+4KSB4KSdJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkrOCkv+CkueCkvuCkqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KS/4KSJ4KSB4KS44KWLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKzgpYfgpLLgpYHgpJXgpL4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkvuCkgeCknSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KWAJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vgpIbgpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+CkreCli+CksuClgF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnW+CkhuCkieCkgeCkpuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgpLngpL/gpJzgpYtdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgpJfgpI/gpJXgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVz4KSu4KS+JyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg4KSF4KSX4KS+4KSh4KWAJyxcbiAgICAgICAgICAgIHMgOiAn4KSV4KWH4KS54KWAIOCkuOCkruCkrycsXG4gICAgICAgICAgICBtIDogJ+Ckj+CklSDgpK7gpL/gpKjgpYfgpJ8nLFxuICAgICAgICAgICAgbW0gOiAnJWQg4KSu4KS/4KSo4KWH4KSfJyxcbiAgICAgICAgICAgIGggOiAn4KSP4KSVIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBoaCA6ICclZCDgpJjgpKPgpY3gpJ/gpL4nLFxuICAgICAgICAgICAgZCA6ICfgpI/gpJUg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBNIDogJ+Ckj+CklSDgpK7gpLngpL/gpKjgpL4nLFxuICAgICAgICAgICAgTU0gOiAnJWQg4KSu4KS54KS/4KSo4KS+JyxcbiAgICAgICAgICAgIHkgOiAn4KSP4KSVIOCkrOCksOCljeCktycsXG4gICAgICAgICAgICB5eSA6ICclZCDgpKzgpLDgpY3gpLcnXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBkdXRjaCAobmwpXG4vLyBhdXRob3IgOiBKb3JpcyBSw7ZsaW5nIDogaHR0cHM6Ly9naXRodWIuY29tL2pqdXBpdGVyXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciBtb250aHNTaG9ydFdpdGhEb3RzID0gJ2phbi5fZmViLl9tcnQuX2Fwci5fbWVpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPSAnamFuX2ZlYl9tcnRfYXByX21laV9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyk7XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnbmwnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJpX2ZlYnJ1YXJpX21hYXJ0X2FwcmlsX21laV9qdW5pX2p1bGlfYXVndXN0dXNfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aG91dERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXMgOiAnem9uZGFnX21hYW5kYWdfZGluc2RhZ193b2Vuc2RhZ19kb25kZXJkYWdfdnJpamRhZ196YXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICd6by5fbWEuX2RpLl93by5fZG8uX3ZyLl96YS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1pvX01hX0RpX1dvX0RvX1ZyX1phJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3ZhbmRhYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dpc3RlcmVuIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1thZmdlbG9wZW5dIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdvdmVyICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgZ2VsZWRlbicsXG4gICAgICAgICAgICBzIDogJ2VlbiBwYWFyIHNlY29uZGVuJyxcbiAgICAgICAgICAgIG0gOiAnw6nDqW4gbWludXV0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZW4nLFxuICAgICAgICAgICAgaCA6ICfDqcOpbiB1dXInLFxuICAgICAgICAgICAgaGggOiAnJWQgdXVyJyxcbiAgICAgICAgICAgIGQgOiAnw6nDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIE0gOiAnw6nDqW4gbWFhbmQnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbWFhbmRlbicsXG4gICAgICAgICAgICB5IDogJ8Opw6luIGphYXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgamFhcidcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCkgPyAnc3RlJyA6ICdkZScpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogbm9yd2VnaWFuIG55bm9yc2sgKG5uKVxuLy8gYXV0aG9yIDogaHR0cHM6Ly9naXRodWIuY29tL21lY2h1d2luZFxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnbm4nLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcmlsX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW5fZmViX21hcl9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc3VuZGFnX23DpW5kYWdfdHlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sYXVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3N1bl9tw6VuX3R5c19vbnNfdG9yX2ZyZV9sYXUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3N1X23DpV90eV9vbl90b19mcl9sw7gnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSSBkYWcga2xva2thXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0kgbW9yZ29uIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSSBnw6VyIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRsO4cmVnw6VhbmRlXSBkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnZm9yICVzIHNpZGFuJyxcbiAgICAgICAgICAgIHMgOiAnbm9rcmUgc2VrdW5kJyxcbiAgICAgICAgICAgIG0gOiAnZWl0IG1pbnV0dCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dHQnLFxuICAgICAgICAgICAgaCA6ICdlaW4gdGltZScsXG4gICAgICAgICAgICBoaCA6ICclZCB0aW1hcicsXG4gICAgICAgICAgICBkIDogJ2VpbiBkYWcnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgTSA6ICdlaW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG3DpW5hZGVyJyxcbiAgICAgICAgICAgIHkgOiAnZWl0IMOlcicsXG4gICAgICAgICAgICB5eSA6ICclZCDDpXInXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogcG9saXNoIChwbClcbi8vIGF1dGhvciA6IFJhZmFsIEhpcnN6IDogaHR0cHM6Ly9naXRodWIuY29tL2V2b0xcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgdmFyIG1vbnRoc05vbWluYXRpdmUgPSAnc3R5Y3plxYRfbHV0eV9tYXJ6ZWNfa3dpZWNpZcWEX21hal9jemVyd2llY19saXBpZWNfc2llcnBpZcWEX3dyemVzaWXFhF9wYcW6ZHppZXJuaWtfbGlzdG9wYWRfZ3J1ZHppZcWEJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTdWJqZWN0aXZlID0gJ3N0eWN6bmlhX2x1dGVnb19tYXJjYV9rd2lldG5pYV9tYWphX2N6ZXJ3Y2FfbGlwY2Ffc2llcnBuaWFfd3J6ZcWbbmlhX3Bhxbpkemllcm5pa2FfbGlzdG9wYWRhX2dydWRuaWEnLnNwbGl0KCdfJyk7XG5cbiAgICBmdW5jdGlvbiBwbHVyYWwobikge1xuICAgICAgICByZXR1cm4gKG4gJSAxMCA8IDUpICYmIChuICUgMTAgPiAxKSAmJiAoKH5+KG4gLyAxMCkgJSAxMCkgIT09IDEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiAnbWludXTEmSc7XG4gICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWludXR5JyA6ICdtaW51dCcpO1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ICA/ICdnb2R6aW5hJyAgOiAnZ29kemluxJknO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2dvZHppbnknIDogJ2dvZHppbicpO1xuICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pZXNpxIVjZScgOiAnbWllc2nEmWN5Jyk7XG4gICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbGF0YScgOiAnbGF0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgncGwnLCB7XG4gICAgICAgIG1vbnRocyA6IGZ1bmN0aW9uIChtb21lbnRUb0Zvcm1hdCwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoL0QgTU1NTS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1N1YmplY3RpdmVbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNOb21pbmF0aXZlW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA6ICdzdHlfbHV0X21hcl9rd2lfbWFqX2N6ZV9saXBfc2llX3dyel9wYcW6X2xpc19ncnUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ25pZWR6aWVsYV9wb25pZWR6aWHFgmVrX3d0b3Jla1/Fm3JvZGFfY3p3YXJ0ZWtfcGnEhXRla19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnbmllX3Bvbl93dF/Fm3JfY3p3X3B0X3NiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdOX1BuX1d0X8Wacl9Del9QdF9Tbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbRHppxZsgb10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tKdXRybyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tXXSBkZGRkIFtvXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1djem9yYWogb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCxIUgbmllZHppZWzEmSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHplc3rFgsSFIMWbcm9kxJkgb10gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSBzb2JvdMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHplc3rFgnldIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyB0ZW11JyxcbiAgICAgICAgICAgIHMgOiAna2lsa2Egc2VrdW5kJyxcbiAgICAgICAgICAgIG0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiAnMSBkemllxYQnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZG5pJyxcbiAgICAgICAgICAgIE0gOiAnbWllc2nEhWMnLFxuICAgICAgICAgICAgTU0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5IDogJ3JvaycsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGJyYXppbGlhbiBwb3J0dWd1ZXNlIChwdC1icilcbi8vIGF1dGhvciA6IENhaW8gUmliZWlybyBQZXJlaXJhIDogaHR0cHM6Ly9naXRodWIuY29tL2NhaW8tcmliZWlyby1wZXJlaXJhXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdwdC1icicsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbmVpcm9fZmV2ZXJlaXJvX21hcsOnb19hYnJpbF9tYWlvX2p1bmhvX2p1bGhvX2Fnb3N0b19zZXRlbWJyb19vdXR1YnJvX25vdmVtYnJvX2RlemVtYnJvJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW5fZmV2X21hcl9hYnJfbWFpX2p1bl9qdWxfYWdvX3NldF9vdXRfbm92X2Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnZG9taW5nb19zZWd1bmRhLWZlaXJhX3RlcsOnYS1mZWlyYV9xdWFydGEtZmVpcmFfcXVpbnRhLWZlaXJhX3NleHRhLWZlaXJhX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZG9tX3NlZ190ZXJfcXVhX3F1aV9zZXhfc8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnZG9tXzLCql8zwqpfNMKqXzXCql82wqpfc8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIFvDoHNdIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIFvDoHNdIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSG9qZSDDoHNdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQW1hbmjDoyDDoHNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW09udGVtIMOgc10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuZGF5KCkgPT09IDAgfHwgdGhpcy5kYXkoKSA9PT0gNikgP1xuICAgICAgICAgICAgICAgICAgICAnW8OabHRpbW9dIGRkZGQgW8Ogc10gTFQnIDogLy8gU2F0dXJkYXkgKyBTdW5kYXlcbiAgICAgICAgICAgICAgICAgICAgJ1vDmmx0aW1hXSBkZGRkIFvDoHNdIExUJzsgLy8gTW9uZGF5IC0gRnJpZGF5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZW0gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBhdHLDoXMnLFxuICAgICAgICAgICAgcyA6ICdzZWd1bmRvcycsXG4gICAgICAgICAgICBtIDogJ3VtIG1pbnV0bycsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGggOiAndW1hIGhvcmEnLFxuICAgICAgICAgICAgaGggOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZCA6ICd1bSBkaWEnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGlhcycsXG4gICAgICAgICAgICBNIDogJ3VtIG3DqnMnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeSA6ICd1bSBhbm8nLFxuICAgICAgICAgICAgeXkgOiAnJWQgYW5vcydcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWwgOiAnJWTCuidcbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogcG9ydHVndWVzZSAocHQpXG4vLyBhdXRob3IgOiBKZWZmZXJzb24gOiBodHRwczovL2dpdGh1Yi5jb20vamFsZXg3OVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgncHQnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW5laXJvX2ZldmVyZWlyb19tYXLDp29fYWJyaWxfbWFpb19qdW5ob19qdWxob19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZXplbWJybycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnamFuX2Zldl9tYXJfYWJyX21haV9qdW5fanVsX2Fnb19zZXRfb3V0X25vdl9kZXonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ2RvbWluZ29fc2VndW5kYS1mZWlyYV90ZXLDp2EtZmVpcmFfcXVhcnRhLWZlaXJhX3F1aW50YS1mZWlyYV9zZXh0YS1mZWlyYV9zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2RvbV9zZWdfdGVyX3F1YV9xdWlfc2V4X3PDoWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2RvbV8ywqpfM8KqXzTCql81wqpfNsKqX3PDoWInLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvamUgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FtYW5ow6Mgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8Ogc10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tPbnRlbSDDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDYpID9cbiAgICAgICAgICAgICAgICAgICAgJ1vDmmx0aW1vXSBkZGRkIFvDoHNdIExUJyA6IC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgICdbw5psdGltYV0gZGRkZCBbw6BzXSBMVCc7IC8vIE1vbmRheSAtIEZyaWRheVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2VtICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnaMOhICVzJyxcbiAgICAgICAgICAgIHMgOiAnc2VndW5kb3MnLFxuICAgICAgICAgICAgbSA6ICd1bSBtaW51dG8nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoIDogJ3VtYSBob3JhJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQgOiAndW0gZGlhJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRpYXMnLFxuICAgICAgICAgICAgTSA6ICd1bSBtw6pzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHkgOiAndW0gYW5vJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGFub3MnXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsIDogJyVkwronLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogcm9tYW5pYW4gKHJvKVxuLy8gYXV0aG9yIDogVmxhZCBHdXJkaWdhIDogaHR0cHM6Ly9naXRodWIuY29tL2d1cmRpZ2Fcbi8vIGF1dGhvciA6IFZhbGVudGluIEFnYWNoaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdmFseVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAgICAgJ21tJzogJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgJ2hoJzogJ29yZScsXG4gICAgICAgICAgICAgICAgJ2RkJzogJ3ppbGUnLFxuICAgICAgICAgICAgICAgICdNTSc6ICdsdW5pJyxcbiAgICAgICAgICAgICAgICAneXknOiAnYW5pJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgJztcbiAgICAgICAgaWYgKG51bWJlciAlIDEwMCA+PSAyMCB8fCAobnVtYmVyID49IDEwMCAmJiBudW1iZXIgJSAxMDAgPT09IDApKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSAnIGRlICc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVtYmVyICsgc2VwYXJhdG9yICsgZm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3JvJywge1xuICAgICAgICBtb250aHMgOiAnaWFudWFyaWVfZmVicnVhcmllX21hcnRpZV9hcHJpbGllX21haV9pdW5pZV9pdWxpZV9hdWd1c3Rfc2VwdGVtYnJpZV9vY3RvbWJyaWVfbm9pZW1icmllX2RlY2VtYnJpZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnaWFuLl9mZWJyLl9tYXJ0Ll9hcHIuX21haV9pdW4uX2l1bC5fYXVnLl9zZXB0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnZHVtaW5pY8SDX2x1bmlfbWFyyJtpX21pZXJjdXJpX2pvaV92aW5lcmlfc8OibWLEg3TEgycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdEdW1fTHVuX01hcl9NaWVfSm9pX1Zpbl9Tw6JtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdEdV9MdV9NYV9NaV9Kb19WaV9Tw6InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2F6aSBsYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttw6JpbmUgbGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbbGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaWVyaSBsYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9zdGFdIGRkZGQgW2xhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdwZXN0ZSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIMOubiB1cm3EgycsXG4gICAgICAgICAgICBzIDogJ2PDonRldmEgc2VjdW5kZScsXG4gICAgICAgICAgICBtIDogJ3VuIG1pbnV0JyxcbiAgICAgICAgICAgIG1tIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGggOiAnbyBvcsSDJyxcbiAgICAgICAgICAgIGhoIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQgOiAnbyB6aScsXG4gICAgICAgICAgICBkZCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNIDogJ28gbHVuxIMnLFxuICAgICAgICAgICAgTU0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeSA6ICd1biBhbicsXG4gICAgICAgICAgICB5eSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWxcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IHJ1c3NpYW4gKHJ1KVxuLy8gYXV0aG9yIDogVmlrdG9ybWluYXRvciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9WaWt0b3JtaW5hdG9yXG4vLyBBdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTEgPyBmb3Jtc1swXSA6IChudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMCkgPyBmb3Jtc1sxXSA6IGZvcm1zWzJdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAnbW0nOiB3aXRob3V0U3VmZml4ID8gJ9C80LjQvdGD0YLQsF/QvNC40L3Rg9GC0Ytf0LzQuNC90YPRgicgOiAn0LzQuNC90YPRgtGDX9C80LjQvdGD0YLRi1/QvNC40L3Rg9GCJyxcbiAgICAgICAgICAgICdoaCc6ICfRh9Cw0YFf0YfQsNGB0LBf0YfQsNGB0L7QsicsXG4gICAgICAgICAgICAnZGQnOiAn0LTQtdC90Yxf0LTQvdGPX9C00L3QtdC5JyxcbiAgICAgICAgICAgICdNTSc6ICfQvNC10YHRj9GGX9C80LXRgdGP0YbQsF/QvNC10YHRj9GG0LXQsicsXG4gICAgICAgICAgICAneXknOiAn0LPQvtC0X9Cz0L7QtNCwX9C70LXRgidcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQvNC40L3Rg9GC0LAnIDogJ9C80LjQvdGD0YLRgyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgbW9udGhzID0ge1xuICAgICAgICAgICAgJ25vbWluYXRpdmUnOiAn0Y/QvdCy0LDRgNGMX9GE0LXQstGA0LDQu9GMX9C80LDRgNGCX9Cw0L/RgNC10LvRjF/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGA0Yxf0L7QutGC0Y/QsdGA0Yxf0L3QvtGP0LHRgNGMX9C00LXQutCw0LHRgNGMJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnOiAn0Y/QvdCy0LDRgNGPX9GE0LXQstGA0LDQu9GPX9C80LDRgNGC0LBf0LDQv9GA0LXQu9GPX9C80LDRj1/QuNGO0L3Rj1/QuNGO0LvRj1/QsNCy0LPRg9GB0YLQsF/RgdC10L3RgtGP0LHRgNGPX9C+0LrRgtGP0LHRgNGPX9C90L7Rj9Cx0YDRj1/QtNC10LrQsNCx0YDRjycuc3BsaXQoJ18nKVxuICAgICAgICB9LFxuXG4gICAgICAgIG5vdW5DYXNlID0gKC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMrKStNTU1NPy8pLnRlc3QoZm9ybWF0KSA/XG4gICAgICAgICAgICAnYWNjdXNhdGl2ZScgOlxuICAgICAgICAgICAgJ25vbWluYXRpdmUnO1xuXG4gICAgICAgIHJldHVybiBtb250aHNbbm91bkNhc2VdW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzU2hvcnRDYXNlUmVwbGFjZShtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIG1vbnRoc1Nob3J0ID0ge1xuICAgICAgICAgICAgJ25vbWluYXRpdmUnOiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YDRgl/QsNC/0YBf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgICAgICAnYWNjdXNhdGl2ZSc6ICfRj9C90LJf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNGPX9C40Y7QvdGPX9C40Y7Qu9GPX9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJylcbiAgICAgICAgfSxcblxuICAgICAgICBub3VuQ2FzZSA9ICgvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKykrTU1NTT8vKS50ZXN0KGZvcm1hdCkgP1xuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnIDpcbiAgICAgICAgICAgICdub21pbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbm91bkNhc2VdW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNDYXNlUmVwbGFjZShtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIHdlZWtkYXlzID0ge1xuICAgICAgICAgICAgJ25vbWluYXRpdmUnOiAn0LLQvtGB0LrRgNC10YHQtdC90YzQtV/Qv9C+0L3QtdC00LXQu9GM0L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDQtdC00LBf0YfQtdGC0LLQtdGA0LNf0L/Rj9GC0L3QuNGG0LBf0YHRg9Cx0LHQvtGC0LAnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICAnYWNjdXNhdGl2ZSc6ICfQstC+0YHQutGA0LXRgdC10L3RjNC1X9C/0L7QvdC10LTQtdC70YzQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNC10LTRg1/Rh9C10YLQstC10YDQs1/Qv9GP0YLQvdC40YbRg1/RgdGD0LHQsdC+0YLRgycuc3BsaXQoJ18nKVxuICAgICAgICB9LFxuXG4gICAgICAgIG5vdW5DYXNlID0gKC9cXFsgP1vQktCyXSA/KD860L/RgNC+0YjQu9GD0Y580YHQu9C10LTRg9GO0YnRg9GOfNGN0YLRgyk/ID9cXF0gP2RkZGQvKS50ZXN0KGZvcm1hdCkgP1xuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnIDpcbiAgICAgICAgICAgICdub21pbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gd2Vla2RheXNbbm91bkNhc2VdW20uZGF5KCldO1xuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdydScsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzQ2FzZVJlcGxhY2UsXG4gICAgICAgIG1vbnRoc1Nob3J0IDogbW9udGhzU2hvcnRDYXNlUmVwbGFjZSxcbiAgICAgICAgd2Vla2RheXMgOiB3ZWVrZGF5c0Nhc2VSZXBsYWNlLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9Cy0YFf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9Cy0YFf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlIDogWy9e0Y/QvdCyL2ksIC9e0YTQtdCyL2ksIC9e0LzQsNGAL2ksIC9e0LDQv9GAL2ksIC9e0LzQsFvQuXzRj10vaSwgL17QuNGO0L0vaSwgL17QuNGO0LsvaSwgL17QsNCy0LMvaSwgL17RgdC10L0vaSwgL17QvtC60YIvaSwgL17QvdC+0Y8vaSwgL17QtNC10LovaV0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWSDQsy4nLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZINCzLiwgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSDQsy4sIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0KHQtdCz0L7QtNC90Y8g0LJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JfQsNCy0YLRgNCwINCyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CS0YfQtdGA0LAg0LJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgPT09IDIgPyAnW9CS0L5dIGRkZGQgW9CyXSBMVCcgOiAnW9CSXSBkZGRkIFvQsl0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgIT09IHRoaXMud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQv9GA0L7RiNC70L7QtV0gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC/0YDQvtGI0LvRi9C5XSBkZGRkIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0L/RgNC+0YjQu9GD0Y5dIGRkZGQgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXkoKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JLQvl0gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSXSBkZGRkIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9GH0LXRgNC10LcgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDQvdCw0LfQsNC0JyxcbiAgICAgICAgICAgIHMgOiAn0L3QtdGB0LrQvtC70YzQutC+INGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGggOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQgOiAn0LTQtdC90YwnLFxuICAgICAgICAgICAgZGQgOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTSA6ICfQvNC10YHRj9GGJyxcbiAgICAgICAgICAgIE1NIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHkgOiAn0LPQvtC0JyxcbiAgICAgICAgICAgIHl5IDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbFxuICAgICAgICB9LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/QvdC+0YfQuHzRg9GC0YDQsHzQtNC90Y980LLQtdGH0LXRgNCwL2ksXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijQtNC90Y980LLQtdGH0LXRgNCwKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YPRgtGA0LAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0LXRgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0Ll80LPQvnzRjykvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QuSc7XG4gICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Qs9C+JztcbiAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0Y8nO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBzbG92YWsgKHNrKVxuLy8gYXV0aG9yIDogTWFydGluIE1pbmthIDogaHR0cHM6Ly9naXRodWIuY29tL2syc1xuLy8gYmFzZWQgb24gd29yayBvZiBwZXRyYmVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRyYmVsYVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICB2YXIgbW9udGhzID0gJ2phbnXDoXJfZmVicnXDoXJfbWFyZWNfYXByw61sX23DoWpfasO6bl9qw7psX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0w7NiZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2phbl9mZWJfbWFyX2Fwcl9tw6FqX2rDum5fasO6bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpO1xuXG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIChuID4gMSkgJiYgKG4gPCA1KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3MnOiAgLy8gYSBmZXcgc2Vjb25kcyAvIGluIGEgZmV3IHNlY29uZHMgLyBhIGZldyBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgcmV0dXJuICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSA/ICdww6FyIHNla8O6bmQnIDogJ3DDoXIgc2VrdW5kYW1pJztcbiAgICAgICAgY2FzZSAnbSc6ICAvLyBhIG1pbnV0ZSAvIGluIGEgbWludXRlIC8gYSBtaW51dGUgYWdvXG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW7DunRhJyA6IChpc0Z1dHVyZSA/ICdtaW7DunR1JyA6ICdtaW7DunRvdScpO1xuICAgICAgICBjYXNlICdtbSc6IC8vIDkgbWludXRlcyAvIGluIDkgbWludXRlcyAvIDkgbWludXRlcyBhZ29cbiAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW7DunR5JyA6ICdtaW7DunQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW7DunRhbWknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2gnOiAgLy8gYW4gaG91ciAvIGluIGFuIGhvdXIgLyBhbiBob3VyIGFnb1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnaG9kaW5hJyA6IChpc0Z1dHVyZSA/ICdob2RpbnUnIDogJ2hvZGlub3UnKTtcbiAgICAgICAgY2FzZSAnaGgnOiAvLyA5IGhvdXJzIC8gaW4gOSBob3VycyAvIDkgaG91cnMgYWdvXG4gICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnaG9kaW55JyA6ICdob2TDrW4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdob2RpbmFtaSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZCc6ICAvLyBhIGRheSAvIGluIGEgZGF5IC8gYSBkYXkgYWdvXG4gICAgICAgICAgICByZXR1cm4gKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpID8gJ2RlxYgnIDogJ2TFiG9tJztcbiAgICAgICAgY2FzZSAnZGQnOiAvLyA5IGRheXMgLyBpbiA5IGRheXMgLyA5IGRheXMgYWdvXG4gICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZG5pJyA6ICdkbsOtJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZMWIYW1pJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNJzogIC8vIGEgbW9udGggLyBpbiBhIG1vbnRoIC8gYSBtb250aCBhZ29cbiAgICAgICAgICAgIHJldHVybiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkgPyAnbWVzaWFjJyA6ICdtZXNpYWNvbSc7XG4gICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21lc2lhY2UnIDogJ21lc2lhY292Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbWVzaWFjbWknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3knOiAgLy8gYSB5ZWFyIC8gaW4gYSB5ZWFyIC8gYSB5ZWFyIGFnb1xuICAgICAgICAgICAgcmV0dXJuICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSA/ICdyb2snIDogJ3Jva29tJztcbiAgICAgICAgY2FzZSAneXknOiAvLyA5IHllYXJzIC8gaW4gOSB5ZWFycyAvIDkgeWVhcnMgYWdvXG4gICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAncm9reScgOiAncm9rb3YnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdyb2ttaSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdzaycsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydCA6IG1vbnRoc1Nob3J0LFxuICAgICAgICBtb250aHNQYXJzZSA6IChmdW5jdGlvbiAobW9udGhzLCBtb250aHNTaG9ydCkge1xuICAgICAgICAgICAgdmFyIGksIF9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyB1c2UgY3VzdG9tIHBhcnNlciB0byBzb2x2ZSBwcm9ibGVtIHdpdGggSnVseSAoxI1lcnZlbmVjKVxuICAgICAgICAgICAgICAgIF9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgbW9udGhzW2ldICsgJyR8XicgKyBtb250aHNTaG9ydFtpXSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfbW9udGhzUGFyc2U7XG4gICAgICAgIH0obW9udGhzLCBtb250aHNTaG9ydCkpLFxuICAgICAgICB3ZWVrZGF5cyA6ICduZWRlxL5hX3BvbmRlbG9rX3V0b3Jva19zdHJlZGFfxaF0dnJ0b2tfcGlhdG9rX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICduZV9wb191dF9zdF/FoXRfcGlfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ25lX3BvX3V0X3N0X8WhdF9waV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QuIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZG5lcyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3phanRyYSBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBuZWRlxL51IG9dIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFtvXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHN0cmVkdSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2byDFoXR2cnRvayBvXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHBpYXRvayBvXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhIG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IG5lZGXEvnUgb10gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw7ogc3RyZWR1IG9dIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO9XSBkZGRkIFtvXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAncHJlZCAlcycsXG4gICAgICAgICAgICBzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5IDogdHJhbnNsYXRlXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogc2xvdmVuaWFuIChzbClcbi8vIGF1dGhvciA6IFJvYmVydCBTZWRvdsWhZWsgOiBodHRwczovL2dpdGh1Yi5jb20vc2Vkb3ZzZWtcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZW5hIG1pbnV0YScgOiAnZW5vIG1pbnV0byc7XG4gICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRlJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2VuYSB1cmEnIDogJ2VubyB1cm8nO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICd1cmEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3VyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3VyZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAndXInO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkbmknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWVzZWMnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21lc2VjYSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21lc2VjZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWVzZWNldic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdsZXRvJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdsZXRpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbGV0YSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbGV0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnc2wnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJfZmVicnVhcl9tYXJlY19hcHJpbF9tYWpfanVuaWpfanVsaWpfYXZndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hai5fanVuLl9qdWwuX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnbmVkZWxqYV9wb25lZGVsamVrX3RvcmVrX3NyZWRhX8SNZXRydGVrX3BldGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICduZWQuX3Bvbi5fdG9yLl9zcmUuX8SNZXQuX3BldC5fc29iLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnbmVfcG9fdG9fc3JfxI1lX3BlX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuIE1NLiBZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgIDogJ1tkYW5lcyBvYl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSAgOiAnW2p1dHJpIG9iXSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW25lZGVsam9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW3NyZWRvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtzb2JvdG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbb2JdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSAgOiAnW3bEjWVyYWogb2JdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuamFdIGRkZGQgW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuamldIGRkZGQgW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfEjWV6ICVzJyxcbiAgICAgICAgICAgIHBhc3QgICA6ICclcyBuYXphaicsXG4gICAgICAgICAgICBzICAgICAgOiAnbmVrYWogc2VrdW5kJyxcbiAgICAgICAgICAgIG0gICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGggICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgICAgICA6ICdlbiBkYW4nLFxuICAgICAgICAgICAgZGQgICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTSAgICAgIDogJ2VuIG1lc2VjJyxcbiAgICAgICAgICAgIE1NICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgICAgICA6ICdlbm8gbGV0bycsXG4gICAgICAgICAgICB5eSAgICAgOiB0cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBBbGJhbmlhbiAoc3EpXG4vLyBhdXRob3IgOiBGbGFrw6tyaW0gSXNtYW5pIDogaHR0cHM6Ly9naXRodWIuY29tL2ZsYWtlcmltaVxuLy8gYXV0aG9yOiBNZW5lbGlvbiBFbGVuc8O6bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlICh0ZXN0cylcbi8vIGF1dGhvciA6IE9lcmQgQ3VrYWxsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9vZXJkIChmaXhlcylcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NxJywge1xuICAgICAgICBtb250aHMgOiAnSmFuYXJfU2hrdXJ0X01hcnNfUHJpbGxfTWFqX1FlcnNob3JfS29ycmlrX0d1c2h0X1NodGF0b3JfVGV0b3JfTsOrbnRvcl9EaGpldG9yJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fU2hrX01hcl9QcmlfTWFqX1Flcl9Lb3JfR3VzX1NodF9UZXRfTsOrbl9EaGonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ0UgRGllbF9FIEjDq27Dq19FIE1hcnTDq19FIE3Dq3JrdXLDq19FIEVuanRlX0UgUHJlbXRlX0UgU2h0dW7Dqycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdEaWVfSMOrbl9NYXJfTcOrcl9FbmpfUHJlX1NodCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnRF9IX01hX03Dq19FX1BfU2gnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9QRHxNRC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKSA9PT0gJ00nO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXJzIDwgMTIgPyAnUEQnIDogJ01EJztcbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW1NvdCBuw6tdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW05lc8OrciBuw6tdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW27Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbRGplIG7Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnZGRkZCBbZSBrYWx1YXIgbsOrXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnbsOrICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgbcOrIHBhcsOrJyxcbiAgICAgICAgICAgIHMgOiAnZGlzYSBzZWtvbmRhJyxcbiAgICAgICAgICAgIG0gOiAnbmrDqyBtaW51dMOrJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0YScsXG4gICAgICAgICAgICBoIDogJ25qw6sgb3LDqycsXG4gICAgICAgICAgICBoaCA6ICclZCBvcsOrJyxcbiAgICAgICAgICAgIGQgOiAnbmrDqyBkaXTDqycsXG4gICAgICAgICAgICBkZCA6ICclZCBkaXTDqycsXG4gICAgICAgICAgICBNIDogJ25qw6sgbXVhaicsXG4gICAgICAgICAgICBNTSA6ICclZCBtdWFqJyxcbiAgICAgICAgICAgIHkgOiAnbmrDqyB2aXQnLFxuICAgICAgICAgICAgeXkgOiAnJWQgdml0ZSdcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBTZXJiaWFuLWN5cmlsbGljIChzci1jeXJsKVxuLy8gYXV0aG9yIDogTWlsYW4gSmFuYcSNa292acSHPG1pbGFuamFuYWNrb3ZpY0BnbWFpbC5jb20+IDogaHR0cHM6Ly9naXRodWIuY29tL21pbGFuLWpcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgdmFyIHRyYW5zbGF0b3IgPSB7XG4gICAgICAgIHdvcmRzOiB7IC8vRGlmZmVyZW50IGdyYW1tYXRpY2FsIGNhc2VzXG4gICAgICAgICAgICBtOiBbJ9GY0LXQtNCw0L0g0LzQuNC90YPRgicsICfRmNC10LTQvdC1INC80LjQvdGD0YLQtSddLFxuICAgICAgICAgICAgbW06IFsn0LzQuNC90YPRgicsICfQvNC40L3Rg9GC0LUnLCAn0LzQuNC90YPRgtCwJ10sXG4gICAgICAgICAgICBoOiBbJ9GY0LXQtNCw0L0g0YHQsNGCJywgJ9GY0LXQtNC90L7QsyDRgdCw0YLQsCddLFxuICAgICAgICAgICAgaGg6IFsn0YHQsNGCJywgJ9GB0LDRgtCwJywgJ9GB0LDRgtC4J10sXG4gICAgICAgICAgICBkZDogWyfQtNCw0L0nLCAn0LTQsNC90LAnLCAn0LTQsNC90LAnXSxcbiAgICAgICAgICAgIE1NOiBbJ9C80LXRgdC10YYnLCAn0LzQtdGB0LXRhtCwJywgJ9C80LXRgdC10YbQuCddLFxuICAgICAgICAgICAgeXk6IFsn0LPQvtC00LjQvdCwJywgJ9Cz0L7QtNC40L3QtScsICfQs9C+0LTQuNC90LAnXVxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyID09PSAxID8gd29yZEtleVswXSA6IChudW1iZXIgPj0gMiAmJiBudW1iZXIgPD0gNCA/IHdvcmRLZXlbMV0gOiB3b3JkS2V5WzJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldO1xuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NyLWN5cmwnLCB7XG4gICAgICAgIG1vbnRoczogWyfRmNCw0L3Rg9Cw0YAnLCAn0YTQtdCx0YDRg9Cw0YAnLCAn0LzQsNGA0YInLCAn0LDQv9GA0LjQuycsICfQvNCw0ZgnLCAn0ZjRg9C9JywgJ9GY0YPQuycsICfQsNCy0LPRg9GB0YInLCAn0YHQtdC/0YLQtdC80LHQsNGAJywgJ9C+0LrRgtC+0LHQsNGAJywgJ9C90L7QstC10LzQsdCw0YAnLCAn0LTQtdGG0LXQvNCx0LDRgCddLFxuICAgICAgICBtb250aHNTaG9ydDogWyfRmNCw0L0uJywgJ9GE0LXQsS4nLCAn0LzQsNGALicsICfQsNC/0YAuJywgJ9C80LDRmCcsICfRmNGD0L0nLCAn0ZjRg9C7JywgJ9Cw0LLQsy4nLCAn0YHQtdC/LicsICfQvtC60YIuJywgJ9C90L7Qsi4nLCAn0LTQtdGGLiddLFxuICAgICAgICB3ZWVrZGF5czogWyfQvdC10LTQtdGZ0LAnLCAn0L/QvtC90LXQtNC10ZnQsNC6JywgJ9GD0YLQvtGA0LDQuicsICfRgdGA0LXQtNCwJywgJ9GH0LXRgtCy0YDRgtCw0LonLCAn0L/QtdGC0LDQuicsICfRgdGD0LHQvtGC0LAnXSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogWyfQvdC10LQuJywgJ9C/0L7QvS4nLCAn0YPRgtC+LicsICfRgdGA0LUuJywgJ9GH0LXRgi4nLCAn0L/QtdGCLicsICfRgdGD0LEuJ10sXG4gICAgICAgIHdlZWtkYXlzTWluOiBbJ9C90LUnLCAn0L/QvicsICfRg9GCJywgJ9GB0YAnLCAn0YfQtScsICfQv9C1JywgJ9GB0YMnXSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTDogJ0RELiBNTS4gWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0LTQsNC90LDRgSDRg10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vRgdGD0YLRgNCwINGDXSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9C90LXQtNC10ZnRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9GB0YDQtdC00YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvRgdGD0LHQvtGC0YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIGRkZGQgW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXkgIDogJ1vRmNGD0YfQtSDRg10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvQvdC10LTQtdGZ0LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0L/QvtC90LXQtNC10ZnQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9GD0YLQvtGA0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0YHRgNC10LTQtV0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvRh9C10YLQstGA0YLQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9C/0LXRgtC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9GB0YPQsdC+0YLQtV0gW9GDXSBMVCdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdCAgIDogJ9C/0YDQtSAlcycsXG4gICAgICAgICAgICBzICAgICAgOiAn0L3QtdC60L7Qu9C40LrQviDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBtICAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaCAgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgICAgICA6ICfQtNCw0L0nLFxuICAgICAgICAgICAgZGQgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNICAgICAgOiAn0LzQtdGB0LXRhicsXG4gICAgICAgICAgICBNTSAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgICAgICA6ICfQs9C+0LTQuNC90YMnLFxuICAgICAgICAgICAgeXkgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBTZXJiaWFuLWxhdGluIChzcilcbi8vIGF1dGhvciA6IE1pbGFuIEphbmHEjWtvdmnEhzxtaWxhbmphbmFja292aWNAZ21haWwuY29tPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWxhbi1qXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3JkczogeyAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgbTogWydqZWRhbiBtaW51dCcsICdqZWRuZSBtaW51dGUnXSxcbiAgICAgICAgICAgIG1tOiBbJ21pbnV0JywgJ21pbnV0ZScsICdtaW51dGEnXSxcbiAgICAgICAgICAgIGg6IFsnamVkYW4gc2F0JywgJ2plZG5vZyBzYXRhJ10sXG4gICAgICAgICAgICBoaDogWydzYXQnLCAnc2F0YScsICdzYXRpJ10sXG4gICAgICAgICAgICBkZDogWydkYW4nLCAnZGFuYScsICdkYW5hJ10sXG4gICAgICAgICAgICBNTTogWydtZXNlYycsICdtZXNlY2EnLCAnbWVzZWNpJ10sXG4gICAgICAgICAgICB5eTogWydnb2RpbmEnLCAnZ29kaW5lJywgJ2dvZGluYSddXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgPT09IDEgPyB3b3JkS2V5WzBdIDogKG51bWJlciA+PSAyICYmIG51bWJlciA8PSA0ID8gd29yZEtleVsxXSA6IHdvcmRLZXlbMl0pO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICAgICAgdmFyIHdvcmRLZXkgPSB0cmFuc2xhdG9yLndvcmRzW2tleV07XG4gICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gbW9tZW50LmRlZmluZUxvY2FsZSgnc3InLCB7XG4gICAgICAgIG1vbnRoczogWydqYW51YXInLCAnZmVicnVhcicsICdtYXJ0JywgJ2FwcmlsJywgJ21haicsICdqdW4nLCAnanVsJywgJ2F2Z3VzdCcsICdzZXB0ZW1iYXInLCAnb2t0b2JhcicsICdub3ZlbWJhcicsICdkZWNlbWJhciddLFxuICAgICAgICBtb250aHNTaG9ydDogWydqYW4uJywgJ2ZlYi4nLCAnbWFyLicsICdhcHIuJywgJ21haicsICdqdW4nLCAnanVsJywgJ2F2Zy4nLCAnc2VwLicsICdva3QuJywgJ25vdi4nLCAnZGVjLiddLFxuICAgICAgICB3ZWVrZGF5czogWyduZWRlbGphJywgJ3BvbmVkZWxqYWsnLCAndXRvcmFrJywgJ3NyZWRhJywgJ8SNZXR2cnRhaycsICdwZXRhaycsICdzdWJvdGEnXSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogWyduZWQuJywgJ3Bvbi4nLCAndXRvLicsICdzcmUuJywgJ8SNZXQuJywgJ3BldC4nLCAnc3ViLiddLFxuICAgICAgICB3ZWVrZGF5c01pbjogWyduZScsICdwbycsICd1dCcsICdzcicsICfEjWUnLCAncGUnLCAnc3UnXSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTDogJ0RELiBNTS4gWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzdXRyYSB1XSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXkgIDogJ1tqdcSNZSB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtuZWRlbGplXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcG9uZWRlbGprYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3V0b3JrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3JlZGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFvEjWV0dnJ0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwZXRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFdlZWtEYXlzW3RoaXMuZGF5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0ICAgOiAncHJlICVzJyxcbiAgICAgICAgICAgIHMgICAgICA6ICduZWtvbGlrbyBzZWt1bmRpJyxcbiAgICAgICAgICAgIG0gICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoICAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZCAgICAgIDogJ2RhbicsXG4gICAgICAgICAgICBkZCAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gICAgICA6ICdtZXNlYycsXG4gICAgICAgICAgICBNTSAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgICAgICA6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXkgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBzd2VkaXNoIChzdilcbi8vIGF1dGhvciA6IEplbnMgQWxtIDogaHR0cHM6Ly9naXRodWIuY29tL3VsbXVzXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCdzdicsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcmlfZmVicnVhcmlfbWFyc19hcHJpbF9tYWpfanVuaV9qdWxpX2F1Z3VzdGlfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdzw7ZuZGFnX23DpW5kYWdfdGlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7ZyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3PDtm5fbcOlbl90aXNfb25zX3Rvcl9mcmVfbMO2cicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnc8O2X23DpV90aV9vbl90b19mcl9sw7YnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSWRhZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tJbW9yZ29uXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lnw6VyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRsO2cnJhXSBkZGRkW2VuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2bDtnIgJXMgc2VkYW4nLFxuICAgICAgICAgICAgcyA6ICduw6VncmEgc2VrdW5kZXInLFxuICAgICAgICAgICAgbSA6ICdlbiBtaW51dCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVyJyxcbiAgICAgICAgICAgIGggOiAnZW4gdGltbWUnLFxuICAgICAgICAgICAgaGggOiAnJWQgdGltbWFyJyxcbiAgICAgICAgICAgIGQgOiAnZW4gZGFnJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRhZ2FyJyxcbiAgICAgICAgICAgIE0gOiAnZW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG3DpW5hZGVyJyxcbiAgICAgICAgICAgIHkgOiAnZXR0IMOlcicsXG4gICAgICAgICAgICB5eSA6ICclZCDDpXInXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGV8YSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICdlJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ2EnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnYScgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdlJyA6ICdlJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiB0YW1pbCAodGEpXG4vLyBhdXRob3IgOiBBcmp1bmt1bWFyIEtyaXNobmFtb29ydGh5IDogaHR0cHM6Ly9naXRodWIuY29tL3RrMTIwNDA0XG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIC8qdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgICcxJzogJ+CvpycsXG4gICAgICAgICAgICAnMic6ICfgr6gnLFxuICAgICAgICAgICAgJzMnOiAn4K+pJyxcbiAgICAgICAgICAgICc0JzogJ+CvqicsXG4gICAgICAgICAgICAnNSc6ICfgr6snLFxuICAgICAgICAgICAgJzYnOiAn4K+sJyxcbiAgICAgICAgICAgICc3JzogJ+CvrScsXG4gICAgICAgICAgICAnOCc6ICfgr64nLFxuICAgICAgICAgICAgJzknOiAn4K+vJyxcbiAgICAgICAgICAgICcwJzogJ+CvpidcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cvpyc6ICcxJyxcbiAgICAgICAgICAgICfgr6gnOiAnMicsXG4gICAgICAgICAgICAn4K+pJzogJzMnLFxuICAgICAgICAgICAgJ+Cvqic6ICc0JyxcbiAgICAgICAgICAgICfgr6snOiAnNScsXG4gICAgICAgICAgICAn4K+sJzogJzYnLFxuICAgICAgICAgICAgJ+CvrSc6ICc3JyxcbiAgICAgICAgICAgICfgr64nOiAnOCcsXG4gICAgICAgICAgICAn4K+vJzogJzknLFxuICAgICAgICAgICAgJ+Cvpic6ICcwJ1xuICAgICAgICB9OyAqL1xuXG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RhJywge1xuICAgICAgICBtb250aHMgOiAn4K6c4K6p4K614K6w4K6/X+CuquCuv+CuquCvjeCusOCuteCusOCuv1/grq7grr7grrDgr43grprgr41f4K6P4K6q4K+N4K6w4K6y4K+NX+CuruCvh1/grpzgr4Lgrqngr41f4K6c4K+C4K6y4K+IX+CuhuCuleCuuOCvjeCun+CvjV/grprgr4bgrqrgr43grp/gr4bgrq7gr43grqrgrrDgr41f4K6F4K6V4K+N4K6f4K+H4K6+4K6q4K6w4K+NX+CuqOCuteCuruCvjeCuquCusOCvjV/grp/grr/grprgrq7gr43grqrgrrDgr40nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ+CunOCuqeCuteCusOCuv1/grqrgrr/grqrgr43grrDgrrXgrrDgrr9f4K6u4K6+4K6w4K+N4K6a4K+NX+Cuj+CuquCvjeCusOCusuCvjV/grq7gr4df4K6c4K+C4K6p4K+NX+CunOCvguCusuCviF/grobgrpXgrrjgr43grp/gr41f4K6a4K+G4K6q4K+N4K6f4K+G4K6u4K+N4K6q4K6w4K+NX+CuheCuleCvjeCun+Cvh+CuvuCuquCusOCvjV/grqjgrrXgrq7gr43grqrgrrDgr41f4K6f4K6/4K6a4K6u4K+N4K6q4K6w4K+NJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfgrp7grr7grq/grr/grrHgr43grrHgr4HgrpXgr43grpXgrr/grrTgrq7gr4hf4K6k4K6/4K6Z4K+N4K6V4K6f4K+N4K6V4K6/4K604K6u4K+IX+CumuCvhuCuteCvjeCuteCuvuCur+CvjeCuleCuv+CutOCuruCviF/grqrgr4HgrqTgrqngr43grpXgrr/grrTgrq7gr4hf4K614K6/4K6v4K6+4K604K6V4K+N4K6V4K6/4K604K6u4K+IX+CuteCvhuCus+CvjeCus+Cuv+CuleCvjeCuleCuv+CutOCuruCviF/grprgrqngrr/grpXgr43grpXgrr/grrTgrq7gr4gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn4K6e4K6+4K6v4K6/4K6x4K+BX+CupOCuv+CumeCvjeCuleCus+CvjV/grprgr4bgrrXgr43grrXgrr7grq/gr41f4K6q4K+B4K6k4K6p4K+NX+CuteCuv+Cur+CuvuCutOCuqeCvjV/grrXgr4bgrrPgr43grrPgrr9f4K6a4K6p4K6/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfgrp7grr5f4K6k4K6/X+CumuCvhl/grqrgr4Ff4K614K6/X+CuteCvhl/grponLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+Cuh+CuqeCvjeCuseCvgV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4K6o4K6+4K6z4K+IXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgrqjgr4fgrrHgr43grrHgr4FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgrpXgrp/grqjgr43grqQg4K614K6+4K6w4K6u4K+NXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg4K6H4K6y4K+NJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg4K6u4K+B4K6p4K+NJyxcbiAgICAgICAgICAgIHMgOiAn4K6S4K6w4K+BIOCumuCuv+CusiDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgbSA6ICfgrpLgrrDgr4Eg4K6o4K6/4K6u4K6/4K6f4K6u4K+NJyxcbiAgICAgICAgICAgIG1tIDogJyVkIOCuqOCuv+CuruCuv+Cun+CumeCvjeCuleCus+CvjScsXG4gICAgICAgICAgICBoIDogJ+CukuCusOCvgSDgrq7grqPgrr8g4K6o4K+H4K6w4K6u4K+NJyxcbiAgICAgICAgICAgIGhoIDogJyVkIOCuruCuo+CuvyDgrqjgr4fgrrDgrq7gr40nLFxuICAgICAgICAgICAgZCA6ICfgrpLgrrDgr4Eg4K6o4K6+4K6z4K+NJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOCuqOCuvuCun+CvjeCuleCus+CvjScsXG4gICAgICAgICAgICBNIDogJ+CukuCusOCvgSDgrq7grr7grqTgrq7gr40nLFxuICAgICAgICAgICAgTU0gOiAnJWQg4K6u4K6+4K6k4K6Z4K+N4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIHkgOiAn4K6S4K6w4K+BIOCuteCusOCvgeCun+CuruCvjScsXG4gICAgICAgICAgICB5eSA6ICclZCDgrobgrqPgr43grp/gr4HgrpXgrrPgr40nXG4gICAgICAgIH0sXG4vKiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cvp+CvqOCvqeCvquCvq+CvrOCvreCvruCvr+Cvpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwqL1xuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeCuteCupOCvgS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+CuteCupOCvgSc7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvLyByZWZlciBodHRwOi8vdGEud2lraXBlZGlhLm9yZy9zLzFlcjFcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+Cur+CuvuCuruCuruCvjXzgrrXgr4jgrpXgrrHgr4h84K6V4K6+4K6y4K+IfOCuqOCuo+CvjeCuquCuleCusuCvjXzgro7grrHgr43grqrgrr7grp/gr4F84K6u4K6+4K6y4K+ILyxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq/grr7grq7grq7gr40nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuteCviOCuleCuseCviCc7ICAvLyDgrrXgr4jgrpXgrrHgr4hcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6V4K6+4K6y4K+IJzsgLy8g4K6V4K6+4K6y4K+IXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuqOCuo+CvjeCuquCuleCusuCvjSc7IC8vIOCuqOCuo+CvjeCuquCuleCusuCvjVxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgro7grrHgr43grqrgrr7grp/gr4EnOyAvLyDgro7grrHgr43grqrgrr7grp/gr4FcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6u4K6+4K6y4K+IJzsgLy8g4K6u4K6+4K6y4K+IXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCur+CuvuCuruCuruCvjSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgrq/grr7grq7grq7gr40nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgrrXgr4jgrpXgrrHgr4gnIHx8IG1lcmlkaWVtID09PSAn4K6V4K6+4K6y4K+IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CuqOCuo+CvjeCuquCuleCusuCvjScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiB0aGFpICh0aClcbi8vIGF1dGhvciA6IEtyaWRzYWRhIFRoYW5hYnVscG9uZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaXJuXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCd0aCcsIHtcbiAgICAgICAgbW9udGhzIDogJ+C4oeC4geC4o+C4suC4hOC4oV/guIHguLjguKHguKDguLLguJ7guLHguJnguJjguYxf4Lih4Li14LiZ4Liy4LiE4LihX+C5gOC4oeC4qeC4suC4ouC4mV/guJ7guKTguKnguKDguLLguITguKFf4Lih4Li04LiW4Li44LiZ4Liy4Lii4LiZX+C4geC4o+C4geC4juC4suC4hOC4oV/guKrguLTguIfguKvguLLguITguKFf4LiB4Lix4LiZ4Lii4Liy4Lii4LiZX+C4leC4uOC4peC4suC4hOC4oV/guJ7guKTguKjguIjguLTguIHguLLguKLguJlf4LiY4Lix4LiZ4Lin4Liy4LiE4LihJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfguKHguIHguKPguLJf4LiB4Li44Lih4Lig4LiyX+C4oeC4teC4meC4sl/guYDguKHguKnguLJf4Lie4Lik4Lip4Lig4LiyX+C4oeC4tOC4luC4uOC4meC4sl/guIHguKPguIHguI7guLJf4Liq4Li04LiH4Lir4LiyX+C4geC4seC4meC4ouC4sl/guJXguLjguKXguLJf4Lie4Lik4Lio4LiI4Li04LiB4LiyX+C4mOC4seC4meC4p+C4sicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn4Lit4Liy4LiX4Li04LiV4Lii4LmMX+C4iOC4seC4meC4l+C4o+C5jF/guK3guLHguIfguITguLLguKNf4Lie4Li44LiYX+C4nuC4pOC4q+C4seC4quC4muC4lOC4tV/guKjguLjguIHguKPguYxf4LmA4Liq4Liy4Lij4LmMJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+C4reC4suC4l+C4tOC4leC4ouC5jF/guIjguLHguJnguJfguKPguYxf4Lit4Lix4LiH4LiE4Liy4LijX+C4nuC4uOC4mF/guJ7guKTguKvguLHguKpf4Lio4Li44LiB4Lij4LmMX+C5gOC4quC4suC4o+C5jCcuc3BsaXQoJ18nKSwgLy8geWVzLCB0aHJlZSBjaGFyYWN0ZXJzIGRpZmZlcmVuY2VcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4Lit4LiyLl/guIguX+C4rS5f4LieLl/guJ7guKQuX+C4qC5f4LiqLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdIIOC4meC4suC4rOC4tOC4geC4siBtIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBMVFMgOiAnTFQgcyDguKfguLTguJnguLLguJfguLUnLFxuICAgICAgICAgICAgTCA6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSDguYDguKfguKXguLIgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICfguKfguLHguJlkZGRk4LiX4Li14LmIIEQgTU1NTSBZWVlZIOC5gOC4p+C4peC4siBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C4geC5iOC4reC4meC5gOC4l+C4teC5iOC4ouC4h3zguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C4q+C4peC4seC4h+C5gOC4l+C4teC5iOC4ouC4hyc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LiB4LmI4Lit4LiZ4LmA4LiX4Li14LmI4Lii4LiHJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+C4p+C4seC4meC4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+C4nuC4o+C4uOC5iOC4h+C4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGRb4Lir4LiZ4LmJ4LiyIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb4LmA4Lih4Li34LmI4Lit4Lin4Liy4LiZ4LiZ4Li14LmJIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+C4p+C4seC4mV1kZGRkW+C4l+C4teC5iOC5geC4peC5ieC4pyDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfguK3guLXguIEgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclc+C4l+C4teC5iOC5geC4peC5ieC4pycsXG4gICAgICAgICAgICBzIDogJ+C5hOC4oeC5iOC4geC4teC5iOC4p+C4tOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBtIDogJzEg4LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIG1tIDogJyVkIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBoIDogJzEg4LiK4Lix4LmI4Lin4LmC4Lih4LiHJyxcbiAgICAgICAgICAgIGhoIDogJyVkIOC4iuC4seC5iOC4p+C5guC4oeC4hycsXG4gICAgICAgICAgICBkIDogJzEg4Lin4Lix4LiZJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOC4p+C4seC4mScsXG4gICAgICAgICAgICBNIDogJzEg4LmA4LiU4Li34Lit4LiZJyxcbiAgICAgICAgICAgIE1NIDogJyVkIOC5gOC4lOC4t+C4reC4mScsXG4gICAgICAgICAgICB5IDogJzEg4Lib4Li1JyxcbiAgICAgICAgICAgIHl5IDogJyVkIOC4m+C4tSdcbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiBUYWdhbG9nL0ZpbGlwaW5vICh0bC1waClcbi8vIGF1dGhvciA6IERhbiBIYWdtYW5cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RsLXBoJywge1xuICAgICAgICBtb250aHMgOiAnRW5lcm9fUGVicmVyb19NYXJzb19BYnJpbF9NYXlvX0h1bnlvX0h1bHlvX0Fnb3N0b19TZXR5ZW1icmVfT2t0dWJyZV9Ob2J5ZW1icmVfRGlzeWVtYnJlJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdFbmVfUGViX01hcl9BYnJfTWF5X0h1bl9IdWxfQWdvX1NldF9Pa3RfTm9iX0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnTGluZ2dvX0x1bmVzX01hcnRlc19NaXllcmt1bGVzX0h1d2ViZXNfQml5ZXJuZXNfU2FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0xpbl9MdW5fTWFyX01peV9IdXdfQml5X1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnTGlfTHVfTWFfTWlfSHVfQmlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ01NL0QvWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ01NTU0gRCwgWVlZWSBMVCcsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gREQsIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tOZ2F5b24gc2FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQnVrYXMgc2FdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbc2FdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2FoYXBvbiBzYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtodWxpbmcgbGluZ2dvXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdzYSBsb29iIG5nICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgYW5nIG5ha2FsaXBhcycsXG4gICAgICAgICAgICBzIDogJ2lsYW5nIHNlZ3VuZG8nLFxuICAgICAgICAgICAgbSA6ICdpc2FuZyBtaW51dG8nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRvJyxcbiAgICAgICAgICAgIGggOiAnaXNhbmcgb3JhcycsXG4gICAgICAgICAgICBoaCA6ICclZCBvcmFzJyxcbiAgICAgICAgICAgIGQgOiAnaXNhbmcgYXJhdycsXG4gICAgICAgICAgICBkZCA6ICclZCBhcmF3JyxcbiAgICAgICAgICAgIE0gOiAnaXNhbmcgYnV3YW4nLFxuICAgICAgICAgICAgTU0gOiAnJWQgYnV3YW4nLFxuICAgICAgICAgICAgeSA6ICdpc2FuZyB0YW9uJyxcbiAgICAgICAgICAgIHl5IDogJyVkIHRhb24nXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiB0dXJraXNoICh0cilcbi8vIGF1dGhvcnMgOiBFcmhhbiBHdW5kb2dhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lcmhhbmd1bmRvZ2FuLFxuLy8gICAgICAgICAgIEJ1cmFrIFlpxJ9pdCBLYXlhOiBodHRwczovL2dpdGh1Yi5jb20vQllLXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogJ1xcJ2luY2knLFxuICAgICAgICA1OiAnXFwnaW5jaScsXG4gICAgICAgIDg6ICdcXCdpbmNpJyxcbiAgICAgICAgNzA6ICdcXCdpbmNpJyxcbiAgICAgICAgODA6ICdcXCdpbmNpJyxcblxuICAgICAgICAyOiAnXFwnbmNpJyxcbiAgICAgICAgNzogJ1xcJ25jaScsXG4gICAgICAgIDIwOiAnXFwnbmNpJyxcbiAgICAgICAgNTA6ICdcXCduY2knLFxuXG4gICAgICAgIDM6ICdcXCfDvG5jw7wnLFxuICAgICAgICA0OiAnXFwnw7xuY8O8JyxcbiAgICAgICAgMTAwOiAnXFwnw7xuY8O8JyxcblxuICAgICAgICA2OiAnXFwnbmPEsScsXG5cbiAgICAgICAgOTogJ1xcJ3VuY3UnLFxuICAgICAgICAxMDogJ1xcJ3VuY3UnLFxuICAgICAgICAzMDogJ1xcJ3VuY3UnLFxuXG4gICAgICAgIDYwOiAnXFwnxLFuY8SxJyxcbiAgICAgICAgOTA6ICdcXCfEsW5jxLEnXG4gICAgfTtcblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCd0cicsIHtcbiAgICAgICAgbW9udGhzIDogJ09jYWtfxZ51YmF0X01hcnRfTmlzYW5fTWF5xLFzX0hhemlyYW5fVGVtbXV6X0HEn3VzdG9zX0V5bMO8bF9Fa2ltX0thc8SxbV9BcmFsxLFrJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdPY2FfxZ51Yl9NYXJfTmlzX01heV9IYXpfVGVtX0HEn3VfRXlsX0VraV9LYXNfQXJhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdQYXphcl9QYXphcnRlc2lfU2FsxLFfw4dhcsWfYW1iYV9QZXLFn2VtYmVfQ3VtYV9DdW1hcnRlc2knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnUGF6X1B0c19TYWxfw4dhcl9QZXJfQ3VtX0N0cycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnUHpfUHRfU2Ffw4dhX1BlX0N1X0N0Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbYnVnw7xuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW3lhcsSxbiBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdbaGFmdGF5YV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbZMO8bl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW2dlw6dlbiBoYWZ0YV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIHNvbnJhJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgw7ZuY2UnLFxuICAgICAgICAgICAgcyA6ICdiaXJrYcOnIHNhbml5ZScsXG4gICAgICAgICAgICBtIDogJ2JpciBkYWtpa2EnLFxuICAgICAgICAgICAgbW0gOiAnJWQgZGFraWthJyxcbiAgICAgICAgICAgIGggOiAnYmlyIHNhYXQnLFxuICAgICAgICAgICAgaGggOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBkIDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGfDvG4nLFxuICAgICAgICAgICAgTSA6ICdiaXIgYXknLFxuICAgICAgICAgICAgTU0gOiAnJWQgYXknLFxuICAgICAgICAgICAgeSA6ICdiaXIgecSxbCcsXG4gICAgICAgICAgICB5eSA6ICclZCB5xLFsJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfScoaW5jaXxuY2l8w7xuY8O8fG5jxLF8dW5jdXzEsW5jxLEpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHsgIC8vIHNwZWNpYWwgY2FzZSBmb3IgemVyb1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnXFwnxLFuY8SxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciAlIDEwMCAtIGEsXG4gICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IE1vcm9jY28gQ2VudHJhbCBBdGxhcyBUYW1hemnJo3QgaW4gTGF0aW4gKHR6bS1sYXRuKVxuLy8gYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bS1sYXRuJywge1xuICAgICAgICBtb250aHMgOiAnaW5uYXlyX2Jyy6RheXLLpF9tYXLLpHPLpF9pYnJpcl9tYXl5d195d255d195d2x5d3pfyaN3xaF0X8Whd3RhbmJpcl9rdMukd2Jyy6Rfbnd3YW5iaXJfZHdqbmJpcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnaW5uYXlyX2Jyy6RheXLLpF9tYXLLpHPLpF9pYnJpcl9tYXl5d195d255d195d2x5d3pfyaN3xaF0X8Whd3RhbmJpcl9rdMukd2Jyy6Rfbnd3YW5iaXJfZHdqbmJpcicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnYXNhbWFzX2F5bmFzX2FzaW5hc19ha3Jhc19ha3dhc19hc2ltd2FzX2FzaeG4jXlhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2FzZGtoIGddIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYXNrYSBnXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2ddIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbYXNzYW50IGddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFka2ggcyB5YW4gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICd5YW4gJXMnLFxuICAgICAgICAgICAgcyA6ICdpbWlrJyxcbiAgICAgICAgICAgIG0gOiAnbWludeG4jScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW514biNJyxcbiAgICAgICAgICAgIGggOiAnc2HJm2EnLFxuICAgICAgICAgICAgaGggOiAnJWQgdGFzc2HJm2luJyxcbiAgICAgICAgICAgIGQgOiAnYXNzJyxcbiAgICAgICAgICAgIGRkIDogJyVkIG9zc2FuJyxcbiAgICAgICAgICAgIE0gOiAnYXlvd3InLFxuICAgICAgICAgICAgTU0gOiAnJWQgaXl5aXJuJyxcbiAgICAgICAgICAgIHkgOiAnYXNnYXMnLFxuICAgICAgICAgICAgeXkgOiAnJWQgaXNnYXNuJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDEyICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogTW9yb2NjbyBDZW50cmFsIEF0bGFzIFRhbWF6acmjdCAodHptKVxuLy8gYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bScsIHtcbiAgICAgICAgbW9udGhzIDogJ+K1ieK1j+K1j+K0sOK1ouK1lF/itLHitZXitLDitaLitZVf4rWO4rSw4rWV4rWaX+K1ieK0seK1lOK1ieK1lF/itY7itLDitaLitaLitZNf4rWi4rWT4rWP4rWi4rWTX+K1ouK1k+K1jeK1ouK1k+K1o1/itZbitZPitZvitZxf4rWb4rWT4rWc4rSw4rWP4rSx4rWJ4rWUX+K0veK1n+K1k+K0seK1lV/itY/itZPitaHitLDitY/itLHitYnitZRf4rS34rWT4rWK4rWP4rSx4rWJ4rWUJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfitYnitY/itY/itLDitaLitZRf4rSx4rWV4rSw4rWi4rWVX+K1juK0sOK1leK1ml/itYnitLHitZTitYnitZRf4rWO4rSw4rWi4rWi4rWTX+K1ouK1k+K1j+K1ouK1k1/itaLitZPitY3itaLitZPitaNf4rWW4rWT4rWb4rWcX+K1m+K1k+K1nOK0sOK1j+K0seK1ieK1lF/itL3itZ/itZPitLHitZVf4rWP4rWT4rWh4rSw4rWP4rSx4rWJ4rWUX+K0t+K1k+K1iuK1j+K0seK1ieK1lCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn4rSw4rWZ4rSw4rWO4rSw4rWZX+K0sOK1ouK1j+K0sOK1mV/itLDitZnitYnitY/itLDitZlf4rSw4rS94rWU4rSw4rWZX+K0sOK0veK1oeK0sOK1mV/itLDitZnitYnitY7itaHitLDitZlf4rSw4rWZ4rWJ4rS54rWi4rSw4rWZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4rSw4rWZ4rSw4rWO4rSw4rWZX+K0sOK1ouK1j+K0sOK1mV/itLDitZnitYnitY/itLDitZlf4rSw4rS94rWU4rSw4rWZX+K0sOK0veK1oeK0sOK1mV/itLDitZnitYnitY7itaHitLDitZlf4rSw4rWZ4rWJ4rS54rWi4rSw4rWZJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0xUOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIExUJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4rSw4rWZ4rS34rWFIOK0tF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vitLDitZnitL3itLAg4rS0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW+K0tF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vitLDitZritLDitY/itZwg4rS0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW+K0tF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAn4rS34rSw4rS34rWFIOK1mSDitaLitLDitY8gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICfitaLitLDitY8gJXMnLFxuICAgICAgICAgICAgcyA6ICfitYnitY7itYnitL0nLFxuICAgICAgICAgICAgbSA6ICfitY7itYnitY/itZPitLonLFxuICAgICAgICAgICAgbW0gOiAnJWQg4rWO4rWJ4rWP4rWT4rS6JyxcbiAgICAgICAgICAgIGggOiAn4rWZ4rSw4rWE4rSwJyxcbiAgICAgICAgICAgIGhoIDogJyVkIOK1nOK0sOK1meK1meK0sOK1hOK1ieK1jycsXG4gICAgICAgICAgICBkIDogJ+K0sOK1meK1mScsXG4gICAgICAgICAgICBkZCA6ICclZCBv4rWZ4rWZ4rSw4rWPJyxcbiAgICAgICAgICAgIE0gOiAn4rSw4rWib+K1k+K1lCcsXG4gICAgICAgICAgICBNTSA6ICclZCDitYnitaLitaLitYnitZTitY8nLFxuICAgICAgICAgICAgeSA6ICfitLDitZnitLPitLDitZknLFxuICAgICAgICAgICAgeXkgOiAnJWQg4rWJ4rWZ4rSz4rSw4rWZ4rWPJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDEyICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogdWtyYWluaWFuICh1aylcbi8vIGF1dGhvciA6IHplbWxhbmluIDogaHR0cHM6Ly9naXRodWIuY29tL3plbWxhbmluXG4vLyBBdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBmYWN0b3J5KG1vbWVudCk7XG59KGZ1bmN0aW9uIChtb21lbnQpIHtcbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTEgPyBmb3Jtc1swXSA6IChudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMCkgPyBmb3Jtc1sxXSA6IGZvcm1zWzJdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAnbW0nOiAn0YXQstC40LvQuNC90LBf0YXQstC40LvQuNC90Lhf0YXQstC40LvQuNC9JyxcbiAgICAgICAgICAgICdoaCc6ICfQs9C+0LTQuNC90LBf0LPQvtC00LjQvdC4X9Cz0L7QtNC40L0nLFxuICAgICAgICAgICAgJ2RkJzogJ9C00LXQvdGMX9C00L3Rll/QtNC90ZbQsicsXG4gICAgICAgICAgICAnTU0nOiAn0LzRltGB0Y/RhtGMX9C80ZbRgdGP0YbRll/QvNGW0YHRj9GG0ZbQsicsXG4gICAgICAgICAgICAneXknOiAn0YDRltC6X9GA0L7QutC4X9GA0L7QutGW0LInXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXQstC40LvQuNC90LAnIDogJ9GF0LLQuNC70LjQvdGDJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LPQvtC00LjQvdCwJyA6ICfQs9C+0LTQuNC90YMnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHBsdXJhbChmb3JtYXRba2V5XSwgK251bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNDYXNlUmVwbGFjZShtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIG1vbnRocyA9IHtcbiAgICAgICAgICAgICdub21pbmF0aXZlJzogJ9GB0ZbRh9C10L3RjF/Qu9GO0YLQuNC5X9Cx0LXRgNC10LfQtdC90Yxf0LrQstGW0YLQtdC90Yxf0YLRgNCw0LLQtdC90Yxf0YfQtdGA0LLQtdC90Yxf0LvQuNC/0LXQvdGMX9GB0LXRgNC/0LXQvdGMX9Cy0LXRgNC10YHQtdC90Yxf0LbQvtCy0YLQtdC90Yxf0LvQuNGB0YLQvtC/0LDQtF/Qs9GA0YPQtNC10L3RjCcuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgICdhY2N1c2F0aXZlJzogJ9GB0ZbRh9C90Y9f0LvRjtGC0L7Qs9C+X9Cx0LXRgNC10LfQvdGPX9C60LLRltGC0L3Rj1/RgtGA0LDQstC90Y9f0YfQtdGA0LLQvdGPX9C70LjQv9C90Y9f0YHQtdGA0L/QvdGPX9Cy0LXRgNC10YHQvdGPX9C20L7QstGC0L3Rj1/Qu9C40YHRgtC+0L/QsNC00LBf0LPRgNGD0LTQvdGPJy5zcGxpdCgnXycpXG4gICAgICAgIH0sXG5cbiAgICAgICAgbm91bkNhc2UgPSAoL0Rbb0RdPyAqTU1NTT8vKS50ZXN0KGZvcm1hdCkgP1xuICAgICAgICAgICAgJ2FjY3VzYXRpdmUnIDpcbiAgICAgICAgICAgICdub21pbmF0aXZlJztcblxuICAgICAgICByZXR1cm4gbW9udGhzW25vdW5DYXNlXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzQ2FzZVJlcGxhY2UobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IHtcbiAgICAgICAgICAgICdub21pbmF0aXZlJzogJ9C90LXQtNGW0LvRj1/Qv9C+0L3QtdC00ZbQu9C+0Lpf0LLRltCy0YLQvtGA0L7Qul/RgdC10YDQtdC00LBf0YfQtdGC0LLQtdGAX9C/4oCZ0Y/RgtC90LjRhtGPX9GB0YPQsdC+0YLQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgICdhY2N1c2F0aXZlJzogJ9C90LXQtNGW0LvRjl/Qv9C+0L3QtdC00ZbQu9C+0Lpf0LLRltCy0YLQvtGA0L7Qul/RgdC10YDQtdC00YNf0YfQtdGC0LLQtdGAX9C/4oCZ0Y/RgtC90LjRhtGOX9GB0YPQsdC+0YLRgycuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgICdnZW5pdGl2ZSc6ICfQvdC10LTRltC70ZZf0L/QvtC90LXQtNGW0LvQutCwX9Cy0ZbQstGC0L7RgNC60LBf0YHQtdGA0LXQtNC4X9GH0LXRgtCy0LXRgNCz0LBf0L/igJnRj9GC0L3QuNGG0ZZf0YHRg9Cx0L7RgtC4Jy5zcGxpdCgnXycpXG4gICAgICAgIH0sXG5cbiAgICAgICAgbm91bkNhc2UgPSAoLyhcXFtb0JLQstCj0YNdXFxdKSA/ZGRkZC8pLnRlc3QoZm9ybWF0KSA/XG4gICAgICAgICAgICAnYWNjdXNhdGl2ZScgOlxuICAgICAgICAgICAgKCgvXFxbPyg/OtC80LjQvdGD0LvQvtGXfNC90LDRgdGC0YPQv9C90L7Rlyk/ID9cXF0gP2RkZGQvKS50ZXN0KGZvcm1hdCkgP1xuICAgICAgICAgICAgICAgICdnZW5pdGl2ZScgOlxuICAgICAgICAgICAgICAgICdub21pbmF0aXZlJyk7XG5cbiAgICAgICAgcmV0dXJuIHdlZWtkYXlzW25vdW5DYXNlXVttLmRheSgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzSG91cnNGdW5jdGlvbihzdHIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIgKyAn0L4nICsgKHRoaXMuaG91cnMoKSA9PT0gMTEgPyAn0LEnIDogJycpICsgJ10gTFQnO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCd1aycsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzQ2FzZVJlcGxhY2UsXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ9GB0ZbRh1/Qu9GO0YJf0LHQtdGAX9C60LLRltGCX9GC0YDQsNCyX9GH0LXRgNCyX9C70LjQv1/RgdC10YDQv1/QstC10YBf0LbQvtCy0YJf0LvQuNGB0YJf0LPRgNGD0LQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogd2Vla2RheXNDYXNlUmVwbGFjZSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVkg0YAuJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSDRgC4sIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkg0YAuLCBMVCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9Ch0YzQvtCz0L7QtNC90ZYgJyksXG4gICAgICAgICAgICBuZXh0RGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CX0LDQstGC0YDQsCAnKSxcbiAgICAgICAgICAgIGxhc3REYXk6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JLRh9C+0YDQsCAnKSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CjXSBkZGRkIFsnKSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQnNC40L3Rg9C70L7Rl10gZGRkZCBbJykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JzQuNC90YPQu9C+0LPQvl0gZGRkZCBbJykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAn0LfQsCAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzINGC0L7QvNGDJyxcbiAgICAgICAgICAgIHMgOiAn0LTQtdC60ZbQu9GM0LrQsCDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoIDogJ9Cz0L7QtNC40L3RgycsXG4gICAgICAgICAgICBoaCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkIDogJ9C00LXQvdGMJyxcbiAgICAgICAgICAgIGRkIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE0gOiAn0LzRltGB0Y/RhtGMJyxcbiAgICAgICAgICAgIE1NIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHkgOiAn0YDRltC6JyxcbiAgICAgICAgICAgIHl5IDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIE0uIEUuOiB0aG9zZSB0d28gYXJlIHZpcnR1YWxseSB1bnVzZWQgYnV0IGEgdXNlciBtaWdodCB3YW50IHRvIGltcGxlbWVudCB0aGVtIGZvciBoaXMvaGVyIHdlYnNpdGUgZm9yIHNvbWUgcmVhc29uXG5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9GWfNGA0LDQvdC60YN80LTQvdGPfNCy0LXRh9C+0YDQsC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQvtGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfRlic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDQsNC90LrRgyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LTQvdGPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQstC10YfQvtGA0LAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQuXzQs9C+KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QuSc7XG4gICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Qs9C+JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcbi8vIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8gbG9jYWxlIDogdXpiZWsgKHV6KVxuLy8gYXV0aG9yIDogU2FyZG9yIE11bWlub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbXVtaW5vZmZcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZmFjdG9yeShtb21lbnQpO1xufShmdW5jdGlvbiAobW9tZW50KSB7XG4gICAgcmV0dXJuIG1vbWVudC5kZWZpbmVMb2NhbGUoJ3V6Jywge1xuICAgICAgICBtb250aHMgOiAn0Y/QvdCy0LDRgNGMX9GE0LXQstGA0LDQu9GMX9C80LDRgNGCX9Cw0L/RgNC10LvRjF/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGA0Yxf0L7QutGC0Y/QsdGA0Yxf0L3QvtGP0LHRgNGMX9C00LXQutCw0LHRgNGMJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfRj9C90LJf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCzX9GB0LXQvV/QvtC60YJf0L3QvtGPX9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn0K/QutGI0LDQvdCx0LBf0JTRg9GI0LDQvdCx0LBf0KHQtdGI0LDQvdCx0LBf0KfQvtGA0YjQsNC90LHQsF/Qn9Cw0LnRiNCw0L3QsdCwX9CW0YPQvNCwX9Co0LDQvdCx0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0K/QutGIX9CU0YPRiF/QodC10Yhf0KfQvtGAX9Cf0LDQuV/QltGD0Lxf0KjQsNC9Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfQr9C6X9CU0YNf0KHQtV/Qp9C+X9Cf0LBf0JbRg1/QqNCwJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdMVDpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnRCBNTU1NIFlZWVksIGRkZGQgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb0JHRg9Cz0YPQvSDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW9Ct0YDRgtCw0LPQsF0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb0JrQtdGH0LAg0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb0KPRgtCz0LDQvV0gZGRkZCBb0LrRg9C90Lgg0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAn0K/QutC40L0gJXMg0LjRh9C40LTQsCcsXG4gICAgICAgICAgICBwYXN0IDogJ9CR0LjRgCDQvdC10YfQsCAlcyDQvtC70LTQuNC9JyxcbiAgICAgICAgICAgIHMgOiAn0YTRg9GA0YHQsNGCJyxcbiAgICAgICAgICAgIG0gOiAn0LHQuNGAINC00LDQutC40LrQsCcsXG4gICAgICAgICAgICBtbSA6ICclZCDQtNCw0LrQuNC60LAnLFxuICAgICAgICAgICAgaCA6ICfQsdC40YAg0YHQvtCw0YInLFxuICAgICAgICAgICAgaGggOiAnJWQg0YHQvtCw0YInLFxuICAgICAgICAgICAgZCA6ICfQsdC40YAg0LrRg9C9JyxcbiAgICAgICAgICAgIGRkIDogJyVkINC60YPQvScsXG4gICAgICAgICAgICBNIDogJ9Cx0LjRgCDQvtC5JyxcbiAgICAgICAgICAgIE1NIDogJyVkINC+0LknLFxuICAgICAgICAgICAgeSA6ICfQsdC40YAg0LnQuNC7JyxcbiAgICAgICAgICAgIHl5IDogJyVkINC50LjQuydcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IHZpZXRuYW1lc2UgKHZpKVxuLy8gYXV0aG9yIDogQmFuZyBOZ3V5ZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmFuZ25rXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCd2aScsIHtcbiAgICAgICAgbW9udGhzIDogJ3Row6FuZyAxX3Row6FuZyAyX3Row6FuZyAzX3Row6FuZyA0X3Row6FuZyA1X3Row6FuZyA2X3Row6FuZyA3X3Row6FuZyA4X3Row6FuZyA5X3Row6FuZyAxMF90aMOhbmcgMTFfdGjDoW5nIDEyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdUaDAxX1RoMDJfVGgwM19UaDA0X1RoMDVfVGgwNl9UaDA3X1RoMDhfVGgwOV9UaDEwX1RoMTFfVGgxMicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnY2jhu6cgbmjhuq10X3Ro4bupIGhhaV90aOG7qSBiYV90aOG7qSB0xrBfdGjhu6kgbsSDbV90aOG7qSBzw6F1X3Ro4bupIGLhuqN5Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0NOX1QyX1QzX1Q0X1Q1X1Q2X1Q3Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdDTl9UMl9UM19UNF9UNV9UNl9UNycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnTFQ6c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBbbsSDbV0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFtuxINtXSBZWVlZIExUJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFtuxINtXSBZWVlZIExUJyxcbiAgICAgICAgICAgIGwgOiAnREQvTS9ZWVlZJyxcbiAgICAgICAgICAgIGxsIDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsIDogJ0QgTU1NIFlZWVkgTFQnLFxuICAgICAgICAgICAgbGxsbCA6ICdkZGQsIEQgTU1NIFlZWVkgTFQnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIw7RtIG5heSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW05nw6B5IG1haSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3R14bqnbiB04bubaSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0jDtG0gcXVhIGzDumNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbdHXhuqduIHLhu5NpIGzDumNdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIHThu5tpJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgdHLGsOG7m2MnLFxuICAgICAgICAgICAgcyA6ICd2w6BpIGdpw6J5JyxcbiAgICAgICAgICAgIG0gOiAnbeG7mXQgcGjDunQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgcGjDunQnLFxuICAgICAgICAgICAgaCA6ICdt4buZdCBnaeG7nScsXG4gICAgICAgICAgICBoaCA6ICclZCBnaeG7nScsXG4gICAgICAgICAgICBkIDogJ23hu5l0IG5nw6B5JyxcbiAgICAgICAgICAgIGRkIDogJyVkIG5nw6B5JyxcbiAgICAgICAgICAgIE0gOiAnbeG7mXQgdGjDoW5nJyxcbiAgICAgICAgICAgIE1NIDogJyVkIHRow6FuZycsXG4gICAgICAgICAgICB5IDogJ23hu5l0IG7Eg20nLFxuICAgICAgICAgICAgeXkgOiAnJWQgbsSDbSdcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG59KSk7XG4vLyBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIGxvY2FsZSA6IGNoaW5lc2UgKHpoLWNuKVxuLy8gYXV0aG9yIDogc3V1cGljIDogaHR0cHM6Ly9naXRodWIuY29tL3N1dXBpY1xuLy8gYXV0aG9yIDogWmVubyBaZW5nIDogaHR0cHM6Ly9naXRodWIuY29tL3plbm96ZW5nXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1jbicsIHtcbiAgICAgICAgbW9udGhzIDogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+WRqOaXpV/lkajkuIBf5ZGo5LqMX+WRqOS4iV/lkajlm5tf5ZGo5LqUX+WRqOWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0Fo54K5bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0Fo54K5beWIhnPnp5InLFxuICAgICAgICAgICAgTCA6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVnlubRNTU1E5pelJyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZ5bm0TU1NROaXpUxUJyxcbiAgICAgICAgICAgIExMTEwgOiAnWVlZWeW5tE1NTUTml6VkZGRkTFQnLFxuICAgICAgICAgICAgbCA6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIGxsIDogJ1lZWVnlubRNTU1E5pelJyxcbiAgICAgICAgICAgIGxsbCA6ICdZWVlZ5bm0TU1NROaXpUxUJyxcbiAgICAgICAgICAgIGxsbGwgOiAnWVlZWeW5tE1NTUTml6VkZGRkTFQnXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/lh4zmmah85pep5LiKfOS4iuWNiHzkuK3ljYh85LiL5Y2IfOaZmuS4ii8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+WHjOaZqCcgfHwgbWVyaWRpZW0gPT09ICfml6nkuIonIHx8XG4gICAgICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn5LiK5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gJ+S4reWNiCdcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5YeM5pmoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aXqeS4iic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiK5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuK3ljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4i+WNiCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pma5LiKJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pbnV0ZXMoKSA9PT0gMCA/ICdb5LuK5aSpXUFoW+eCueaVtF0nIDogJ1vku4rlpKldTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWludXRlcygpID09PSAwID8gJ1vmmI7lpKldQWhb54K55pW0XScgOiAnW+aYjuWkqV1MVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzKCkgPT09IDAgPyAnW+aYqOWkqV1BaFvngrnmlbRdJyA6ICdb5pio5aSpXUxUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRPZldlZWssIHByZWZpeDtcbiAgICAgICAgICAgICAgICBzdGFydE9mV2VlayA9IG1vbWVudCgpLnN0YXJ0T2YoJ3dlZWsnKTtcbiAgICAgICAgICAgICAgICBwcmVmaXggPSB0aGlzLnVuaXgoKSAtIHN0YXJ0T2ZXZWVrLnVuaXgoKSA+PSA3ICogMjQgKiAzNjAwID8gJ1vkuItdJyA6ICdb5pysXSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWludXRlcygpID09PSAwID8gcHJlZml4ICsgJ2RkZEFo54K55pW0JyA6IHByZWZpeCArICdkZGRBaOeCuW1tJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRPZldlZWssIHByZWZpeDtcbiAgICAgICAgICAgICAgICBzdGFydE9mV2VlayA9IG1vbWVudCgpLnN0YXJ0T2YoJ3dlZWsnKTtcbiAgICAgICAgICAgICAgICBwcmVmaXggPSB0aGlzLnVuaXgoKSA8IHN0YXJ0T2ZXZWVrLnVuaXgoKSAgPyAnW+S4il0nIDogJ1vmnKxdJztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzKCkgPT09IDAgPyBwcmVmaXggKyAnZGRkQWjngrnmlbQnIDogcHJlZml4ICsgJ2RkZEFo54K5bW0nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0xMJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOWRqCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+WRqCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclc+WGhScsXG4gICAgICAgICAgICBwYXN0IDogJyVz5YmNJyxcbiAgICAgICAgICAgIHMgOiAn5Yeg56eSJyxcbiAgICAgICAgICAgIG0gOiAnMeWIhumSnycsXG4gICAgICAgICAgICBtbSA6ICclZOWIhumSnycsXG4gICAgICAgICAgICBoIDogJzHlsI/ml7YnLFxuICAgICAgICAgICAgaGggOiAnJWTlsI/ml7YnLFxuICAgICAgICAgICAgZCA6ICcx5aSpJyxcbiAgICAgICAgICAgIGRkIDogJyVk5aSpJyxcbiAgICAgICAgICAgIE0gOiAnMeS4quaciCcsXG4gICAgICAgICAgICBNTSA6ICclZOS4quaciCcsXG4gICAgICAgICAgICB5IDogJzHlubQnLFxuICAgICAgICAgICAgeXkgOiAnJWTlubQnXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICAvLyBHQi9UIDc0MDgtMTk5NOOAiuaVsOaNruWFg+WSjOS6pOaNouagvOW8j8K35L+h5oGv5Lqk5o2iwrfml6XmnJ/lkozml7bpl7TooajnpLrms5XjgIvkuI5JU08gODYwMToxOTg4562J5pWIXG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xufSkpO1xuLy8gbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyBsb2NhbGUgOiB0cmFkaXRpb25hbCBjaGluZXNlICh6aC10dylcbi8vIGF1dGhvciA6IEJlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZW4tbGluXG5cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgIGZhY3RvcnkobW9tZW50KTtcbn0oZnVuY3Rpb24gKG1vbWVudCkge1xuICAgIHJldHVybiBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC10dycsIHtcbiAgICAgICAgbW9udGhzIDogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0Fo6buebW0nLFxuICAgICAgICAgICAgTFRTIDogJ0Fo6buebeWIhnPnp5InLFxuICAgICAgICAgICAgTCA6ICdZWVlZ5bm0TU1NROaXpScsXG4gICAgICAgICAgICBMTCA6ICdZWVlZ5bm0TU1NROaXpScsXG4gICAgICAgICAgICBMTEwgOiAnWVlZWeW5tE1NTUTml6VMVCcsXG4gICAgICAgICAgICBMTExMIDogJ1lZWVnlubRNTU1E5pelZGRkZExUJyxcbiAgICAgICAgICAgIGwgOiAnWVlZWeW5tE1NTUTml6UnLFxuICAgICAgICAgICAgbGwgOiAnWVlZWeW5tE1NTUTml6UnLFxuICAgICAgICAgICAgbGxsIDogJ1lZWVnlubRNTU1E5pelTFQnLFxuICAgICAgICAgICAgbGxsbCA6ICdZWVlZ5bm0TU1NROaXpWRkZGRMVCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+aXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXIgOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb5LuK5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+aYjuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdb5LiLXWRkZGRMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vmmKjlpKldTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+S4il1kZGRkTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2QnIDpcbiAgICAgICAgICAgIGNhc2UgJ0QnIDpcbiAgICAgICAgICAgIGNhc2UgJ0RERCcgOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgIGNhc2UgJ00nIDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aciCc7XG4gICAgICAgICAgICBjYXNlICd3JyA6XG4gICAgICAgICAgICBjYXNlICdXJyA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgZGVmYXVsdCA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVz5YWnJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXPliY0nLFxuICAgICAgICAgICAgcyA6ICflub7np5InLFxuICAgICAgICAgICAgbSA6ICfkuIDliIbpkJgnLFxuICAgICAgICAgICAgbW0gOiAnJWTliIbpkJgnLFxuICAgICAgICAgICAgaCA6ICfkuIDlsI/mmYInLFxuICAgICAgICAgICAgaGggOiAnJWTlsI/mmYInLFxuICAgICAgICAgICAgZCA6ICfkuIDlpKknLFxuICAgICAgICAgICAgZGQgOiAnJWTlpKknLFxuICAgICAgICAgICAgTSA6ICfkuIDlgIvmnIgnLFxuICAgICAgICAgICAgTU0gOiAnJWTlgIvmnIgnLFxuICAgICAgICAgICAgeSA6ICfkuIDlubQnLFxuICAgICAgICAgICAgeXkgOiAnJWTlubQnXG4gICAgICAgIH1cbiAgICB9KTtcbn0pKTtcblxuICAgIG1vbWVudC5sb2NhbGUoJ2VuJyk7XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRXhwb3NpbmcgTW9tZW50XG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgZnVuY3Rpb24gbWFrZUdsb2JhbChzaG91bGREZXByZWNhdGUpIHtcbiAgICAgICAgLypnbG9iYWwgZW5kZXI6ZmFsc2UgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBlbmRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbGRHbG9iYWxNb21lbnQgPSBnbG9iYWxTY29wZS5tb21lbnQ7XG4gICAgICAgIGlmIChzaG91bGREZXByZWNhdGUpIHtcbiAgICAgICAgICAgIGdsb2JhbFNjb3BlLm1vbWVudCA9IGRlcHJlY2F0ZShcbiAgICAgICAgICAgICAgICAgICAgJ0FjY2Vzc2luZyBNb21lbnQgdGhyb3VnaCB0aGUgZ2xvYmFsIHNjb3BlIGlzICcgK1xuICAgICAgICAgICAgICAgICAgICAnZGVwcmVjYXRlZCwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3JlbGVhc2UuJyxcbiAgICAgICAgICAgICAgICAgICAgbW9tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbFNjb3BlLm1vbWVudCA9IG1vbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1vbkpTIG1vZHVsZSBpcyBkZWZpbmVkXG4gICAgaWYgKGhhc01vZHVsZSkge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1vbWVudDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuICAgICAgICAgICAgaWYgKG1vZHVsZS5jb25maWcgJiYgbW9kdWxlLmNvbmZpZygpICYmIG1vZHVsZS5jb25maWcoKS5ub0dsb2JhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UgdGhlIGdsb2JhbCB2YXJpYWJsZVxuICAgICAgICAgICAgICAgIGdsb2JhbFNjb3BlLm1vbWVudCA9IG9sZEdsb2JhbE1vbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1vbWVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIG1ha2VHbG9iYWwodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWFrZUdsb2JhbCgpO1xuICAgIH1cbn0pLmNhbGwodGhpcyk7XG4iLCIvKipcclxuICogQGxpY2Vuc2VcclxuICogcGl4aS5qcyAtIHYyLjIuM1xyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCwgTWF0IEdyb3Zlc1xyXG4gKiBodHRwOi8vZ29vZGJveWRpZ2l0YWwuY29tL1xyXG4gKlxyXG4gKiBDb21waWxlZDogMjAxNS0wMS0wNlxyXG4gKlxyXG4gKiBwaXhpLmpzIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuICovXHJcbihmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1ifHx7fTtiLldFQkdMX1JFTkRFUkVSPTAsYi5DQU5WQVNfUkVOREVSRVI9MSxiLlZFUlNJT049XCJ2Mi4yLjNcIixiLmJsZW5kTW9kZXM9e05PUk1BTDowLEFERDoxLE1VTFRJUExZOjIsU0NSRUVOOjMsT1ZFUkxBWTo0LERBUktFTjo1LExJR0hURU46NixDT0xPUl9ET0RHRTo3LENPTE9SX0JVUk46OCxIQVJEX0xJR0hUOjksU09GVF9MSUdIVDoxMCxESUZGRVJFTkNFOjExLEVYQ0xVU0lPTjoxMixIVUU6MTMsU0FUVVJBVElPTjoxNCxDT0xPUjoxNSxMVU1JTk9TSVRZOjE2fSxiLnNjYWxlTW9kZXM9e0RFRkFVTFQ6MCxMSU5FQVI6MCxORUFSRVNUOjF9LGIuX1VJRD0wLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/KGIuRmxvYXQzMkFycmF5PUZsb2F0MzJBcnJheSxiLlVpbnQxNkFycmF5PVVpbnQxNkFycmF5LGIuVWludDMyQXJyYXk9VWludDMyQXJyYXksYi5BcnJheUJ1ZmZlcj1BcnJheUJ1ZmZlcik6KGIuRmxvYXQzMkFycmF5PUFycmF5LGIuVWludDE2QXJyYXk9QXJyYXkpLGIuSU5URVJBQ1RJT05fRlJFUVVFTkNZPTMwLGIuQVVUT19QUkVWRU5UX0RFRkFVTFQ9ITAsYi5QSV8yPTIqTWF0aC5QSSxiLlJBRF9UT19ERUc9MTgwL01hdGguUEksYi5ERUdfVE9fUkFEPU1hdGguUEkvMTgwLGIuUkVUSU5BX1BSRUZJWD1cIkAyeFwiLGIuZG9udFNheUhlbGxvPSExLGIuZGVmYXVsdFJlbmRlck9wdGlvbnM9e3ZpZXc6bnVsbCx0cmFuc3BhcmVudDohMSxhbnRpYWxpYXM6ITEscHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLHJlc29sdXRpb246MSxjbGVhckJlZm9yZVJlbmRlcjohMCxhdXRvUmVzaXplOiExfSxiLnNheUhlbGxvPWZ1bmN0aW9uKGEpe2lmKCFiLmRvbnRTYXlIZWxsbyl7aWYobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJjaHJvbWVcIik+LTEpe3ZhciBjPVtcIiVjICVjICVjIFBpeGkuanMgXCIrYi5WRVJTSU9OK1wiIC0gXCIrYStcIiAgJWMgICVjICBodHRwOi8vd3d3LnBpeGlqcy5jb20vICAlYyAlYyDimaUlY+KZpSVj4pmlIFwiLFwiYmFja2dyb3VuZDogI2ZmNjZhNVwiLFwiYmFja2dyb3VuZDogI2ZmNjZhNVwiLFwiY29sb3I6ICNmZjY2YTU7IGJhY2tncm91bmQ6ICMwMzAzMDc7XCIsXCJiYWNrZ3JvdW5kOiAjZmY2NmE1XCIsXCJiYWNrZ3JvdW5kOiAjZmZjM2RjXCIsXCJiYWNrZ3JvdW5kOiAjZmY2NmE1XCIsXCJjb2xvcjogI2ZmMjQyNDsgYmFja2dyb3VuZDogI2ZmZlwiLFwiY29sb3I6ICNmZjI0MjQ7IGJhY2tncm91bmQ6ICNmZmZcIixcImNvbG9yOiAjZmYyNDI0OyBiYWNrZ3JvdW5kOiAjZmZmXCJdO2NvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsYyl9ZWxzZSB3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2coXCJQaXhpLmpzIFwiK2IuVkVSU0lPTitcIiAtIGh0dHA6Ly93d3cucGl4aWpzLmNvbS9cIik7Yi5kb250U2F5SGVsbG89ITB9fSxiLlBvaW50PWZ1bmN0aW9uKGEsYil7dGhpcy54PWF8fDAsdGhpcy55PWJ8fDB9LGIuUG9pbnQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBiLlBvaW50KHRoaXMueCx0aGlzLnkpfSxiLlBvaW50LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLng9YXx8MCx0aGlzLnk9Ynx8KDAhPT1iP3RoaXMueDowKX0sYi5Qb2ludC5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5Qb2ludCxiLlJlY3RhbmdsZT1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLng9YXx8MCx0aGlzLnk9Ynx8MCx0aGlzLndpZHRoPWN8fDAsdGhpcy5oZWlnaHQ9ZHx8MH0sYi5SZWN0YW5nbGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBiLlJlY3RhbmdsZSh0aGlzLngsdGhpcy55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxiLlJlY3RhbmdsZS5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLndpZHRoPD0wfHx0aGlzLmhlaWdodDw9MClyZXR1cm4hMTt2YXIgYz10aGlzLng7aWYoYT49YyYmYTw9Yyt0aGlzLndpZHRoKXt2YXIgZD10aGlzLnk7aWYoYj49ZCYmYjw9ZCt0aGlzLmhlaWdodClyZXR1cm4hMH1yZXR1cm4hMX0sYi5SZWN0YW5nbGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuUmVjdGFuZ2xlLGIuRW1wdHlSZWN0YW5nbGU9bmV3IGIuUmVjdGFuZ2xlKDAsMCwwLDApLGIuUG9seWdvbj1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgQXJyYXl8fChhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpLGFbMF1pbnN0YW5jZW9mIGIuUG9pbnQpe2Zvcih2YXIgYz1bXSxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWMucHVzaChhW2RdLngsYVtkXS55KTthPWN9dGhpcy5jbG9zZWQ9ITAsdGhpcy5wb2ludHM9YX0sYi5Qb2x5Z29uLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucG9pbnRzLnNsaWNlKCk7cmV0dXJuIG5ldyBiLlBvbHlnb24oYSl9LGIuUG9seWdvbi5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9ITEsZD10aGlzLnBvaW50cy5sZW5ndGgvMixlPTAsZj1kLTE7ZD5lO2Y9ZSsrKXt2YXIgZz10aGlzLnBvaW50c1syKmVdLGg9dGhpcy5wb2ludHNbMiplKzFdLGk9dGhpcy5wb2ludHNbMipmXSxqPXRoaXMucG9pbnRzWzIqZisxXSxrPWg+YiE9aj5iJiYoaS1nKSooYi1oKS8oai1oKStnPmE7ayYmKGM9IWMpfXJldHVybiBjfSxiLlBvbHlnb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuUG9seWdvbixiLkNpcmNsZT1mdW5jdGlvbihhLGIsYyl7dGhpcy54PWF8fDAsdGhpcy55PWJ8fDAsdGhpcy5yYWRpdXM9Y3x8MH0sYi5DaXJjbGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBiLkNpcmNsZSh0aGlzLngsdGhpcy55LHRoaXMucmFkaXVzKX0sYi5DaXJjbGUucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5yYWRpdXM8PTApcmV0dXJuITE7dmFyIGM9dGhpcy54LWEsZD10aGlzLnktYixlPXRoaXMucmFkaXVzKnRoaXMucmFkaXVzO3JldHVybiBjKj1jLGQqPWQsZT49YytkfSxiLkNpcmNsZS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBiLlJlY3RhbmdsZSh0aGlzLngtdGhpcy5yYWRpdXMsdGhpcy55LXRoaXMucmFkaXVzLDIqdGhpcy5yYWRpdXMsMip0aGlzLnJhZGl1cyl9LGIuQ2lyY2xlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkNpcmNsZSxiLkVsbGlwc2U9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy54PWF8fDAsdGhpcy55PWJ8fDAsdGhpcy53aWR0aD1jfHwwLHRoaXMuaGVpZ2h0PWR8fDB9LGIuRWxsaXBzZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGIuRWxsaXBzZSh0aGlzLngsdGhpcy55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxiLkVsbGlwc2UucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7aWYodGhpcy53aWR0aDw9MHx8dGhpcy5oZWlnaHQ8PTApcmV0dXJuITE7dmFyIGM9KGEtdGhpcy54KS90aGlzLndpZHRoLGQ9KGItdGhpcy55KS90aGlzLmhlaWdodDtyZXR1cm4gYyo9YyxkKj1kLDE+PWMrZH0sYi5FbGxpcHNlLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGIuUmVjdGFuZ2xlKHRoaXMueC10aGlzLndpZHRoLHRoaXMueS10aGlzLmhlaWdodCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0sYi5FbGxpcHNlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkVsbGlwc2UsYi5Sb3VuZGVkUmVjdGFuZ2xlPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy54PWF8fDAsdGhpcy55PWJ8fDAsdGhpcy53aWR0aD1jfHwwLHRoaXMuaGVpZ2h0PWR8fDAsdGhpcy5yYWRpdXM9ZXx8MjB9LGIuUm91bmRlZFJlY3RhbmdsZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGIuUm91bmRlZFJlY3RhbmdsZSh0aGlzLngsdGhpcy55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQsdGhpcy5yYWRpdXMpfSxiLlJvdW5kZWRSZWN0YW5nbGUucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7aWYodGhpcy53aWR0aDw9MHx8dGhpcy5oZWlnaHQ8PTApcmV0dXJuITE7dmFyIGM9dGhpcy54O2lmKGE+PWMmJmE8PWMrdGhpcy53aWR0aCl7dmFyIGQ9dGhpcy55O2lmKGI+PWQmJmI8PWQrdGhpcy5oZWlnaHQpcmV0dXJuITB9cmV0dXJuITF9LGIuUm91bmRlZFJlY3RhbmdsZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5Sb3VuZGVkUmVjdGFuZ2xlLGIuTWF0cml4PWZ1bmN0aW9uKCl7dGhpcy5hPTEsdGhpcy5iPTAsdGhpcy5jPTAsdGhpcy5kPTEsdGhpcy50eD0wLHRoaXMudHk9MH0sYi5NYXRyaXgucHJvdG90eXBlLmZyb21BcnJheT1mdW5jdGlvbihhKXt0aGlzLmE9YVswXSx0aGlzLmI9YVsxXSx0aGlzLmM9YVszXSx0aGlzLmQ9YVs0XSx0aGlzLnR4PWFbMl0sdGhpcy50eT1hWzVdfSxiLk1hdHJpeC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbihhKXt0aGlzLmFycmF5fHwodGhpcy5hcnJheT1uZXcgYi5GbG9hdDMyQXJyYXkoOSkpO3ZhciBjPXRoaXMuYXJyYXk7cmV0dXJuIGE/KGNbMF09dGhpcy5hLGNbMV09dGhpcy5iLGNbMl09MCxjWzNdPXRoaXMuYyxjWzRdPXRoaXMuZCxjWzVdPTAsY1s2XT10aGlzLnR4LGNbN109dGhpcy50eSxjWzhdPTEpOihjWzBdPXRoaXMuYSxjWzFdPXRoaXMuYyxjWzJdPXRoaXMudHgsY1szXT10aGlzLmIsY1s0XT10aGlzLmQsY1s1XT10aGlzLnR5LGNbNl09MCxjWzddPTAsY1s4XT0xKSxjfSxiLk1hdHJpeC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz1jfHxuZXcgYi5Qb2ludCxjLng9dGhpcy5hKmEueCt0aGlzLmMqYS55K3RoaXMudHgsYy55PXRoaXMuYiphLngrdGhpcy5kKmEueSt0aGlzLnR5LGN9LGIuTWF0cml4LnByb3RvdHlwZS5hcHBseUludmVyc2U9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBiLlBvaW50O3ZhciBkPTEvKHRoaXMuYSp0aGlzLmQrdGhpcy5jKi10aGlzLmIpO3JldHVybiBjLng9dGhpcy5kKmQqYS54Ky10aGlzLmMqZCphLnkrKHRoaXMudHkqdGhpcy5jLXRoaXMudHgqdGhpcy5kKSpkLGMueT10aGlzLmEqZCphLnkrLXRoaXMuYipkKmEueCsoLXRoaXMudHkqdGhpcy5hK3RoaXMudHgqdGhpcy5iKSpkLGN9LGIuTWF0cml4LnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy50eCs9YSx0aGlzLnR5Kz1iLHRoaXN9LGIuTWF0cml4LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEqPWEsdGhpcy5kKj1iLHRoaXMuYyo9YSx0aGlzLmIqPWIsdGhpcy50eCo9YSx0aGlzLnR5Kj1iLHRoaXN9LGIuTWF0cml4LnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5jb3MoYSksYz1NYXRoLnNpbihhKSxkPXRoaXMuYSxlPXRoaXMuYyxmPXRoaXMudHg7cmV0dXJuIHRoaXMuYT1kKmItdGhpcy5iKmMsdGhpcy5iPWQqYyt0aGlzLmIqYix0aGlzLmM9ZSpiLXRoaXMuZCpjLHRoaXMuZD1lKmMrdGhpcy5kKmIsdGhpcy50eD1mKmItdGhpcy50eSpjLHRoaXMudHk9ZipjK3RoaXMudHkqYix0aGlzfSxiLk1hdHJpeC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYSxjPXRoaXMuYixkPXRoaXMuYyxlPXRoaXMuZDtyZXR1cm4gdGhpcy5hPWEuYSpiK2EuYipkLHRoaXMuYj1hLmEqYythLmIqZSx0aGlzLmM9YS5jKmIrYS5kKmQsdGhpcy5kPWEuYypjK2EuZCplLHRoaXMudHg9YS50eCpiK2EudHkqZCt0aGlzLnR4LHRoaXMudHk9YS50eCpjK2EudHkqZSt0aGlzLnR5LHRoaXN9LGIuTWF0cml4LnByb3RvdHlwZS5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmE9MSx0aGlzLmI9MCx0aGlzLmM9MCx0aGlzLmQ9MSx0aGlzLnR4PTAsdGhpcy50eT0wLHRoaXN9LGIuaWRlbnRpdHlNYXRyaXg9bmV3IGIuTWF0cml4LGIuRGlzcGxheU9iamVjdD1mdW5jdGlvbigpe3RoaXMucG9zaXRpb249bmV3IGIuUG9pbnQsdGhpcy5zY2FsZT1uZXcgYi5Qb2ludCgxLDEpLHRoaXMucGl2b3Q9bmV3IGIuUG9pbnQoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5hbHBoYT0xLHRoaXMudmlzaWJsZT0hMCx0aGlzLmhpdEFyZWE9bnVsbCx0aGlzLmJ1dHRvbk1vZGU9ITEsdGhpcy5yZW5kZXJhYmxlPSExLHRoaXMucGFyZW50PW51bGwsdGhpcy5zdGFnZT1udWxsLHRoaXMud29ybGRBbHBoYT0xLHRoaXMuX2ludGVyYWN0aXZlPSExLHRoaXMuZGVmYXVsdEN1cnNvcj1cInBvaW50ZXJcIix0aGlzLndvcmxkVHJhbnNmb3JtPW5ldyBiLk1hdHJpeCx0aGlzLl9zcj0wLHRoaXMuX2NyPTEsdGhpcy5maWx0ZXJBcmVhPW51bGwsdGhpcy5fYm91bmRzPW5ldyBiLlJlY3RhbmdsZSgwLDAsMSwxKSx0aGlzLl9jdXJyZW50Qm91bmRzPW51bGwsdGhpcy5fbWFzaz1udWxsLHRoaXMuX2NhY2hlQXNCaXRtYXA9ITEsdGhpcy5fY2FjaGVJc0RpcnR5PSExfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuRGlzcGxheU9iamVjdCxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZSxcImludGVyYWN0aXZlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcmFjdGl2ZX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX2ludGVyYWN0aXZlPWEsdGhpcy5zdGFnZSYmKHRoaXMuc3RhZ2UuZGlydHk9ITApfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLFwid29ybGRWaXNpYmxlXCIse2dldDpmdW5jdGlvbigpe3ZhciBhPXRoaXM7ZG97aWYoIWEudmlzaWJsZSlyZXR1cm4hMTthPWEucGFyZW50fXdoaWxlKGEpO3JldHVybiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLFwibWFza1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFza30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX21hc2smJih0aGlzLl9tYXNrLmlzTWFzaz0hMSksdGhpcy5fbWFzaz1hLHRoaXMuX21hc2smJih0aGlzLl9tYXNrLmlzTWFzaz0hMCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuRGlzcGxheU9iamVjdC5wcm90b3R5cGUsXCJmaWx0ZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9maWx0ZXJzfSxzZXQ6ZnVuY3Rpb24oYSl7aWYoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKylmb3IodmFyIGQ9YVtjXS5wYXNzZXMsZT0wO2U8ZC5sZW5ndGg7ZSsrKWIucHVzaChkW2VdKTt0aGlzLl9maWx0ZXJCbG9jaz17dGFyZ2V0OnRoaXMsZmlsdGVyUGFzc2VzOmJ9fXRoaXMuX2ZpbHRlcnM9YX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZSxcImNhY2hlQXNCaXRtYXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhY2hlQXNCaXRtYXB9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9jYWNoZUFzQml0bWFwIT09YSYmKGE/dGhpcy5fZ2VuZXJhdGVDYWNoZWRTcHJpdGUoKTp0aGlzLl9kZXN0cm95Q2FjaGVkU3ByaXRlKCksdGhpcy5fY2FjaGVBc0JpdG1hcD1hKX19KSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbigpe3ZhciBhLGMsZCxlLGYsZyxoPXRoaXMucGFyZW50LndvcmxkVHJhbnNmb3JtLGk9dGhpcy53b3JsZFRyYW5zZm9ybTt0aGlzLnJvdGF0aW9uJWIuUElfMj8odGhpcy5yb3RhdGlvbiE9PXRoaXMucm90YXRpb25DYWNoZSYmKHRoaXMucm90YXRpb25DYWNoZT10aGlzLnJvdGF0aW9uLHRoaXMuX3NyPU1hdGguc2luKHRoaXMucm90YXRpb24pLHRoaXMuX2NyPU1hdGguY29zKHRoaXMucm90YXRpb24pKSxhPXRoaXMuX2NyKnRoaXMuc2NhbGUueCxjPXRoaXMuX3NyKnRoaXMuc2NhbGUueCxkPS10aGlzLl9zcip0aGlzLnNjYWxlLnksZT10aGlzLl9jcip0aGlzLnNjYWxlLnksZj10aGlzLnBvc2l0aW9uLngsZz10aGlzLnBvc2l0aW9uLnksKHRoaXMucGl2b3QueHx8dGhpcy5waXZvdC55KSYmKGYtPXRoaXMucGl2b3QueCphK3RoaXMucGl2b3QueSpkLGctPXRoaXMucGl2b3QueCpjK3RoaXMucGl2b3QueSplKSxpLmE9YSpoLmErYypoLmMsaS5iPWEqaC5iK2MqaC5kLGkuYz1kKmguYStlKmguYyxpLmQ9ZCpoLmIrZSpoLmQsaS50eD1mKmguYStnKmguYytoLnR4LGkudHk9ZipoLmIrZypoLmQraC50eSk6KGE9dGhpcy5zY2FsZS54LGU9dGhpcy5zY2FsZS55LGY9dGhpcy5wb3NpdGlvbi54LXRoaXMucGl2b3QueCphLGc9dGhpcy5wb3NpdGlvbi55LXRoaXMucGl2b3QueSplLGkuYT1hKmguYSxpLmI9YSpoLmIsaS5jPWUqaC5jLGkuZD1lKmguZCxpLnR4PWYqaC5hK2cqaC5jK2gudHgsaS50eT1mKmguYitnKmguZCtoLnR5KSx0aGlzLndvcmxkQWxwaGE9dGhpcy5hbHBoYSp0aGlzLnBhcmVudC53b3JsZEFscGhhfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLmRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm09Yi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm0sYi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YSxiLkVtcHR5UmVjdGFuZ2xlfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLmdldExvY2FsQm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Qm91bmRzKGIuaWRlbnRpdHlNYXRyaXgpfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLnNldFN0YWdlUmVmZXJlbmNlPWZ1bmN0aW9uKGEpe3RoaXMuc3RhZ2U9YSx0aGlzLl9pbnRlcmFjdGl2ZSYmKHRoaXMuc3RhZ2UuZGlydHk9ITApfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLmdlbmVyYXRlVGV4dHVyZT1mdW5jdGlvbihhLGMsZCl7dmFyIGU9dGhpcy5nZXRMb2NhbEJvdW5kcygpLGY9bmV3IGIuUmVuZGVyVGV4dHVyZSgwfGUud2lkdGgsMHxlLmhlaWdodCxkLGMsYSk7cmV0dXJuIGIuRGlzcGxheU9iamVjdC5fdGVtcE1hdHJpeC50eD0tZS54LGIuRGlzcGxheU9iamVjdC5fdGVtcE1hdHJpeC50eT0tZS55LGYucmVuZGVyKHRoaXMsYi5EaXNwbGF5T2JqZWN0Ll90ZW1wTWF0cml4KSxmfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLnVwZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fZ2VuZXJhdGVDYWNoZWRTcHJpdGUoKX0sYi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS50b0dsb2JhbD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kaXNwbGF5T2JqZWN0VXBkYXRlVHJhbnNmb3JtKCksdGhpcy53b3JsZFRyYW5zZm9ybS5hcHBseShhKX0sYi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS50b0xvY2FsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGImJihhPWIudG9HbG9iYWwoYSkpLHRoaXMuZGlzcGxheU9iamVjdFVwZGF0ZVRyYW5zZm9ybSgpLHRoaXMud29ybGRUcmFuc2Zvcm0uYXBwbHlJbnZlcnNlKGEpfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLl9yZW5kZXJDYWNoZWRTcHJpdGU9ZnVuY3Rpb24oYSl7dGhpcy5fY2FjaGVkU3ByaXRlLndvcmxkQWxwaGE9dGhpcy53b3JsZEFscGhhLGEuZ2w/Yi5TcHJpdGUucHJvdG90eXBlLl9yZW5kZXJXZWJHTC5jYWxsKHRoaXMuX2NhY2hlZFNwcml0ZSxhKTpiLlNwcml0ZS5wcm90b3R5cGUuX3JlbmRlckNhbnZhcy5jYWxsKHRoaXMuX2NhY2hlZFNwcml0ZSxhKX0sYi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5fZ2VuZXJhdGVDYWNoZWRTcHJpdGU9ZnVuY3Rpb24oKXt0aGlzLl9jYWNoZUFzQml0bWFwPSExO3ZhciBhPXRoaXMuZ2V0TG9jYWxCb3VuZHMoKTtpZih0aGlzLl9jYWNoZWRTcHJpdGUpdGhpcy5fY2FjaGVkU3ByaXRlLnRleHR1cmUucmVzaXplKDB8YS53aWR0aCwwfGEuaGVpZ2h0KTtlbHNle3ZhciBjPW5ldyBiLlJlbmRlclRleHR1cmUoMHxhLndpZHRoLDB8YS5oZWlnaHQpO3RoaXMuX2NhY2hlZFNwcml0ZT1uZXcgYi5TcHJpdGUoYyksdGhpcy5fY2FjaGVkU3ByaXRlLndvcmxkVHJhbnNmb3JtPXRoaXMud29ybGRUcmFuc2Zvcm19dmFyIGQ9dGhpcy5fZmlsdGVyczt0aGlzLl9maWx0ZXJzPW51bGwsdGhpcy5fY2FjaGVkU3ByaXRlLmZpbHRlcnM9ZCxiLkRpc3BsYXlPYmplY3QuX3RlbXBNYXRyaXgudHg9LWEueCxiLkRpc3BsYXlPYmplY3QuX3RlbXBNYXRyaXgudHk9LWEueSx0aGlzLl9jYWNoZWRTcHJpdGUudGV4dHVyZS5yZW5kZXIodGhpcyxiLkRpc3BsYXlPYmplY3QuX3RlbXBNYXRyaXgsITApLHRoaXMuX2NhY2hlZFNwcml0ZS5hbmNob3IueD0tKGEueC9hLndpZHRoKSx0aGlzLl9jYWNoZWRTcHJpdGUuYW5jaG9yLnk9LShhLnkvYS5oZWlnaHQpLHRoaXMuX2ZpbHRlcnM9ZCx0aGlzLl9jYWNoZUFzQml0bWFwPSEwfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLl9kZXN0cm95Q2FjaGVkU3ByaXRlPWZ1bmN0aW9uKCl7dGhpcy5fY2FjaGVkU3ByaXRlJiYodGhpcy5fY2FjaGVkU3ByaXRlLnRleHR1cmUuZGVzdHJveSghMCksdGhpcy5fY2FjaGVkU3ByaXRlPW51bGwpfSxiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLl9yZW5kZXJXZWJHTD1mdW5jdGlvbihhKXthPWF9LGIuRGlzcGxheU9iamVjdC5wcm90b3R5cGUuX3JlbmRlckNhbnZhcz1mdW5jdGlvbihhKXthPWF9LGIuRGlzcGxheU9iamVjdC5fdGVtcE1hdHJpeD1uZXcgYi5NYXRyaXgsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuRGlzcGxheU9iamVjdC5wcm90b3R5cGUsXCJ4XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uLnh9LHNldDpmdW5jdGlvbihhKXt0aGlzLnBvc2l0aW9uLng9YX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZSxcInlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb24ueX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMucG9zaXRpb24ueT1hfX0pLGIuRGlzcGxheU9iamVjdENvbnRhaW5lcj1mdW5jdGlvbigpe2IuRGlzcGxheU9iamVjdC5jYWxsKHRoaXMpLHRoaXMuY2hpbGRyZW49W119LGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLkRpc3BsYXlPYmplY3QucHJvdG90eXBlKSxiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuRGlzcGxheU9iamVjdENvbnRhaW5lcixPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZSxcIndpZHRoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjYWxlLngqdGhpcy5nZXRMb2NhbEJvdW5kcygpLndpZHRofSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRMb2NhbEJvdW5kcygpLndpZHRoO3RoaXMuc2NhbGUueD0wIT09Yj9hL2I6MSx0aGlzLl93aWR0aD1hfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLFwiaGVpZ2h0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjYWxlLnkqdGhpcy5nZXRMb2NhbEJvdW5kcygpLmhlaWdodH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0TG9jYWxCb3VuZHMoKS5oZWlnaHQ7dGhpcy5zY2FsZS55PTAhPT1iP2EvYjoxLHRoaXMuX2hlaWdodD1hfX0pLGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUuYWRkQ2hpbGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkQ2hpbGRBdChhLHRoaXMuY2hpbGRyZW4ubGVuZ3RoKX0sYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZS5hZGRDaGlsZEF0PWZ1bmN0aW9uKGEsYil7aWYoYj49MCYmYjw9dGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIGEucGFyZW50JiZhLnBhcmVudC5yZW1vdmVDaGlsZChhKSxhLnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGIsMCxhKSx0aGlzLnN0YWdlJiZhLnNldFN0YWdlUmVmZXJlbmNlKHRoaXMuc3RhZ2UpLGE7dGhyb3cgbmV3IEVycm9yKGErXCJhZGRDaGlsZEF0OiBUaGUgaW5kZXggXCIrYitcIiBzdXBwbGllZCBpcyBvdXQgb2YgYm91bmRzIFwiK3RoaXMuY2hpbGRyZW4ubGVuZ3RoKX0sYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZS5zd2FwQ2hpbGRyZW49ZnVuY3Rpb24oYSxiKXtpZihhIT09Yil7dmFyIGM9dGhpcy5nZXRDaGlsZEluZGV4KGEpLGQ9dGhpcy5nZXRDaGlsZEluZGV4KGIpO2lmKDA+Y3x8MD5kKXRocm93IG5ldyBFcnJvcihcInN3YXBDaGlsZHJlbjogQm90aCB0aGUgc3VwcGxpZWQgRGlzcGxheU9iamVjdHMgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBjYWxsZXIuXCIpO3RoaXMuY2hpbGRyZW5bY109Yix0aGlzLmNoaWxkcmVuW2RdPWF9fSxiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLmdldENoaWxkSW5kZXg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGlsZHJlbi5pbmRleE9mKGEpO2lmKC0xPT09Yil0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3VwcGxpZWQgRGlzcGxheU9iamVjdCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIGNhbGxlclwiKTtyZXR1cm4gYn0sYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZS5zZXRDaGlsZEluZGV4PWZ1bmN0aW9uKGEsYil7aWYoMD5ifHxiPj10aGlzLmNoaWxkcmVuLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3VwcGxpZWQgaW5kZXggaXMgb3V0IG9mIGJvdW5kc1wiKTt2YXIgYz10aGlzLmdldENoaWxkSW5kZXgoYSk7dGhpcy5jaGlsZHJlbi5zcGxpY2UoYywxKSx0aGlzLmNoaWxkcmVuLnNwbGljZShiLDAsYSl9LGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUuZ2V0Q2hpbGRBdD1mdW5jdGlvbihhKXtpZigwPmF8fGE+PXRoaXMuY2hpbGRyZW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcImdldENoaWxkQXQ6IFN1cHBsaWVkIGluZGV4IFwiK2ErXCIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNoaWxkIGxpc3QsIG9yIHRoZSBzdXBwbGllZCBEaXNwbGF5T2JqZWN0IG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgY2FsbGVyXCIpO3JldHVybiB0aGlzLmNoaWxkcmVuW2FdfSxiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hpbGRyZW4uaW5kZXhPZihhKTtpZigtMSE9PWIpcmV0dXJuIHRoaXMucmVtb3ZlQ2hpbGRBdChiKX0sYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZS5yZW1vdmVDaGlsZEF0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0Q2hpbGRBdChhKTtyZXR1cm4gdGhpcy5zdGFnZSYmYi5yZW1vdmVTdGFnZVJlZmVyZW5jZSgpLGIucGFyZW50PXZvaWQgMCx0aGlzLmNoaWxkcmVuLnNwbGljZShhLDEpLGJ9LGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1hfHwwLGQ9XCJudW1iZXJcIj09dHlwZW9mIGI/Yjp0aGlzLmNoaWxkcmVuLmxlbmd0aCxlPWQtYztpZihlPjAmJmQ+PWUpe2Zvcih2YXIgZj10aGlzLmNoaWxkcmVuLnNwbGljZShjLGUpLGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTt0aGlzLnN0YWdlJiZoLnJlbW92ZVN0YWdlUmVmZXJlbmNlKCksaC5wYXJlbnQ9dm9pZCAwfXJldHVybiBmfWlmKDA9PT1lJiYwPT09dGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuW107dGhyb3cgbmV3IEVycm9yKFwicmVtb3ZlQ2hpbGRyZW46IFJhbmdlIEVycm9yLCBudW1lcmljIHZhbHVlcyBhcmUgb3V0c2lkZSB0aGUgYWNjZXB0YWJsZSByYW5nZVwiKX0sYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm09ZnVuY3Rpb24oKXtpZih0aGlzLnZpc2libGUmJih0aGlzLmRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm0oKSwhdGhpcy5fY2FjaGVBc0JpdG1hcCkpZm9yKHZhciBhPTAsYj10aGlzLmNoaWxkcmVuLmxlbmd0aDtiPmE7YSsrKXRoaXMuY2hpbGRyZW5bYV0udXBkYXRlVHJhbnNmb3JtKCl9LGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUuZGlzcGxheU9iamVjdENvbnRhaW5lclVwZGF0ZVRyYW5zZm9ybT1iLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybSxiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbigpe2lmKDA9PT10aGlzLmNoaWxkcmVuLmxlbmd0aClyZXR1cm4gYi5FbXB0eVJlY3RhbmdsZTtmb3IodmFyIGEsYyxkLGU9MS8wLGY9MS8wLGc9LTEvMCxoPS0xLzAsaT0hMSxqPTAsaz10aGlzLmNoaWxkcmVuLmxlbmd0aDtrPmo7aisrKXt2YXIgbD10aGlzLmNoaWxkcmVuW2pdO2wudmlzaWJsZSYmKGk9ITAsYT10aGlzLmNoaWxkcmVuW2pdLmdldEJvdW5kcygpLGU9ZTxhLng/ZTphLngsZj1mPGEueT9mOmEueSxjPWEud2lkdGgrYS54LGQ9YS5oZWlnaHQrYS55LGc9Zz5jP2c6YyxoPWg+ZD9oOmQpfWlmKCFpKXJldHVybiBiLkVtcHR5UmVjdGFuZ2xlO3ZhciBtPXRoaXMuX2JvdW5kcztyZXR1cm4gbS54PWUsbS55PWYsbS53aWR0aD1nLWUsbS5oZWlnaHQ9aC1mLG19LGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUuZ2V0TG9jYWxCb3VuZHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndvcmxkVHJhbnNmb3JtO3RoaXMud29ybGRUcmFuc2Zvcm09Yi5pZGVudGl0eU1hdHJpeDtmb3IodmFyIGM9MCxkPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2Q+YztjKyspdGhpcy5jaGlsZHJlbltjXS51cGRhdGVUcmFuc2Zvcm0oKTt2YXIgZT10aGlzLmdldEJvdW5kcygpO3JldHVybiB0aGlzLndvcmxkVHJhbnNmb3JtPWEsZX0sYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZS5zZXRTdGFnZVJlZmVyZW5jZT1mdW5jdGlvbihhKXt0aGlzLnN0YWdlPWEsdGhpcy5faW50ZXJhY3RpdmUmJih0aGlzLnN0YWdlLmRpcnR5PSEwKTtmb3IodmFyIGI9MCxjPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2M+YjtiKyspe3ZhciBkPXRoaXMuY2hpbGRyZW5bYl07ZC5zZXRTdGFnZVJlZmVyZW5jZShhKX19LGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUucmVtb3ZlU3RhZ2VSZWZlcmVuY2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2I+YTthKyspe3ZhciBjPXRoaXMuY2hpbGRyZW5bYV07Yy5yZW1vdmVTdGFnZVJlZmVyZW5jZSgpfXRoaXMuX2ludGVyYWN0aXZlJiYodGhpcy5zdGFnZS5kaXJ0eT0hMCksdGhpcy5zdGFnZT1udWxsfSxiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLl9yZW5kZXJXZWJHTD1mdW5jdGlvbihhKXtpZih0aGlzLnZpc2libGUmJiEodGhpcy5hbHBoYTw9MCkpe2lmKHRoaXMuX2NhY2hlQXNCaXRtYXApcmV0dXJuIHZvaWQgdGhpcy5fcmVuZGVyQ2FjaGVkU3ByaXRlKGEpO3ZhciBiLGM7aWYodGhpcy5fbWFza3x8dGhpcy5fZmlsdGVycyl7Zm9yKHRoaXMuX2ZpbHRlcnMmJihhLnNwcml0ZUJhdGNoLmZsdXNoKCksYS5maWx0ZXJNYW5hZ2VyLnB1c2hGaWx0ZXIodGhpcy5fZmlsdGVyQmxvY2spKSx0aGlzLl9tYXNrJiYoYS5zcHJpdGVCYXRjaC5zdG9wKCksYS5tYXNrTWFuYWdlci5wdXNoTWFzayh0aGlzLm1hc2ssYSksYS5zcHJpdGVCYXRjaC5zdGFydCgpKSxiPTAsYz10aGlzLmNoaWxkcmVuLmxlbmd0aDtjPmI7YisrKXRoaXMuY2hpbGRyZW5bYl0uX3JlbmRlcldlYkdMKGEpO2Euc3ByaXRlQmF0Y2guc3RvcCgpLHRoaXMuX21hc2smJmEubWFza01hbmFnZXIucG9wTWFzayh0aGlzLl9tYXNrLGEpLHRoaXMuX2ZpbHRlcnMmJmEuZmlsdGVyTWFuYWdlci5wb3BGaWx0ZXIoKSxhLnNwcml0ZUJhdGNoLnN0YXJ0KCl9ZWxzZSBmb3IoYj0wLGM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7Yz5iO2IrKyl0aGlzLmNoaWxkcmVuW2JdLl9yZW5kZXJXZWJHTChhKX19LGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUuX3JlbmRlckNhbnZhcz1mdW5jdGlvbihhKXtpZih0aGlzLnZpc2libGUhPT0hMSYmMCE9PXRoaXMuYWxwaGEpe2lmKHRoaXMuX2NhY2hlQXNCaXRtYXApcmV0dXJuIHZvaWQgdGhpcy5fcmVuZGVyQ2FjaGVkU3ByaXRlKGEpO3RoaXMuX21hc2smJmEubWFza01hbmFnZXIucHVzaE1hc2sodGhpcy5fbWFzayxhKTtmb3IodmFyIGI9MCxjPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2M+YjtiKyspe3ZhciBkPXRoaXMuY2hpbGRyZW5bYl07ZC5fcmVuZGVyQ2FudmFzKGEpfXRoaXMuX21hc2smJmEubWFza01hbmFnZXIucG9wTWFzayhhKX19LGIuU3ByaXRlPWZ1bmN0aW9uKGEpe2IuRGlzcGxheU9iamVjdENvbnRhaW5lci5jYWxsKHRoaXMpLHRoaXMuYW5jaG9yPW5ldyBiLlBvaW50LHRoaXMudGV4dHVyZT1hfHxiLlRleHR1cmUuZW1wdHlUZXh0dXJlLHRoaXMuX3dpZHRoPTAsdGhpcy5faGVpZ2h0PTAsdGhpcy50aW50PTE2Nzc3MjE1LHRoaXMuYmxlbmRNb2RlPWIuYmxlbmRNb2Rlcy5OT1JNQUwsdGhpcy5zaGFkZXI9bnVsbCx0aGlzLnRleHR1cmUuYmFzZVRleHR1cmUuaGFzTG9hZGVkP3RoaXMub25UZXh0dXJlVXBkYXRlKCk6dGhpcy50ZXh0dXJlLm9uKFwidXBkYXRlXCIsdGhpcy5vblRleHR1cmVVcGRhdGUuYmluZCh0aGlzKSksdGhpcy5yZW5kZXJhYmxlPSEwfSxiLlNwcml0ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlKSxiLlNwcml0ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5TcHJpdGUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuU3ByaXRlLnByb3RvdHlwZSxcIndpZHRoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjYWxlLngqdGhpcy50ZXh0dXJlLmZyYW1lLndpZHRofSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5zY2FsZS54PWEvdGhpcy50ZXh0dXJlLmZyYW1lLndpZHRoLHRoaXMuX3dpZHRoPWF9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuU3ByaXRlLnByb3RvdHlwZSxcImhlaWdodFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY2FsZS55KnRoaXMudGV4dHVyZS5mcmFtZS5oZWlnaHR9LHNldDpmdW5jdGlvbihhKXt0aGlzLnNjYWxlLnk9YS90aGlzLnRleHR1cmUuZnJhbWUuaGVpZ2h0LHRoaXMuX2hlaWdodD1hfX0pLGIuU3ByaXRlLnByb3RvdHlwZS5zZXRUZXh0dXJlPWZ1bmN0aW9uKGEpe3RoaXMudGV4dHVyZT1hLHRoaXMuY2FjaGVkVGludD0xNjc3NzIxNX0sYi5TcHJpdGUucHJvdG90eXBlLm9uVGV4dHVyZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dpZHRoJiYodGhpcy5zY2FsZS54PXRoaXMuX3dpZHRoL3RoaXMudGV4dHVyZS5mcmFtZS53aWR0aCksdGhpcy5faGVpZ2h0JiYodGhpcy5zY2FsZS55PXRoaXMuX2hlaWdodC90aGlzLnRleHR1cmUuZnJhbWUuaGVpZ2h0KX0sYi5TcHJpdGUucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRleHR1cmUuZnJhbWUud2lkdGgsYz10aGlzLnRleHR1cmUuZnJhbWUuaGVpZ2h0LGQ9YiooMS10aGlzLmFuY2hvci54KSxlPWIqLXRoaXMuYW5jaG9yLngsZj1jKigxLXRoaXMuYW5jaG9yLnkpLGc9YyotdGhpcy5hbmNob3IueSxoPWF8fHRoaXMud29ybGRUcmFuc2Zvcm0saT1oLmEsaj1oLmIsaz1oLmMsbD1oLmQsbT1oLnR4LG49aC50eSxvPS0xLzAscD0tMS8wLHE9MS8wLHI9MS8wO2lmKDA9PT1qJiYwPT09aykwPmkmJihpKj0tMSksMD5sJiYobCo9LTEpLHE9aSplK20sbz1pKmQrbSxyPWwqZytuLHA9bCpmK247ZWxzZXt2YXIgcz1pKmUraypnK20sdD1sKmcraiplK24sdT1pKmQraypnK20sdj1sKmcraipkK24sdz1pKmQraypmK20seD1sKmYraipkK24seT1pKmUraypmK20sej1sKmYraiplK247cT1xPnM/czpxLHE9cT51P3U6cSxxPXE+dz93OnEscT1xPnk/eTpxLHI9cj50P3Q6cixyPXI+dj92OnIscj1yPng/eDpyLHI9cj56P3o6cixvPXM+bz9zOm8sbz11Pm8/dTpvLG89dz5vP3c6byxvPXk+bz95Om8scD10PnA/dDpwLHA9dj5wP3Y6cCxwPXg+cD94OnAscD16PnA/ejpwfXZhciBBPXRoaXMuX2JvdW5kcztyZXR1cm4gQS54PXEsQS53aWR0aD1vLXEsQS55PXIsQS5oZWlnaHQ9cC1yLHRoaXMuX2N1cnJlbnRCb3VuZHM9QSxBfSxiLlNwcml0ZS5wcm90b3R5cGUuX3JlbmRlcldlYkdMPWZ1bmN0aW9uKGEpe2lmKHRoaXMudmlzaWJsZSYmISh0aGlzLmFscGhhPD0wKSl7dmFyIGIsYztpZih0aGlzLl9tYXNrfHx0aGlzLl9maWx0ZXJzKXt2YXIgZD1hLnNwcml0ZUJhdGNoO2Zvcih0aGlzLl9maWx0ZXJzJiYoZC5mbHVzaCgpLGEuZmlsdGVyTWFuYWdlci5wdXNoRmlsdGVyKHRoaXMuX2ZpbHRlckJsb2NrKSksdGhpcy5fbWFzayYmKGQuc3RvcCgpLGEubWFza01hbmFnZXIucHVzaE1hc2sodGhpcy5tYXNrLGEpLGQuc3RhcnQoKSksZC5yZW5kZXIodGhpcyksYj0wLGM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7Yz5iO2IrKyl0aGlzLmNoaWxkcmVuW2JdLl9yZW5kZXJXZWJHTChhKTtkLnN0b3AoKSx0aGlzLl9tYXNrJiZhLm1hc2tNYW5hZ2VyLnBvcE1hc2sodGhpcy5fbWFzayxhKSx0aGlzLl9maWx0ZXJzJiZhLmZpbHRlck1hbmFnZXIucG9wRmlsdGVyKCksZC5zdGFydCgpfWVsc2UgZm9yKGEuc3ByaXRlQmF0Y2gucmVuZGVyKHRoaXMpLGI9MCxjPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2M+YjtiKyspdGhpcy5jaGlsZHJlbltiXS5fcmVuZGVyV2ViR0woYSl9fSxiLlNwcml0ZS5wcm90b3R5cGUuX3JlbmRlckNhbnZhcz1mdW5jdGlvbihhKXtpZighKHRoaXMudmlzaWJsZT09PSExfHwwPT09dGhpcy5hbHBoYXx8dGhpcy50ZXh0dXJlLmNyb3Aud2lkdGg8PTB8fHRoaXMudGV4dHVyZS5jcm9wLmhlaWdodDw9MCkpe2lmKHRoaXMuYmxlbmRNb2RlIT09YS5jdXJyZW50QmxlbmRNb2RlJiYoYS5jdXJyZW50QmxlbmRNb2RlPXRoaXMuYmxlbmRNb2RlLGEuY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Yi5ibGVuZE1vZGVzQ2FudmFzW2EuY3VycmVudEJsZW5kTW9kZV0pLHRoaXMuX21hc2smJmEubWFza01hbmFnZXIucHVzaE1hc2sodGhpcy5fbWFzayxhKSx0aGlzLnRleHR1cmUudmFsaWQpe3ZhciBjPXRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5yZXNvbHV0aW9uL2EucmVzb2x1dGlvbjthLmNvbnRleHQuZ2xvYmFsQWxwaGE9dGhpcy53b3JsZEFscGhhLGEuc21vb3RoUHJvcGVydHkmJmEuc2NhbGVNb2RlIT09dGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlLnNjYWxlTW9kZSYmKGEuc2NhbGVNb2RlPXRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5zY2FsZU1vZGUsYS5jb250ZXh0W2Euc21vb3RoUHJvcGVydHldPWEuc2NhbGVNb2RlPT09Yi5zY2FsZU1vZGVzLkxJTkVBUik7dmFyIGQ9dGhpcy50ZXh0dXJlLnRyaW0/dGhpcy50ZXh0dXJlLnRyaW0ueC10aGlzLmFuY2hvci54KnRoaXMudGV4dHVyZS50cmltLndpZHRoOnRoaXMuYW5jaG9yLngqLXRoaXMudGV4dHVyZS5mcmFtZS53aWR0aCxlPXRoaXMudGV4dHVyZS50cmltP3RoaXMudGV4dHVyZS50cmltLnktdGhpcy5hbmNob3IueSp0aGlzLnRleHR1cmUudHJpbS5oZWlnaHQ6dGhpcy5hbmNob3IueSotdGhpcy50ZXh0dXJlLmZyYW1lLmhlaWdodDthLnJvdW5kUGl4ZWxzPyhhLmNvbnRleHQuc2V0VHJhbnNmb3JtKHRoaXMud29ybGRUcmFuc2Zvcm0uYSx0aGlzLndvcmxkVHJhbnNmb3JtLmIsdGhpcy53b3JsZFRyYW5zZm9ybS5jLHRoaXMud29ybGRUcmFuc2Zvcm0uZCx0aGlzLndvcmxkVHJhbnNmb3JtLnR4KmEucmVzb2x1dGlvbnwwLHRoaXMud29ybGRUcmFuc2Zvcm0udHkqYS5yZXNvbHV0aW9ufDApLGQ9MHxkLGU9MHxlKTphLmNvbnRleHQuc2V0VHJhbnNmb3JtKHRoaXMud29ybGRUcmFuc2Zvcm0uYSx0aGlzLndvcmxkVHJhbnNmb3JtLmIsdGhpcy53b3JsZFRyYW5zZm9ybS5jLHRoaXMud29ybGRUcmFuc2Zvcm0uZCx0aGlzLndvcmxkVHJhbnNmb3JtLnR4KmEucmVzb2x1dGlvbix0aGlzLndvcmxkVHJhbnNmb3JtLnR5KmEucmVzb2x1dGlvbiksMTY3NzcyMTUhPT10aGlzLnRpbnQ/KHRoaXMuY2FjaGVkVGludCE9PXRoaXMudGludCYmKHRoaXMuY2FjaGVkVGludD10aGlzLnRpbnQsdGhpcy50aW50ZWRUZXh0dXJlPWIuQ2FudmFzVGludGVyLmdldFRpbnRlZFRleHR1cmUodGhpcyx0aGlzLnRpbnQpKSxhLmNvbnRleHQuZHJhd0ltYWdlKHRoaXMudGludGVkVGV4dHVyZSwwLDAsdGhpcy50ZXh0dXJlLmNyb3Aud2lkdGgsdGhpcy50ZXh0dXJlLmNyb3AuaGVpZ2h0LGQvYyxlL2MsdGhpcy50ZXh0dXJlLmNyb3Aud2lkdGgvYyx0aGlzLnRleHR1cmUuY3JvcC5oZWlnaHQvYykpOmEuY29udGV4dC5kcmF3SW1hZ2UodGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlLnNvdXJjZSx0aGlzLnRleHR1cmUuY3JvcC54LHRoaXMudGV4dHVyZS5jcm9wLnksdGhpcy50ZXh0dXJlLmNyb3Aud2lkdGgsdGhpcy50ZXh0dXJlLmNyb3AuaGVpZ2h0LGQvYyxlL2MsdGhpcy50ZXh0dXJlLmNyb3Aud2lkdGgvYyx0aGlzLnRleHR1cmUuY3JvcC5oZWlnaHQvYyl9Zm9yKHZhciBmPTAsZz10aGlzLmNoaWxkcmVuLmxlbmd0aDtnPmY7ZisrKXRoaXMuY2hpbGRyZW5bZl0uX3JlbmRlckNhbnZhcyhhKTt0aGlzLl9tYXNrJiZhLm1hc2tNYW5hZ2VyLnBvcE1hc2soYSl9fSxiLlNwcml0ZS5mcm9tRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGM9Yi5UZXh0dXJlQ2FjaGVbYV07aWYoIWMpdGhyb3cgbmV3IEVycm9yKCdUaGUgZnJhbWVJZCBcIicrYSsnXCIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHRleHR1cmUgY2FjaGUnK3RoaXMpO3JldHVybiBuZXcgYi5TcHJpdGUoYyl9LGIuU3ByaXRlLmZyb21JbWFnZT1mdW5jdGlvbihhLGMsZCl7dmFyIGU9Yi5UZXh0dXJlLmZyb21JbWFnZShhLGMsZCk7cmV0dXJuIG5ldyBiLlNwcml0ZShlKX0sYi5TcHJpdGVCYXRjaD1mdW5jdGlvbihhKXtiLkRpc3BsYXlPYmplY3RDb250YWluZXIuY2FsbCh0aGlzKSx0aGlzLnRleHR1cmVUaGluZz1hLHRoaXMucmVhZHk9ITF9LGIuU3ByaXRlQmF0Y2gucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZSksYi5TcHJpdGVCYXRjaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5TcHJpdGVCYXRjaCxiLlNwcml0ZUJhdGNoLnByb3RvdHlwZS5pbml0V2ViR0w9ZnVuY3Rpb24oYSl7dGhpcy5mYXN0U3ByaXRlQmF0Y2g9bmV3IGIuV2ViR0xGYXN0U3ByaXRlQmF0Y2goYSksdGhpcy5yZWFkeT0hMH0sYi5TcHJpdGVCYXRjaC5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5T2JqZWN0VXBkYXRlVHJhbnNmb3JtKCl9LGIuU3ByaXRlQmF0Y2gucHJvdG90eXBlLl9yZW5kZXJXZWJHTD1mdW5jdGlvbihhKXshdGhpcy52aXNpYmxlfHx0aGlzLmFscGhhPD0wfHwhdGhpcy5jaGlsZHJlbi5sZW5ndGh8fCh0aGlzLnJlYWR5fHx0aGlzLmluaXRXZWJHTChhLmdsKSxhLnNwcml0ZUJhdGNoLnN0b3AoKSxhLnNoYWRlck1hbmFnZXIuc2V0U2hhZGVyKGEuc2hhZGVyTWFuYWdlci5mYXN0U2hhZGVyKSx0aGlzLmZhc3RTcHJpdGVCYXRjaC5iZWdpbih0aGlzLGEpLHRoaXMuZmFzdFNwcml0ZUJhdGNoLnJlbmRlcih0aGlzKSxhLnNwcml0ZUJhdGNoLnN0YXJ0KCkpfSxiLlNwcml0ZUJhdGNoLnByb3RvdHlwZS5fcmVuZGVyQ2FudmFzPWZ1bmN0aW9uKGEpe2lmKHRoaXMudmlzaWJsZSYmISh0aGlzLmFscGhhPD0wKSYmdGhpcy5jaGlsZHJlbi5sZW5ndGgpe3ZhciBiPWEuY29udGV4dDtiLmdsb2JhbEFscGhhPXRoaXMud29ybGRBbHBoYSx0aGlzLmRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm0oKTtmb3IodmFyIGM9dGhpcy53b3JsZFRyYW5zZm9ybSxkPSEwLGU9MDtlPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2UrKyl7dmFyIGY9dGhpcy5jaGlsZHJlbltlXTtpZihmLnZpc2libGUpe3ZhciBnPWYudGV4dHVyZSxoPWcuZnJhbWU7aWYoYi5nbG9iYWxBbHBoYT10aGlzLndvcmxkQWxwaGEqZi5hbHBoYSxmLnJvdGF0aW9uJSgyKk1hdGguUEkpPT09MClkJiYoYi5zZXRUcmFuc2Zvcm0oYy5hLGMuYixjLmMsYy5kLGMudHgsYy50eSksZD0hMSksYi5kcmF3SW1hZ2UoZy5iYXNlVGV4dHVyZS5zb3VyY2UsaC54LGgueSxoLndpZHRoLGguaGVpZ2h0LGYuYW5jaG9yLngqLWgud2lkdGgqZi5zY2FsZS54K2YucG9zaXRpb24ueCsuNXwwLGYuYW5jaG9yLnkqLWguaGVpZ2h0KmYuc2NhbGUueStmLnBvc2l0aW9uLnkrLjV8MCxoLndpZHRoKmYuc2NhbGUueCxoLmhlaWdodCpmLnNjYWxlLnkpO2Vsc2V7ZHx8KGQ9ITApLGYuZGlzcGxheU9iamVjdFVwZGF0ZVRyYW5zZm9ybSgpO3ZhciBpPWYud29ybGRUcmFuc2Zvcm07YS5yb3VuZFBpeGVscz9iLnNldFRyYW5zZm9ybShpLmEsaS5iLGkuYyxpLmQsMHxpLnR4LDB8aS50eSk6Yi5zZXRUcmFuc2Zvcm0oaS5hLGkuYixpLmMsaS5kLGkudHgsaS50eSksYi5kcmF3SW1hZ2UoZy5iYXNlVGV4dHVyZS5zb3VyY2UsaC54LGgueSxoLndpZHRoLGguaGVpZ2h0LGYuYW5jaG9yLngqLWgud2lkdGgrLjV8MCxmLmFuY2hvci55Ki1oLmhlaWdodCsuNXwwLGgud2lkdGgsaC5oZWlnaHQpfX19fX0sYi5Nb3ZpZUNsaXA9ZnVuY3Rpb24oYSl7Yi5TcHJpdGUuY2FsbCh0aGlzLGFbMF0pLHRoaXMudGV4dHVyZXM9YSx0aGlzLmFuaW1hdGlvblNwZWVkPTEsdGhpcy5sb29wPSEwLHRoaXMub25Db21wbGV0ZT1udWxsLHRoaXMuY3VycmVudEZyYW1lPTAsdGhpcy5wbGF5aW5nPSExfSxiLk1vdmllQ2xpcC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLlNwcml0ZS5wcm90b3R5cGUpLGIuTW92aWVDbGlwLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLk1vdmllQ2xpcCxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5Nb3ZpZUNsaXAucHJvdG90eXBlLFwidG90YWxGcmFtZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dHVyZXMubGVuZ3RofX0pLGIuTW92aWVDbGlwLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5wbGF5aW5nPSExfSxiLk1vdmllQ2xpcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMucGxheWluZz0hMH0sYi5Nb3ZpZUNsaXAucHJvdG90eXBlLmdvdG9BbmRTdG9wPWZ1bmN0aW9uKGEpe3RoaXMucGxheWluZz0hMSx0aGlzLmN1cnJlbnRGcmFtZT1hO3ZhciBiPXRoaXMuY3VycmVudEZyYW1lKy41fDA7dGhpcy5zZXRUZXh0dXJlKHRoaXMudGV4dHVyZXNbYiV0aGlzLnRleHR1cmVzLmxlbmd0aF0pfSxiLk1vdmllQ2xpcC5wcm90b3R5cGUuZ290b0FuZFBsYXk9ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50RnJhbWU9YSx0aGlzLnBsYXlpbmc9ITB9LGIuTW92aWVDbGlwLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm09ZnVuY3Rpb24oKXtpZih0aGlzLmRpc3BsYXlPYmplY3RDb250YWluZXJVcGRhdGVUcmFuc2Zvcm0oKSx0aGlzLnBsYXlpbmcpe3RoaXMuY3VycmVudEZyYW1lKz10aGlzLmFuaW1hdGlvblNwZWVkO3ZhciBhPXRoaXMuY3VycmVudEZyYW1lKy41fDA7dGhpcy5jdXJyZW50RnJhbWU9dGhpcy5jdXJyZW50RnJhbWUldGhpcy50ZXh0dXJlcy5sZW5ndGgsdGhpcy5sb29wfHxhPHRoaXMudGV4dHVyZXMubGVuZ3RoP3RoaXMuc2V0VGV4dHVyZSh0aGlzLnRleHR1cmVzW2EldGhpcy50ZXh0dXJlcy5sZW5ndGhdKTphPj10aGlzLnRleHR1cmVzLmxlbmd0aCYmKHRoaXMuZ290b0FuZFN0b3AodGhpcy50ZXh0dXJlcy5sZW5ndGgtMSksdGhpcy5vbkNvbXBsZXRlJiZ0aGlzLm9uQ29tcGxldGUoKSl9fSxiLk1vdmllQ2xpcC5mcm9tRnJhbWVzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYy5wdXNoKG5ldyBiLlRleHR1cmUuZnJvbUZyYW1lKGFbZF0pKTtyZXR1cm4gbmV3IGIuTW92aWVDbGlwKGMpfSxiLk1vdmllQ2xpcC5mcm9tSW1hZ2VzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYy5wdXNoKG5ldyBiLlRleHR1cmUuZnJvbUltYWdlKGFbZF0pKTtyZXR1cm4gbmV3IGIuTW92aWVDbGlwKGMpfSxiLkZpbHRlckJsb2NrPWZ1bmN0aW9uKCl7dGhpcy52aXNpYmxlPSEwLHRoaXMucmVuZGVyYWJsZT0hMH0sYi5GaWx0ZXJCbG9jay5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5GaWx0ZXJCbG9jayxiLlRleHQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiksdGhpcy5yZXNvbHV0aW9uPTEsYi5TcHJpdGUuY2FsbCh0aGlzLGIuVGV4dHVyZS5mcm9tQ2FudmFzKHRoaXMuY2FudmFzKSksdGhpcy5zZXRUZXh0KGEpLHRoaXMuc2V0U3R5bGUoYyl9LGIuVGV4dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLlNwcml0ZS5wcm90b3R5cGUpLGIuVGV4dC5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5UZXh0LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLlRleHQucHJvdG90eXBlLFwid2lkdGhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlydHkmJih0aGlzLnVwZGF0ZVRleHQoKSx0aGlzLmRpcnR5PSExKSx0aGlzLnNjYWxlLngqdGhpcy50ZXh0dXJlLmZyYW1lLndpZHRofSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5zY2FsZS54PWEvdGhpcy50ZXh0dXJlLmZyYW1lLndpZHRoLHRoaXMuX3dpZHRoPWF9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuVGV4dC5wcm90b3R5cGUsXCJoZWlnaHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlydHkmJih0aGlzLnVwZGF0ZVRleHQoKSx0aGlzLmRpcnR5PSExKSx0aGlzLnNjYWxlLnkqdGhpcy50ZXh0dXJlLmZyYW1lLmhlaWdodH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuc2NhbGUueT1hL3RoaXMudGV4dHVyZS5mcmFtZS5oZWlnaHQsdGhpcy5faGVpZ2h0PWF9fSksYi5UZXh0LnByb3RvdHlwZS5zZXRTdHlsZT1mdW5jdGlvbihhKXthPWF8fHt9LGEuZm9udD1hLmZvbnR8fFwiYm9sZCAyMHB0IEFyaWFsXCIsYS5maWxsPWEuZmlsbHx8XCJibGFja1wiLGEuYWxpZ249YS5hbGlnbnx8XCJsZWZ0XCIsYS5zdHJva2U9YS5zdHJva2V8fFwiYmxhY2tcIixhLnN0cm9rZVRoaWNrbmVzcz1hLnN0cm9rZVRoaWNrbmVzc3x8MCxhLndvcmRXcmFwPWEud29yZFdyYXB8fCExLGEud29yZFdyYXBXaWR0aD1hLndvcmRXcmFwV2lkdGh8fDEwMCxhLmRyb3BTaGFkb3c9YS5kcm9wU2hhZG93fHwhMSxhLmRyb3BTaGFkb3dBbmdsZT1hLmRyb3BTaGFkb3dBbmdsZXx8TWF0aC5QSS82LGEuZHJvcFNoYWRvd0Rpc3RhbmNlPWEuZHJvcFNoYWRvd0Rpc3RhbmNlfHw0LGEuZHJvcFNoYWRvd0NvbG9yPWEuZHJvcFNoYWRvd0NvbG9yfHxcImJsYWNrXCIsdGhpcy5zdHlsZT1hLHRoaXMuZGlydHk9ITB9LGIuVGV4dC5wcm90b3R5cGUuc2V0VGV4dD1mdW5jdGlvbihhKXt0aGlzLnRleHQ9YS50b1N0cmluZygpfHxcIiBcIix0aGlzLmRpcnR5PSEwfSxiLlRleHQucHJvdG90eXBlLnVwZGF0ZVRleHQ9ZnVuY3Rpb24oKXt0aGlzLnRleHR1cmUuYmFzZVRleHR1cmUucmVzb2x1dGlvbj10aGlzLnJlc29sdXRpb24sdGhpcy5jb250ZXh0LmZvbnQ9dGhpcy5zdHlsZS5mb250O3ZhciBhPXRoaXMudGV4dDt0aGlzLnN0eWxlLndvcmRXcmFwJiYoYT10aGlzLndvcmRXcmFwKHRoaXMudGV4dCkpO2Zvcih2YXIgYj1hLnNwbGl0KC8oPzpcXHJcXG58XFxyfFxcbikvKSxjPVtdLGQ9MCxlPXRoaXMuZGV0ZXJtaW5lRm9udFByb3BlcnRpZXModGhpcy5zdHlsZS5mb250KSxmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBnPXRoaXMuY29udGV4dC5tZWFzdXJlVGV4dChiW2ZdKS53aWR0aDtjW2ZdPWcsZD1NYXRoLm1heChkLGcpfXZhciBoPWQrdGhpcy5zdHlsZS5zdHJva2VUaGlja25lc3M7dGhpcy5zdHlsZS5kcm9wU2hhZG93JiYoaCs9dGhpcy5zdHlsZS5kcm9wU2hhZG93RGlzdGFuY2UpLHRoaXMuY2FudmFzLndpZHRoPShoK3RoaXMuY29udGV4dC5saW5lV2lkdGgpKnRoaXMucmVzb2x1dGlvbjt2YXIgaT1lLmZvbnRTaXplK3RoaXMuc3R5bGUuc3Ryb2tlVGhpY2tuZXNzLGo9aSpiLmxlbmd0aDt0aGlzLnN0eWxlLmRyb3BTaGFkb3cmJihqKz10aGlzLnN0eWxlLmRyb3BTaGFkb3dEaXN0YW5jZSksdGhpcy5jYW52YXMuaGVpZ2h0PWoqdGhpcy5yZXNvbHV0aW9uLHRoaXMuY29udGV4dC5zY2FsZSh0aGlzLnJlc29sdXRpb24sdGhpcy5yZXNvbHV0aW9uKSxuYXZpZ2F0b3IuaXNDb2Nvb25KUyYmdGhpcy5jb250ZXh0LmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXMud2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0KSx0aGlzLmNvbnRleHQuZm9udD10aGlzLnN0eWxlLmZvbnQsdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlPXRoaXMuc3R5bGUuc3Ryb2tlLHRoaXMuY29udGV4dC5saW5lV2lkdGg9dGhpcy5zdHlsZS5zdHJva2VUaGlja25lc3MsdGhpcy5jb250ZXh0LnRleHRCYXNlbGluZT1cImFscGhhYmV0aWNcIjt2YXIgayxsO2lmKHRoaXMuc3R5bGUuZHJvcFNoYWRvdyl7dGhpcy5jb250ZXh0LmZpbGxTdHlsZT10aGlzLnN0eWxlLmRyb3BTaGFkb3dDb2xvcjt2YXIgbT1NYXRoLnNpbih0aGlzLnN0eWxlLmRyb3BTaGFkb3dBbmdsZSkqdGhpcy5zdHlsZS5kcm9wU2hhZG93RGlzdGFuY2Usbj1NYXRoLmNvcyh0aGlzLnN0eWxlLmRyb3BTaGFkb3dBbmdsZSkqdGhpcy5zdHlsZS5kcm9wU2hhZG93RGlzdGFuY2U7Zm9yKGY9MDtmPGIubGVuZ3RoO2YrKylrPXRoaXMuc3R5bGUuc3Ryb2tlVGhpY2tuZXNzLzIsbD10aGlzLnN0eWxlLnN0cm9rZVRoaWNrbmVzcy8yK2YqaStlLmFzY2VudCxcInJpZ2h0XCI9PT10aGlzLnN0eWxlLmFsaWduP2srPWQtY1tmXTpcImNlbnRlclwiPT09dGhpcy5zdHlsZS5hbGlnbiYmKGsrPShkLWNbZl0pLzIpLHRoaXMuc3R5bGUuZmlsbCYmdGhpcy5jb250ZXh0LmZpbGxUZXh0KGJbZl0sayttLGwrbil9Zm9yKHRoaXMuY29udGV4dC5maWxsU3R5bGU9dGhpcy5zdHlsZS5maWxsLGY9MDtmPGIubGVuZ3RoO2YrKylrPXRoaXMuc3R5bGUuc3Ryb2tlVGhpY2tuZXNzLzIsbD10aGlzLnN0eWxlLnN0cm9rZVRoaWNrbmVzcy8yK2YqaStlLmFzY2VudCxcInJpZ2h0XCI9PT10aGlzLnN0eWxlLmFsaWduP2srPWQtY1tmXTpcImNlbnRlclwiPT09dGhpcy5zdHlsZS5hbGlnbiYmKGsrPShkLWNbZl0pLzIpLHRoaXMuc3R5bGUuc3Ryb2tlJiZ0aGlzLnN0eWxlLnN0cm9rZVRoaWNrbmVzcyYmdGhpcy5jb250ZXh0LnN0cm9rZVRleHQoYltmXSxrLGwpLHRoaXMuc3R5bGUuZmlsbCYmdGhpcy5jb250ZXh0LmZpbGxUZXh0KGJbZl0sayxsKTt0aGlzLnVwZGF0ZVRleHR1cmUoKX0sYi5UZXh0LnByb3RvdHlwZS51cGRhdGVUZXh0dXJlPWZ1bmN0aW9uKCl7dGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlLndpZHRoPXRoaXMuY2FudmFzLndpZHRoLHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5oZWlnaHQ9dGhpcy5jYW52YXMuaGVpZ2h0LHRoaXMudGV4dHVyZS5jcm9wLndpZHRoPXRoaXMudGV4dHVyZS5mcmFtZS53aWR0aD10aGlzLmNhbnZhcy53aWR0aCx0aGlzLnRleHR1cmUuY3JvcC5oZWlnaHQ9dGhpcy50ZXh0dXJlLmZyYW1lLmhlaWdodD10aGlzLmNhbnZhcy5oZWlnaHQsdGhpcy5fd2lkdGg9dGhpcy5jYW52YXMud2lkdGgsdGhpcy5faGVpZ2h0PXRoaXMuY2FudmFzLmhlaWdodCx0aGlzLnRleHR1cmUuYmFzZVRleHR1cmUuZGlydHkoKX0sYi5UZXh0LnByb3RvdHlwZS5fcmVuZGVyV2ViR0w9ZnVuY3Rpb24oYSl7dGhpcy5kaXJ0eSYmKHRoaXMucmVzb2x1dGlvbj1hLnJlc29sdXRpb24sdGhpcy51cGRhdGVUZXh0KCksdGhpcy5kaXJ0eT0hMSksYi5TcHJpdGUucHJvdG90eXBlLl9yZW5kZXJXZWJHTC5jYWxsKHRoaXMsYSl9LGIuVGV4dC5wcm90b3R5cGUuX3JlbmRlckNhbnZhcz1mdW5jdGlvbihhKXt0aGlzLmRpcnR5JiYodGhpcy5yZXNvbHV0aW9uPWEucmVzb2x1dGlvbix0aGlzLnVwZGF0ZVRleHQoKSx0aGlzLmRpcnR5PSExKSxiLlNwcml0ZS5wcm90b3R5cGUuX3JlbmRlckNhbnZhcy5jYWxsKHRoaXMsYSl9LGIuVGV4dC5wcm90b3R5cGUuZGV0ZXJtaW5lRm9udFByb3BlcnRpZXM9ZnVuY3Rpb24oYSl7dmFyIGM9Yi5UZXh0LmZvbnRQcm9wZXJ0aWVzQ2FjaGVbYV07aWYoIWMpe2M9e307dmFyIGQ9Yi5UZXh0LmZvbnRQcm9wZXJ0aWVzQ2FudmFzLGU9Yi5UZXh0LmZvbnRQcm9wZXJ0aWVzQ29udGV4dDtlLmZvbnQ9YTt2YXIgZj1NYXRoLmNlaWwoZS5tZWFzdXJlVGV4dChcInxNcVwiKS53aWR0aCksZz1NYXRoLmNlaWwoZS5tZWFzdXJlVGV4dChcIk1cIikud2lkdGgpLGg9MipnO2c9MS40Kmd8MCxkLndpZHRoPWYsZC5oZWlnaHQ9aCxlLmZpbGxTdHlsZT1cIiNmMDBcIixlLmZpbGxSZWN0KDAsMCxmLGgpLGUuZm9udD1hLGUudGV4dEJhc2VsaW5lPVwiYWxwaGFiZXRpY1wiLGUuZmlsbFN0eWxlPVwiIzAwMFwiLGUuZmlsbFRleHQoXCJ8TcOJcVwiLDAsZyk7dmFyIGksaixrPWUuZ2V0SW1hZ2VEYXRhKDAsMCxmLGgpLmRhdGEsbD1rLmxlbmd0aCxtPTQqZixuPTAsbz0hMTtmb3IoaT0wO2c+aTtpKyspe2ZvcihqPTA7bT5qO2orPTQpaWYoMjU1IT09a1tuK2pdKXtvPSEwO2JyZWFrfWlmKG8pYnJlYWs7bis9bX1mb3IoYy5hc2NlbnQ9Zy1pLG49bC1tLG89ITEsaT1oO2k+ZztpLS0pe2ZvcihqPTA7bT5qO2orPTQpaWYoMjU1IT09a1tuK2pdKXtvPSEwO2JyZWFrfWlmKG8pYnJlYWs7bi09bX1jLmRlc2NlbnQ9aS1nLGMuZGVzY2VudCs9NixjLmZvbnRTaXplPWMuYXNjZW50K2MuZGVzY2VudCxiLlRleHQuZm9udFByb3BlcnRpZXNDYWNoZVthXT1jfXJldHVybiBjfSxiLlRleHQucHJvdG90eXBlLndvcmRXcmFwPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1cIlwiLGM9YS5zcGxpdChcIlxcblwiKSxkPTA7ZDxjLmxlbmd0aDtkKyspe2Zvcih2YXIgZT10aGlzLnN0eWxlLndvcmRXcmFwV2lkdGgsZj1jW2RdLnNwbGl0KFwiIFwiKSxnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBoPXRoaXMuY29udGV4dC5tZWFzdXJlVGV4dChmW2ddKS53aWR0aCxpPWgrdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KFwiIFwiKS53aWR0aDswPT09Z3x8aT5lPyhnPjAmJihiKz1cIlxcblwiKSxiKz1mW2ddLGU9dGhpcy5zdHlsZS53b3JkV3JhcFdpZHRoLWgpOihlLT1pLGIrPVwiIFwiK2ZbZ10pfWQ8Yy5sZW5ndGgtMSYmKGIrPVwiXFxuXCIpfXJldHVybiBifSxiLlRleHQucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kaXJ0eSYmKHRoaXMudXBkYXRlVGV4dCgpLHRoaXMuZGlydHk9ITEpLGIuU3ByaXRlLnByb3RvdHlwZS5nZXRCb3VuZHMuY2FsbCh0aGlzLGEpfSxiLlRleHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oYSl7dGhpcy5jb250ZXh0PW51bGwsdGhpcy5jYW52YXM9bnVsbCx0aGlzLnRleHR1cmUuZGVzdHJveSh2b2lkIDA9PT1hPyEwOmEpfSxiLlRleHQuZm9udFByb3BlcnRpZXNDYWNoZT17fSxiLlRleHQuZm9udFByb3BlcnRpZXNDYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSxiLlRleHQuZm9udFByb3BlcnRpZXNDb250ZXh0PWIuVGV4dC5mb250UHJvcGVydGllc0NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiksYi5CaXRtYXBUZXh0PWZ1bmN0aW9uKGEsYyl7Yi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLmNhbGwodGhpcyksdGhpcy50ZXh0V2lkdGg9MCx0aGlzLnRleHRIZWlnaHQ9MCx0aGlzLl9wb29sPVtdLHRoaXMuc2V0VGV4dChhKSx0aGlzLnNldFN0eWxlKGMpLHRoaXMudXBkYXRlVGV4dCgpLHRoaXMuZGlydHk9ITF9LGIuQml0bWFwVGV4dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlKSxiLkJpdG1hcFRleHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuQml0bWFwVGV4dCxiLkJpdG1hcFRleHQucHJvdG90eXBlLnNldFRleHQ9ZnVuY3Rpb24oYSl7dGhpcy50ZXh0PWF8fFwiIFwiLHRoaXMuZGlydHk9ITB9LGIuQml0bWFwVGV4dC5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oYSl7YT1hfHx7fSxhLmFsaWduPWEuYWxpZ258fFwibGVmdFwiLHRoaXMuc3R5bGU9YTt2YXIgYz1hLmZvbnQuc3BsaXQoXCIgXCIpO3RoaXMuZm9udE5hbWU9Y1tjLmxlbmd0aC0xXSx0aGlzLmZvbnRTaXplPWMubGVuZ3RoPj0yP3BhcnNlSW50KGNbYy5sZW5ndGgtMl0sMTApOmIuQml0bWFwVGV4dC5mb250c1t0aGlzLmZvbnROYW1lXS5zaXplLHRoaXMuZGlydHk9ITAsdGhpcy50aW50PWEudGludH0sYi5CaXRtYXBUZXh0LnByb3RvdHlwZS51cGRhdGVUZXh0PWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWIuQml0bWFwVGV4dC5mb250c1t0aGlzLmZvbnROYW1lXSxjPW5ldyBiLlBvaW50LGQ9bnVsbCxlPVtdLGY9MCxnPVtdLGg9MCxpPXRoaXMuZm9udFNpemUvYS5zaXplLGo9MDtqPHRoaXMudGV4dC5sZW5ndGg7aisrKXt2YXIgaz10aGlzLnRleHQuY2hhckNvZGVBdChqKTtpZigvKD86XFxyXFxufFxccnxcXG4pLy50ZXN0KHRoaXMudGV4dC5jaGFyQXQoaikpKWcucHVzaChjLngpLGY9TWF0aC5tYXgoZixjLngpLGgrKyxjLng9MCxjLnkrPWEubGluZUhlaWdodCxkPW51bGw7ZWxzZXt2YXIgbD1hLmNoYXJzW2tdO2wmJihkJiZsLmtlcm5pbmdbZF0mJihjLngrPWwua2VybmluZ1tkXSksZS5wdXNoKHt0ZXh0dXJlOmwudGV4dHVyZSxsaW5lOmgsY2hhckNvZGU6ayxwb3NpdGlvbjpuZXcgYi5Qb2ludChjLngrbC54T2Zmc2V0LGMueStsLnlPZmZzZXQpfSksYy54Kz1sLnhBZHZhbmNlLGQ9ayl9fWcucHVzaChjLngpLGY9TWF0aC5tYXgoZixjLngpO3ZhciBtPVtdO2ZvcihqPTA7aD49ajtqKyspe3ZhciBuPTA7XCJyaWdodFwiPT09dGhpcy5zdHlsZS5hbGlnbj9uPWYtZ1tqXTpcImNlbnRlclwiPT09dGhpcy5zdHlsZS5hbGlnbiYmKG49KGYtZ1tqXSkvMiksbS5wdXNoKG4pfXZhciBvPXRoaXMuY2hpbGRyZW4ubGVuZ3RoLHA9ZS5sZW5ndGgscT10aGlzLnRpbnR8fDE2Nzc3MjE1O2ZvcihqPTA7cD5qO2orKyl7dmFyIHI9bz5qP3RoaXMuY2hpbGRyZW5bal06dGhpcy5fcG9vbC5wb3AoKTtyP3Iuc2V0VGV4dHVyZShlW2pdLnRleHR1cmUpOnI9bmV3IGIuU3ByaXRlKGVbal0udGV4dHVyZSksci5wb3NpdGlvbi54PShlW2pdLnBvc2l0aW9uLngrbVtlW2pdLmxpbmVdKSppLHIucG9zaXRpb24ueT1lW2pdLnBvc2l0aW9uLnkqaSxyLnNjYWxlLng9ci5zY2FsZS55PWksci50aW50PXEsci5wYXJlbnR8fHRoaXMuYWRkQ2hpbGQocil9Zm9yKDt0aGlzLmNoaWxkcmVuLmxlbmd0aD5wOyl7dmFyIHM9dGhpcy5nZXRDaGlsZEF0KHRoaXMuY2hpbGRyZW4ubGVuZ3RoLTEpO3RoaXMuX3Bvb2wucHVzaChzKSx0aGlzLnJlbW92ZUNoaWxkKHMpfXRoaXMudGV4dFdpZHRoPWYqaSx0aGlzLnRleHRIZWlnaHQ9KGMueSthLmxpbmVIZWlnaHQpKml9LGIuQml0bWFwVGV4dC5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtPWZ1bmN0aW9uKCl7dGhpcy5kaXJ0eSYmKHRoaXMudXBkYXRlVGV4dCgpLHRoaXMuZGlydHk9ITEpLGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtLmNhbGwodGhpcyl9LGIuQml0bWFwVGV4dC5mb250cz17fSxiLkludGVyYWN0aW9uRGF0YT1mdW5jdGlvbigpe3RoaXMuZ2xvYmFsPW5ldyBiLlBvaW50LHRoaXMudGFyZ2V0PW51bGwsdGhpcy5vcmlnaW5hbEV2ZW50PW51bGx9LGIuSW50ZXJhY3Rpb25EYXRhLnByb3RvdHlwZS5nZXRMb2NhbFBvc2l0aW9uPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS53b3JsZFRyYW5zZm9ybSxlPXRoaXMuZ2xvYmFsLGY9ZC5hLGc9ZC5jLGg9ZC50eCxpPWQuYixqPWQuZCxrPWQudHksbD0xLyhmKmorZyotaSk7cmV0dXJuIGM9Y3x8bmV3IGIuUG9pbnQsYy54PWoqbCplLngrLWcqbCplLnkrKGsqZy1oKmopKmwsYy55PWYqbCplLnkrLWkqbCplLngrKC1rKmYraCppKSpsLGN9LGIuSW50ZXJhY3Rpb25EYXRhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkludGVyYWN0aW9uRGF0YSxiLkludGVyYWN0aW9uTWFuYWdlcj1mdW5jdGlvbihhKXt0aGlzLnN0YWdlPWEsdGhpcy5tb3VzZT1uZXcgYi5JbnRlcmFjdGlvbkRhdGEsdGhpcy50b3VjaGVzPXt9LHRoaXMudGVtcFBvaW50PW5ldyBiLlBvaW50LHRoaXMubW91c2VvdmVyRW5hYmxlZD0hMCx0aGlzLnBvb2w9W10sdGhpcy5pbnRlcmFjdGl2ZUl0ZW1zPVtdLHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50PW51bGwsdGhpcy5vbk1vdXNlTW92ZT10aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyksdGhpcy5vbk1vdXNlRG93bj10aGlzLm9uTW91c2VEb3duLmJpbmQodGhpcyksdGhpcy5vbk1vdXNlT3V0PXRoaXMub25Nb3VzZU91dC5iaW5kKHRoaXMpLHRoaXMub25Nb3VzZVVwPXRoaXMub25Nb3VzZVVwLmJpbmQodGhpcyksdGhpcy5vblRvdWNoU3RhcnQ9dGhpcy5vblRvdWNoU3RhcnQuYmluZCh0aGlzKSx0aGlzLm9uVG91Y2hFbmQ9dGhpcy5vblRvdWNoRW5kLmJpbmQodGhpcyksdGhpcy5vblRvdWNoTW92ZT10aGlzLm9uVG91Y2hNb3ZlLmJpbmQodGhpcyksdGhpcy5sYXN0PTAsdGhpcy5jdXJyZW50Q3Vyc29yU3R5bGU9XCJpbmhlcml0XCIsdGhpcy5tb3VzZU91dD0hMSx0aGlzLnJlc29sdXRpb249MSx0aGlzLl90ZW1wUG9pbnQ9bmV3IGIuUG9pbnR9LGIuSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkludGVyYWN0aW9uTWFuYWdlcixiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuY29sbGVjdEludGVyYWN0aXZlU3ByaXRlPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEuY2hpbGRyZW4sZD1jLmxlbmd0aCxlPWQtMTtlPj0wO2UtLSl7dmFyIGY9Y1tlXTtcbmYuX2ludGVyYWN0aXZlPyhiLmludGVyYWN0aXZlQ2hpbGRyZW49ITAsdGhpcy5pbnRlcmFjdGl2ZUl0ZW1zLnB1c2goZiksZi5jaGlsZHJlbi5sZW5ndGg+MCYmdGhpcy5jb2xsZWN0SW50ZXJhY3RpdmVTcHJpdGUoZixmKSk6KGYuX19pUGFyZW50PW51bGwsZi5jaGlsZHJlbi5sZW5ndGg+MCYmdGhpcy5jb2xsZWN0SW50ZXJhY3RpdmVTcHJpdGUoZixiKSl9fSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2V0VGFyZ2V0PWZ1bmN0aW9uKGEpe3RoaXMudGFyZ2V0PWEsdGhpcy5yZXNvbHV0aW9uPWEucmVzb2x1dGlvbixudWxsPT09dGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQmJnRoaXMuc2V0VGFyZ2V0RG9tRWxlbWVudChhLnZpZXcpfSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2V0VGFyZ2V0RG9tRWxlbWVudD1mdW5jdGlvbihhKXt0aGlzLnJlbW92ZUV2ZW50cygpLHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCYmKGEuc3R5bGVbXCItbXMtY29udGVudC16b29taW5nXCJdPVwibm9uZVwiLGEuc3R5bGVbXCItbXMtdG91Y2gtYWN0aW9uXCJdPVwibm9uZVwiKSx0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudD1hLGEuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMub25Nb3VzZU1vdmUsITApLGEuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMub25Nb3VzZURvd24sITApLGEuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsdGhpcy5vbk1vdXNlT3V0LCEwKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsdGhpcy5vblRvdWNoU3RhcnQsITApLGEuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5vblRvdWNoRW5kLCEwKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIix0aGlzLm9uVG91Y2hNb3ZlLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLm9uTW91c2VVcCwhMCl9LGIuSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVFdmVudHM9ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudCYmKHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnN0eWxlW1wiLW1zLWNvbnRlbnQtem9vbWluZ1wiXT1cIlwiLHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnN0eWxlW1wiLW1zLXRvdWNoLWFjdGlvblwiXT1cIlwiLHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLm9uTW91c2VNb3ZlLCEwKSx0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5vbk1vdXNlRG93biwhMCksdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsdGhpcy5vbk1vdXNlT3V0LCEwKSx0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMub25Ub3VjaFN0YXJ0LCEwKSx0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIix0aGlzLm9uVG91Y2hFbmQsITApLHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIix0aGlzLm9uVG91Y2hNb3ZlLCEwKSx0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudD1udWxsLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMub25Nb3VzZVVwLCEwKSl9LGIuSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtpZih0aGlzLnRhcmdldCl7dmFyIGE9RGF0ZS5ub3coKSxjPWEtdGhpcy5sYXN0O2lmKGM9YypiLklOVEVSQUNUSU9OX0ZSRVFVRU5DWS8xZTMsISgxPmMpKXt0aGlzLmxhc3Q9YTt2YXIgZD0wO3RoaXMuZGlydHkmJnRoaXMucmVidWlsZEludGVyYWN0aXZlR3JhcGgoKTt2YXIgZT10aGlzLmludGVyYWN0aXZlSXRlbXMubGVuZ3RoLGY9XCJpbmhlcml0XCIsZz0hMTtmb3IoZD0wO2U+ZDtkKyspe3ZhciBoPXRoaXMuaW50ZXJhY3RpdmVJdGVtc1tkXTtoLl9faGl0PXRoaXMuaGl0VGVzdChoLHRoaXMubW91c2UpLHRoaXMubW91c2UudGFyZ2V0PWgsaC5fX2hpdCYmIWc/KGguYnV0dG9uTW9kZSYmKGY9aC5kZWZhdWx0Q3Vyc29yKSxoLmludGVyYWN0aXZlQ2hpbGRyZW58fChnPSEwKSxoLl9faXNPdmVyfHwoaC5tb3VzZW92ZXImJmgubW91c2VvdmVyKHRoaXMubW91c2UpLGguX19pc092ZXI9ITApKTpoLl9faXNPdmVyJiYoaC5tb3VzZW91dCYmaC5tb3VzZW91dCh0aGlzLm1vdXNlKSxoLl9faXNPdmVyPSExKX10aGlzLmN1cnJlbnRDdXJzb3JTdHlsZSE9PWYmJih0aGlzLmN1cnJlbnRDdXJzb3JTdHlsZT1mLHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnN0eWxlLmN1cnNvcj1mKX19fSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUucmVidWlsZEludGVyYWN0aXZlR3JhcGg9ZnVuY3Rpb24oKXt0aGlzLmRpcnR5PSExO2Zvcih2YXIgYT10aGlzLmludGVyYWN0aXZlSXRlbXMubGVuZ3RoLGI9MDthPmI7YisrKXRoaXMuaW50ZXJhY3RpdmVJdGVtc1tiXS5pbnRlcmFjdGl2ZUNoaWxkcmVuPSExO3RoaXMuaW50ZXJhY3RpdmVJdGVtcz1bXSx0aGlzLnN0YWdlLmludGVyYWN0aXZlJiZ0aGlzLmludGVyYWN0aXZlSXRlbXMucHVzaCh0aGlzLnN0YWdlKSx0aGlzLmNvbGxlY3RJbnRlcmFjdGl2ZVNwcml0ZSh0aGlzLnN0YWdlLHRoaXMuc3RhZ2UpfSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Nb3VzZU1vdmU9ZnVuY3Rpb24oYSl7dGhpcy5kaXJ0eSYmdGhpcy5yZWJ1aWxkSW50ZXJhY3RpdmVHcmFwaCgpLHRoaXMubW91c2Uub3JpZ2luYWxFdmVudD1hO3ZhciBiPXRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMubW91c2UuZ2xvYmFsLng9KGEuY2xpZW50WC1iLmxlZnQpKih0aGlzLnRhcmdldC53aWR0aC9iLndpZHRoKS90aGlzLnJlc29sdXRpb24sdGhpcy5tb3VzZS5nbG9iYWwueT0oYS5jbGllbnRZLWIudG9wKSoodGhpcy50YXJnZXQuaGVpZ2h0L2IuaGVpZ2h0KS90aGlzLnJlc29sdXRpb247Zm9yKHZhciBjPXRoaXMuaW50ZXJhY3RpdmVJdGVtcy5sZW5ndGgsZD0wO2M+ZDtkKyspe3ZhciBlPXRoaXMuaW50ZXJhY3RpdmVJdGVtc1tkXTtlLm1vdXNlbW92ZSYmZS5tb3VzZW1vdmUodGhpcy5tb3VzZSl9fSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Nb3VzZURvd249ZnVuY3Rpb24oYSl7dGhpcy5kaXJ0eSYmdGhpcy5yZWJ1aWxkSW50ZXJhY3RpdmVHcmFwaCgpLHRoaXMubW91c2Uub3JpZ2luYWxFdmVudD1hLGIuQVVUT19QUkVWRU5UX0RFRkFVTFQmJnRoaXMubW91c2Uub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO2Zvcih2YXIgYz10aGlzLmludGVyYWN0aXZlSXRlbXMubGVuZ3RoLGQ9dGhpcy5tb3VzZS5vcmlnaW5hbEV2ZW50LGU9Mj09PWQuYnV0dG9ufHwzPT09ZC53aGljaCxmPWU/XCJyaWdodGRvd25cIjpcIm1vdXNlZG93blwiLGc9ZT9cInJpZ2h0Y2xpY2tcIjpcImNsaWNrXCIsaD1lP1wiX19yaWdodElzRG93blwiOlwiX19tb3VzZUlzRG93blwiLGk9ZT9cIl9faXNSaWdodERvd25cIjpcIl9faXNEb3duXCIsaj0wO2M+ajtqKyspe3ZhciBrPXRoaXMuaW50ZXJhY3RpdmVJdGVtc1tqXTtpZigoa1tmXXx8a1tnXSkmJihrW2hdPSEwLGsuX19oaXQ9dGhpcy5oaXRUZXN0KGssdGhpcy5tb3VzZSksay5fX2hpdCYmKGtbZl0mJmtbZl0odGhpcy5tb3VzZSksa1tpXT0hMCwhay5pbnRlcmFjdGl2ZUNoaWxkcmVuKSkpYnJlYWt9fSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Nb3VzZU91dD1mdW5jdGlvbihhKXt0aGlzLmRpcnR5JiZ0aGlzLnJlYnVpbGRJbnRlcmFjdGl2ZUdyYXBoKCksdGhpcy5tb3VzZS5vcmlnaW5hbEV2ZW50PWE7dmFyIGI9dGhpcy5pbnRlcmFjdGl2ZUl0ZW1zLmxlbmd0aDt0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5zdHlsZS5jdXJzb3I9XCJpbmhlcml0XCI7Zm9yKHZhciBjPTA7Yj5jO2MrKyl7dmFyIGQ9dGhpcy5pbnRlcmFjdGl2ZUl0ZW1zW2NdO2QuX19pc092ZXImJih0aGlzLm1vdXNlLnRhcmdldD1kLGQubW91c2VvdXQmJmQubW91c2VvdXQodGhpcy5tb3VzZSksZC5fX2lzT3Zlcj0hMSl9dGhpcy5tb3VzZU91dD0hMCx0aGlzLm1vdXNlLmdsb2JhbC54PS0xZTQsdGhpcy5tb3VzZS5nbG9iYWwueT0tMWU0fSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKGEpe3RoaXMuZGlydHkmJnRoaXMucmVidWlsZEludGVyYWN0aXZlR3JhcGgoKSx0aGlzLm1vdXNlLm9yaWdpbmFsRXZlbnQ9YTtmb3IodmFyIGI9dGhpcy5pbnRlcmFjdGl2ZUl0ZW1zLmxlbmd0aCxjPSExLGQ9dGhpcy5tb3VzZS5vcmlnaW5hbEV2ZW50LGU9Mj09PWQuYnV0dG9ufHwzPT09ZC53aGljaCxmPWU/XCJyaWdodHVwXCI6XCJtb3VzZXVwXCIsZz1lP1wicmlnaHRjbGlja1wiOlwiY2xpY2tcIixoPWU/XCJyaWdodHVwb3V0c2lkZVwiOlwibW91c2V1cG91dHNpZGVcIixpPWU/XCJfX2lzUmlnaHREb3duXCI6XCJfX2lzRG93blwiLGo9MDtiPmo7aisrKXt2YXIgaz10aGlzLmludGVyYWN0aXZlSXRlbXNbal07KGtbZ118fGtbZl18fGtbaF0pJiYoay5fX2hpdD10aGlzLmhpdFRlc3Qoayx0aGlzLm1vdXNlKSxrLl9faGl0JiYhYz8oa1tmXSYma1tmXSh0aGlzLm1vdXNlKSxrW2ldJiZrW2ddJiZrW2ddKHRoaXMubW91c2UpLGsuaW50ZXJhY3RpdmVDaGlsZHJlbnx8KGM9ITApKTprW2ldJiZrW2hdJiZrW2hdKHRoaXMubW91c2UpLGtbaV09ITEpfX0sYi5JbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLmhpdFRlc3Q9ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLmdsb2JhbDtpZighYS53b3JsZFZpc2libGUpcmV0dXJuITE7YS53b3JsZFRyYW5zZm9ybS5hcHBseUludmVyc2UoZCx0aGlzLl90ZW1wUG9pbnQpO3ZhciBlLGY9dGhpcy5fdGVtcFBvaW50LngsZz10aGlzLl90ZW1wUG9pbnQueTtpZihjLnRhcmdldD1hLGEuaGl0QXJlYSYmYS5oaXRBcmVhLmNvbnRhaW5zKXJldHVybiBhLmhpdEFyZWEuY29udGFpbnMoZixnKTtpZihhIGluc3RhbmNlb2YgYi5TcHJpdGUpe3ZhciBoLGk9YS50ZXh0dXJlLmZyYW1lLndpZHRoLGo9YS50ZXh0dXJlLmZyYW1lLmhlaWdodCxrPS1pKmEuYW5jaG9yLng7aWYoZj5rJiZrK2k+ZiYmKGg9LWoqYS5hbmNob3IueSxnPmgmJmgraj5nKSlyZXR1cm4hMH1lbHNlIGlmKGEgaW5zdGFuY2VvZiBiLkdyYXBoaWNzKXt2YXIgbD1hLmdyYXBoaWNzRGF0YTtmb3IoZT0wO2U8bC5sZW5ndGg7ZSsrKXt2YXIgbT1sW2VdO2lmKG0uZmlsbCYmbS5zaGFwZSYmbS5zaGFwZS5jb250YWlucyhmLGcpKXJldHVybiEwfX12YXIgbj1hLmNoaWxkcmVuLmxlbmd0aDtmb3IoZT0wO24+ZTtlKyspe3ZhciBvPWEuY2hpbGRyZW5bZV0scD10aGlzLmhpdFRlc3QobyxjKTtpZihwKXJldHVybiBjLnRhcmdldD1hLCEwfXJldHVybiExfSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Ub3VjaE1vdmU9ZnVuY3Rpb24oYSl7dGhpcy5kaXJ0eSYmdGhpcy5yZWJ1aWxkSW50ZXJhY3RpdmVHcmFwaCgpO3ZhciBiLGM9dGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1hLmNoYW5nZWRUb3VjaGVzLGU9MDtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdO2I9dGhpcy50b3VjaGVzW2YuaWRlbnRpZmllcl0sYi5vcmlnaW5hbEV2ZW50PWEsYi5nbG9iYWwueD0oZi5jbGllbnRYLWMubGVmdCkqKHRoaXMudGFyZ2V0LndpZHRoL2Mud2lkdGgpL3RoaXMucmVzb2x1dGlvbixiLmdsb2JhbC55PShmLmNsaWVudFktYy50b3ApKih0aGlzLnRhcmdldC5oZWlnaHQvYy5oZWlnaHQpL3RoaXMucmVzb2x1dGlvbiwhbmF2aWdhdG9yLmlzQ29jb29uSlN8fGMubGVmdHx8Yy50b3B8fGEudGFyZ2V0LnN0eWxlLndpZHRofHxhLnRhcmdldC5zdHlsZS5oZWlnaHR8fChiLmdsb2JhbC54PWYuY2xpZW50WCxiLmdsb2JhbC55PWYuY2xpZW50WSk7Zm9yKHZhciBnPTA7Zzx0aGlzLmludGVyYWN0aXZlSXRlbXMubGVuZ3RoO2crKyl7dmFyIGg9dGhpcy5pbnRlcmFjdGl2ZUl0ZW1zW2ddO2gudG91Y2htb3ZlJiZoLl9fdG91Y2hEYXRhJiZoLl9fdG91Y2hEYXRhW2YuaWRlbnRpZmllcl0mJmgudG91Y2htb3ZlKGIpfX19LGIuSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5vblRvdWNoU3RhcnQ9ZnVuY3Rpb24oYSl7dGhpcy5kaXJ0eSYmdGhpcy5yZWJ1aWxkSW50ZXJhY3RpdmVHcmFwaCgpO3ZhciBjPXRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2IuQVVUT19QUkVWRU5UX0RFRkFVTFQmJmEucHJldmVudERlZmF1bHQoKTtmb3IodmFyIGQ9YS5jaGFuZ2VkVG91Y2hlcyxlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV0sZz10aGlzLnBvb2wucG9wKCk7Z3x8KGc9bmV3IGIuSW50ZXJhY3Rpb25EYXRhKSxnLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnRvdWNoZXNbZi5pZGVudGlmaWVyXT1nLGcuZ2xvYmFsLng9KGYuY2xpZW50WC1jLmxlZnQpKih0aGlzLnRhcmdldC53aWR0aC9jLndpZHRoKS90aGlzLnJlc29sdXRpb24sZy5nbG9iYWwueT0oZi5jbGllbnRZLWMudG9wKSoodGhpcy50YXJnZXQuaGVpZ2h0L2MuaGVpZ2h0KS90aGlzLnJlc29sdXRpb24sIW5hdmlnYXRvci5pc0NvY29vbkpTfHxjLmxlZnR8fGMudG9wfHxhLnRhcmdldC5zdHlsZS53aWR0aHx8YS50YXJnZXQuc3R5bGUuaGVpZ2h0fHwoZy5nbG9iYWwueD1mLmNsaWVudFgsZy5nbG9iYWwueT1mLmNsaWVudFkpO2Zvcih2YXIgaD10aGlzLmludGVyYWN0aXZlSXRlbXMubGVuZ3RoLGk9MDtoPmk7aSsrKXt2YXIgaj10aGlzLmludGVyYWN0aXZlSXRlbXNbaV07aWYoKGoudG91Y2hzdGFydHx8ai50YXApJiYoai5fX2hpdD10aGlzLmhpdFRlc3QoaixnKSxqLl9faGl0JiYoai50b3VjaHN0YXJ0JiZqLnRvdWNoc3RhcnQoZyksai5fX2lzRG93bj0hMCxqLl9fdG91Y2hEYXRhPWouX190b3VjaERhdGF8fHt9LGouX190b3VjaERhdGFbZi5pZGVudGlmaWVyXT1nLCFqLmludGVyYWN0aXZlQ2hpbGRyZW4pKSlicmVha319fSxiLkludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Ub3VjaEVuZD1mdW5jdGlvbihhKXt0aGlzLmRpcnR5JiZ0aGlzLnJlYnVpbGRJbnRlcmFjdGl2ZUdyYXBoKCk7Zm9yKHZhciBiPXRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9YS5jaGFuZ2VkVG91Y2hlcyxkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF0sZj10aGlzLnRvdWNoZXNbZS5pZGVudGlmaWVyXSxnPSExO2YuZ2xvYmFsLng9KGUuY2xpZW50WC1iLmxlZnQpKih0aGlzLnRhcmdldC53aWR0aC9iLndpZHRoKS90aGlzLnJlc29sdXRpb24sZi5nbG9iYWwueT0oZS5jbGllbnRZLWIudG9wKSoodGhpcy50YXJnZXQuaGVpZ2h0L2IuaGVpZ2h0KS90aGlzLnJlc29sdXRpb24sIW5hdmlnYXRvci5pc0NvY29vbkpTfHxiLmxlZnR8fGIudG9wfHxhLnRhcmdldC5zdHlsZS53aWR0aHx8YS50YXJnZXQuc3R5bGUuaGVpZ2h0fHwoZi5nbG9iYWwueD1lLmNsaWVudFgsZi5nbG9iYWwueT1lLmNsaWVudFkpO2Zvcih2YXIgaD10aGlzLmludGVyYWN0aXZlSXRlbXMubGVuZ3RoLGk9MDtoPmk7aSsrKXt2YXIgaj10aGlzLmludGVyYWN0aXZlSXRlbXNbaV07ai5fX3RvdWNoRGF0YSYmai5fX3RvdWNoRGF0YVtlLmlkZW50aWZpZXJdJiYoai5fX2hpdD10aGlzLmhpdFRlc3QoaixqLl9fdG91Y2hEYXRhW2UuaWRlbnRpZmllcl0pLGYub3JpZ2luYWxFdmVudD1hLChqLnRvdWNoZW5kfHxqLnRhcCkmJihqLl9faGl0JiYhZz8oai50b3VjaGVuZCYmai50b3VjaGVuZChmKSxqLl9faXNEb3duJiZqLnRhcCYmai50YXAoZiksai5pbnRlcmFjdGl2ZUNoaWxkcmVufHwoZz0hMCkpOmouX19pc0Rvd24mJmoudG91Y2hlbmRvdXRzaWRlJiZqLnRvdWNoZW5kb3V0c2lkZShmKSxqLl9faXNEb3duPSExKSxqLl9fdG91Y2hEYXRhW2UuaWRlbnRpZmllcl09bnVsbCl9dGhpcy5wb29sLnB1c2goZiksdGhpcy50b3VjaGVzW2UuaWRlbnRpZmllcl09bnVsbH19LGIuU3RhZ2U9ZnVuY3Rpb24oYSl7Yi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLmNhbGwodGhpcyksdGhpcy53b3JsZFRyYW5zZm9ybT1uZXcgYi5NYXRyaXgsdGhpcy5pbnRlcmFjdGl2ZT0hMCx0aGlzLmludGVyYWN0aW9uTWFuYWdlcj1uZXcgYi5JbnRlcmFjdGlvbk1hbmFnZXIodGhpcyksdGhpcy5kaXJ0eT0hMCx0aGlzLnN0YWdlPXRoaXMsdGhpcy5zdGFnZS5oaXRBcmVhPW5ldyBiLlJlY3RhbmdsZSgwLDAsMWU1LDFlNSksdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoYSl9LGIuU3RhZ2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZSksYi5TdGFnZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5TdGFnZSxiLlN0YWdlLnByb3RvdHlwZS5zZXRJbnRlcmFjdGlvbkRlbGVnYXRlPWZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLnNldFRhcmdldERvbUVsZW1lbnQoYSl9LGIuU3RhZ2UucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMud29ybGRBbHBoYT0xO2Zvcih2YXIgYT0wLGI9dGhpcy5jaGlsZHJlbi5sZW5ndGg7Yj5hO2ErKyl0aGlzLmNoaWxkcmVuW2FdLnVwZGF0ZVRyYW5zZm9ybSgpO3RoaXMuZGlydHkmJih0aGlzLmRpcnR5PSExLHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLmRpcnR5PSEwKSx0aGlzLmludGVyYWN0aXZlJiZ0aGlzLmludGVyYWN0aW9uTWFuYWdlci51cGRhdGUoKX0sYi5TdGFnZS5wcm90b3R5cGUuc2V0QmFja2dyb3VuZENvbG9yPWZ1bmN0aW9uKGEpe3RoaXMuYmFja2dyb3VuZENvbG9yPWF8fDAsdGhpcy5iYWNrZ3JvdW5kQ29sb3JTcGxpdD1iLmhleDJyZ2IodGhpcy5iYWNrZ3JvdW5kQ29sb3IpO3ZhciBjPXRoaXMuYmFja2dyb3VuZENvbG9yLnRvU3RyaW5nKDE2KTtjPVwiMDAwMDAwXCIuc3Vic3RyKDAsNi1jLmxlbmd0aCkrYyx0aGlzLmJhY2tncm91bmRDb2xvclN0cmluZz1cIiNcIitjfSxiLlN0YWdlLnByb3RvdHlwZS5nZXRNb3VzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLm1vdXNlLmdsb2JhbH0sZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1bXCJtc1wiLFwibW96XCIsXCJ3ZWJraXRcIixcIm9cIl0sZD0wO2Q8Yy5sZW5ndGgmJiFhLnJlcXVlc3RBbmltYXRpb25GcmFtZTsrK2QpYS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9YVtjW2RdK1wiUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdLGEuY2FuY2VsQW5pbWF0aW9uRnJhbWU9YVtjW2RdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fGFbY1tkXStcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiXTthLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KGEucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGMpe3ZhciBkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGU9TWF0aC5tYXgoMCwxNi0oZC1iKSksZj1hLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtjKGQrZSl9LGUpO3JldHVybiBiPWQrZSxmfSksYS5jYW5jZWxBbmltYXRpb25GcmFtZXx8KGEuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KGEpfSksYS5yZXF1ZXN0QW5pbUZyYW1lPWEucmVxdWVzdEFuaW1hdGlvbkZyYW1lfSh0aGlzKSxiLmhleDJyZ2I9ZnVuY3Rpb24oYSl7cmV0dXJuWyhhPj4xNiYyNTUpLzI1NSwoYT4+OCYyNTUpLzI1NSwoMjU1JmEpLzI1NV19LGIucmdiMmhleD1mdW5jdGlvbihhKXtyZXR1cm4oMjU1KmFbMF08PDE2KSsoMjU1KmFbMV08PDgpKzI1NSphWzJdfSxcImZ1bmN0aW9uXCIhPXR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCYmKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtmb3IodmFyIGQ9YXJndW1lbnRzLmxlbmd0aCxmPW5ldyBBcnJheShkKTtkLS07KWZbZF09YXJndW1lbnRzW2RdO3JldHVybiBmPWUuY29uY2F0KGYpLGMuYXBwbHkodGhpcyBpbnN0YW5jZW9mIGI/dGhpczphLGYpfXZhciBjPXRoaXMsZD1hcmd1bWVudHMubGVuZ3RoLTEsZT1bXTtpZihkPjApZm9yKGUubGVuZ3RoPWQ7ZC0tOyllW2RdPWFyZ3VtZW50c1tkKzFdO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGMpdGhyb3cgbmV3IFR5cGVFcnJvcjtyZXR1cm4gYi5wcm90b3R5cGU9ZnVuY3Rpb24gZihhKXtyZXR1cm4gYSYmKGYucHJvdG90eXBlPWEpLHRoaXMgaW5zdGFuY2VvZiBmP3ZvaWQgMDpuZXcgZn0oYy5wcm90b3R5cGUpLGJ9fSgpKSxiLkFqYXhSZXF1ZXN0PWZ1bmN0aW9uKCl7dmFyIGE9W1wiTXN4bWwyLlhNTEhUVFAuNi4wXCIsXCJNc3htbDIuWE1MSFRUUC4zLjBcIixcIk1pY3Jvc29mdC5YTUxIVFRQXCJdO2lmKCF3aW5kb3cuQWN0aXZlWE9iamVjdClyZXR1cm4gd2luZG93LlhNTEh0dHBSZXF1ZXN0P25ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3Q6ITE7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdHJ5e3JldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoYVtiXSl9Y2F0Y2goYyl7fX0sYi5jYW5Vc2VOZXdDYW52YXNCbGVuZE1vZGVzPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGRvY3VtZW50KXJldHVybiExO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7YS53aWR0aD0xLGEuaGVpZ2h0PTE7dmFyIGI9YS5nZXRDb250ZXh0KFwiMmRcIik7cmV0dXJuIGIuZmlsbFN0eWxlPVwiIzAwMFwiLGIuZmlsbFJlY3QoMCwwLDEsMSksYi5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJtdWx0aXBseVwiLGIuZmlsbFN0eWxlPVwiI2ZmZlwiLGIuZmlsbFJlY3QoMCwwLDEsMSksMD09PWIuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGFbMF19LGIuZ2V0TmV4dFBvd2VyT2ZUd289ZnVuY3Rpb24oYSl7aWYoYT4wJiYwPT09KGEmYS0xKSlyZXR1cm4gYTtmb3IodmFyIGI9MTthPmI7KWI8PD0xO3JldHVybiBifSxiLmlzUG93ZXJPZlR3bz1mdW5jdGlvbihhLGIpe3JldHVybiBhPjAmJjA9PT0oYSZhLTEpJiZiPjAmJjA9PT0oYiZiLTEpfSxiLkV2ZW50VGFyZ2V0PXtjYWxsOmZ1bmN0aW9uKGEpe2EmJihhPWEucHJvdG90eXBlfHxhLGIuRXZlbnRUYXJnZXQubWl4aW4oYSkpfSxtaXhpbjpmdW5jdGlvbihhKXthLmxpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVyc3x8e30sdGhpcy5fbGlzdGVuZXJzW2FdP3RoaXMuX2xpc3RlbmVyc1thXS5zbGljZSgpOltdfSxhLmVtaXQ9YS5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGEsYyl7aWYodGhpcy5fbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVyc3x8e30sXCJvYmplY3RcIj09dHlwZW9mIGEmJihjPWEsYT1hLnR5cGUpLGMmJmMuX19pc0V2ZW50T2JqZWN0PT09ITB8fChjPW5ldyBiLkV2ZW50KHRoaXMsYSxjKSksdGhpcy5fbGlzdGVuZXJzJiZ0aGlzLl9saXN0ZW5lcnNbYV0pe3ZhciBkLGU9dGhpcy5fbGlzdGVuZXJzW2FdLnNsaWNlKDApLGY9ZS5sZW5ndGgsZz1lWzBdO2ZvcihkPTA7Zj5kO2c9ZVsrK2RdKWlmKGcuY2FsbCh0aGlzLGMpLGMuc3RvcHBlZEltbWVkaWF0ZSlyZXR1cm4gdGhpcztpZihjLnN0b3BwZWQpcmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lbWl0JiZ0aGlzLnBhcmVudC5lbWl0LmNhbGwodGhpcy5wYXJlbnQsYSxjKSx0aGlzfSxhLm9uPWEuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9saXN0ZW5lcnM9dGhpcy5fbGlzdGVuZXJzfHx7fSwodGhpcy5fbGlzdGVuZXJzW2FdPXRoaXMuX2xpc3RlbmVyc1thXXx8W10pLnB1c2goYiksdGhpc30sYS5vbmNlPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe2IuYXBwbHkoZC5vZmYoYSxjKSxhcmd1bWVudHMpfXRoaXMuX2xpc3RlbmVycz10aGlzLl9saXN0ZW5lcnN8fHt9O3ZhciBkPXRoaXM7cmV0dXJuIGMuX29yaWdpbmFsSGFuZGxlcj1iLHRoaXMub24oYSxjKX0sYS5vZmY9YS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5fbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVyc3x8e30sIXRoaXMuX2xpc3RlbmVyc1thXSlyZXR1cm4gdGhpcztmb3IodmFyIGM9dGhpcy5fbGlzdGVuZXJzW2FdLGQ9Yj9jLmxlbmd0aDowO2QtLT4wOykoY1tkXT09PWJ8fGNbZF0uX29yaWdpbmFsSGFuZGxlcj09PWIpJiZjLnNwbGljZShkLDEpO3JldHVybiAwPT09Yy5sZW5ndGgmJmRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbYV0sdGhpc30sYS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2xpc3RlbmVycz10aGlzLl9saXN0ZW5lcnN8fHt9LHRoaXMuX2xpc3RlbmVyc1thXT8oZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1thXSx0aGlzKTp0aGlzfX19LGIuRXZlbnQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX19pc0V2ZW50T2JqZWN0PSEwLHRoaXMuc3RvcHBlZD0hMSx0aGlzLnN0b3BwZWRJbW1lZGlhdGU9ITEsdGhpcy50YXJnZXQ9YSx0aGlzLnR5cGU9Yix0aGlzLmRhdGE9Yyx0aGlzLmNvbnRlbnQ9Yyx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfSxiLkV2ZW50LnByb3RvdHlwZS5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXt0aGlzLnN0b3BwZWQ9ITB9LGIuRXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3RoaXMuc3RvcHBlZEltbWVkaWF0ZT0hMH0sYi5hdXRvRGV0ZWN0UmVuZGVyZXI9ZnVuY3Rpb24oYSxjLGQpe2F8fChhPTgwMCksY3x8KGM9NjAwKTt2YXIgZT1mdW5jdGlvbigpe3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3JldHVybiEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCYmKGEuZ2V0Q29udGV4dChcIndlYmdsXCIpfHxhLmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIikpfWNhdGNoKGIpe3JldHVybiExfX0oKTtyZXR1cm4gZT9uZXcgYi5XZWJHTFJlbmRlcmVyKGEsYyxkKTpuZXcgYi5DYW52YXNSZW5kZXJlcihhLGMsZCl9LGIuYXV0b0RldGVjdFJlY29tbWVuZGVkUmVuZGVyZXI9ZnVuY3Rpb24oYSxjLGQpe2F8fChhPTgwMCksY3x8KGM9NjAwKTt2YXIgZT1mdW5jdGlvbigpe3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3JldHVybiEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCYmKGEuZ2V0Q29udGV4dChcIndlYmdsXCIpfHxhLmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIikpfWNhdGNoKGIpe3JldHVybiExfX0oKSxmPS9BbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtyZXR1cm4gZSYmIWY/bmV3IGIuV2ViR0xSZW5kZXJlcihhLGMsZCk6bmV3IGIuQ2FudmFzUmVuZGVyZXIoYSxjLGQpfSxiLlBvbHlLPXt9LGIuUG9seUsuVHJpYW5ndWxhdGU9ZnVuY3Rpb24oYSl7dmFyIGM9ITAsZD1hLmxlbmd0aD4+MTtpZigzPmQpcmV0dXJuW107Zm9yKHZhciBlPVtdLGY9W10sZz0wO2Q+ZztnKyspZi5wdXNoKGcpO2c9MDtmb3IodmFyIGg9ZDtoPjM7KXt2YXIgaT1mWyhnKzApJWhdLGo9ZlsoZysxKSVoXSxrPWZbKGcrMiklaF0sbD1hWzIqaV0sbT1hWzIqaSsxXSxuPWFbMipqXSxvPWFbMipqKzFdLHA9YVsyKmtdLHE9YVsyKmsrMV0scj0hMTtpZihiLlBvbHlLLl9jb252ZXgobCxtLG4sbyxwLHEsYykpe3I9ITA7Zm9yKHZhciBzPTA7aD5zO3MrKyl7dmFyIHQ9ZltzXTtpZih0IT09aSYmdCE9PWomJnQhPT1rJiZiLlBvbHlLLl9Qb2ludEluVHJpYW5nbGUoYVsyKnRdLGFbMip0KzFdLGwsbSxuLG8scCxxKSl7cj0hMTticmVha319fWlmKHIpZS5wdXNoKGksaixrKSxmLnNwbGljZSgoZysxKSVoLDEpLGgtLSxnPTA7ZWxzZSBpZihnKys+MypoKXtpZighYylyZXR1cm4gbnVsbDtmb3IoZT1bXSxmPVtdLGc9MDtkPmc7ZysrKWYucHVzaChnKTtnPTAsaD1kLGM9ITF9fXJldHVybiBlLnB1c2goZlswXSxmWzFdLGZbMl0pLGV9LGIuUG9seUsuX1BvaW50SW5UcmlhbmdsZT1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe3ZhciBpPWctYyxqPWgtZCxrPWUtYyxsPWYtZCxtPWEtYyxuPWItZCxvPWkqaStqKmoscD1pKmsraipsLHE9aSptK2oqbixyPWsqaytsKmwscz1rKm0rbCpuLHQ9MS8obypyLXAqcCksdT0ocipxLXAqcykqdCx2PShvKnMtcCpxKSp0O3JldHVybiB1Pj0wJiZ2Pj0wJiYxPnUrdn0sYi5Qb2x5Sy5fY29udmV4PWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3JldHVybihiLWQpKihlLWMpKyhjLWEpKihmLWQpPj0wPT09Z30sYi5pbml0RGVmYXVsdFNoYWRlcnM9ZnVuY3Rpb24oKXt9LGIuQ29tcGlsZVZlcnRleFNoYWRlcj1mdW5jdGlvbihhLGMpe3JldHVybiBiLl9Db21waWxlU2hhZGVyKGEsYyxhLlZFUlRFWF9TSEFERVIpfSxiLkNvbXBpbGVGcmFnbWVudFNoYWRlcj1mdW5jdGlvbihhLGMpe3JldHVybiBiLl9Db21waWxlU2hhZGVyKGEsYyxhLkZSQUdNRU5UX1NIQURFUil9LGIuX0NvbXBpbGVTaGFkZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWIuam9pbihcIlxcblwiKSxlPWEuY3JlYXRlU2hhZGVyKGMpO3JldHVybiBhLnNoYWRlclNvdXJjZShlLGQpLGEuY29tcGlsZVNoYWRlcihlKSxhLmdldFNoYWRlclBhcmFtZXRlcihlLGEuQ09NUElMRV9TVEFUVVMpP2U6KHdpbmRvdy5jb25zb2xlLmxvZyhhLmdldFNoYWRlckluZm9Mb2coZSkpLG51bGwpfSxiLmNvbXBpbGVQcm9ncmFtPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1iLkNvbXBpbGVGcmFnbWVudFNoYWRlcihhLGQpLGY9Yi5Db21waWxlVmVydGV4U2hhZGVyKGEsYyksZz1hLmNyZWF0ZVByb2dyYW0oKTtyZXR1cm4gYS5hdHRhY2hTaGFkZXIoZyxmKSxhLmF0dGFjaFNoYWRlcihnLGUpLGEubGlua1Byb2dyYW0oZyksYS5nZXRQcm9ncmFtUGFyYW1ldGVyKGcsYS5MSU5LX1NUQVRVUyl8fHdpbmRvdy5jb25zb2xlLmxvZyhcIkNvdWxkIG5vdCBpbml0aWFsaXNlIHNoYWRlcnNcIiksZ30sYi5QaXhpU2hhZGVyPWZ1bmN0aW9uKGEpe3RoaXMuX1VJRD1iLl9VSUQrKyx0aGlzLmdsPWEsdGhpcy5wcm9ncmFtPW51bGwsdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbG93cCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCkgKiB2Q29sb3IgO1wiLFwifVwiXSx0aGlzLnRleHR1cmVDb3VudD0wLHRoaXMuZmlyc3RSdW49ITAsdGhpcy5kaXJ0eT0hMCx0aGlzLmF0dHJpYnV0ZXM9W10sdGhpcy5pbml0KCl9LGIuUGl4aVNoYWRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5QaXhpU2hhZGVyLGIuUGl4aVNoYWRlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2wsYz1iLmNvbXBpbGVQcm9ncmFtKGEsdGhpcy52ZXJ0ZXhTcmN8fGIuUGl4aVNoYWRlci5kZWZhdWx0VmVydGV4U3JjLHRoaXMuZnJhZ21lbnRTcmMpO2EudXNlUHJvZ3JhbShjKSx0aGlzLnVTYW1wbGVyPWEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsXCJ1U2FtcGxlclwiKSx0aGlzLnByb2plY3Rpb25WZWN0b3I9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcInByb2plY3Rpb25WZWN0b3JcIiksdGhpcy5vZmZzZXRWZWN0b3I9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcIm9mZnNldFZlY3RvclwiKSx0aGlzLmRpbWVuc2lvbnM9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcImRpbWVuc2lvbnNcIiksdGhpcy5hVmVydGV4UG9zaXRpb249YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYVZlcnRleFBvc2l0aW9uXCIpLHRoaXMuYVRleHR1cmVDb29yZD1hLmdldEF0dHJpYkxvY2F0aW9uKGMsXCJhVGV4dHVyZUNvb3JkXCIpLHRoaXMuY29sb3JBdHRyaWJ1dGU9YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYUNvbG9yXCIpLC0xPT09dGhpcy5jb2xvckF0dHJpYnV0ZSYmKHRoaXMuY29sb3JBdHRyaWJ1dGU9MiksdGhpcy5hdHRyaWJ1dGVzPVt0aGlzLmFWZXJ0ZXhQb3NpdGlvbix0aGlzLmFUZXh0dXJlQ29vcmQsdGhpcy5jb2xvckF0dHJpYnV0ZV07Zm9yKHZhciBkIGluIHRoaXMudW5pZm9ybXMpdGhpcy51bmlmb3Jtc1tkXS51bmlmb3JtTG9jYXRpb249YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxkKTt0aGlzLmluaXRVbmlmb3JtcygpLHRoaXMucHJvZ3JhbT1jfSxiLlBpeGlTaGFkZXIucHJvdG90eXBlLmluaXRVbmlmb3Jtcz1mdW5jdGlvbigpe3RoaXMudGV4dHVyZUNvdW50PTE7dmFyIGEsYj10aGlzLmdsO2Zvcih2YXIgYyBpbiB0aGlzLnVuaWZvcm1zKXthPXRoaXMudW5pZm9ybXNbY107dmFyIGQ9YS50eXBlO1wic2FtcGxlcjJEXCI9PT1kPyhhLl9pbml0PSExLG51bGwhPT1hLnZhbHVlJiZ0aGlzLmluaXRTYW1wbGVyMkQoYSkpOlwibWF0MlwiPT09ZHx8XCJtYXQzXCI9PT1kfHxcIm1hdDRcIj09PWQ/KGEuZ2xNYXRyaXg9ITAsYS5nbFZhbHVlTGVuZ3RoPTEsXCJtYXQyXCI9PT1kP2EuZ2xGdW5jPWIudW5pZm9ybU1hdHJpeDJmdjpcIm1hdDNcIj09PWQ/YS5nbEZ1bmM9Yi51bmlmb3JtTWF0cml4M2Z2OlwibWF0NFwiPT09ZCYmKGEuZ2xGdW5jPWIudW5pZm9ybU1hdHJpeDRmdikpOihhLmdsRnVuYz1iW1widW5pZm9ybVwiK2RdLGEuZ2xWYWx1ZUxlbmd0aD1cIjJmXCI9PT1kfHxcIjJpXCI9PT1kPzI6XCIzZlwiPT09ZHx8XCIzaVwiPT09ZD8zOlwiNGZcIj09PWR8fFwiNGlcIj09PWQ/NDoxKX19LGIuUGl4aVNoYWRlci5wcm90b3R5cGUuaW5pdFNhbXBsZXIyRD1mdW5jdGlvbihhKXtpZihhLnZhbHVlJiZhLnZhbHVlLmJhc2VUZXh0dXJlJiZhLnZhbHVlLmJhc2VUZXh0dXJlLmhhc0xvYWRlZCl7dmFyIGI9dGhpcy5nbDtpZihiLmFjdGl2ZVRleHR1cmUoYltcIlRFWFRVUkVcIit0aGlzLnRleHR1cmVDb3VudF0pLGIuYmluZFRleHR1cmUoYi5URVhUVVJFXzJELGEudmFsdWUuYmFzZVRleHR1cmUuX2dsVGV4dHVyZXNbYi5pZF0pLGEudGV4dHVyZURhdGEpe3ZhciBjPWEudGV4dHVyZURhdGEsZD1jLm1hZ0ZpbHRlcj9jLm1hZ0ZpbHRlcjpiLkxJTkVBUixlPWMubWluRmlsdGVyP2MubWluRmlsdGVyOmIuTElORUFSLGY9Yy53cmFwUz9jLndyYXBTOmIuQ0xBTVBfVE9fRURHRSxnPWMud3JhcFQ/Yy53cmFwVDpiLkNMQU1QX1RPX0VER0UsaD1jLmx1bWluYW5jZT9iLkxVTUlOQU5DRTpiLlJHQkE7aWYoYy5yZXBlYXQmJihmPWIuUkVQRUFULGc9Yi5SRVBFQVQpLGIucGl4ZWxTdG9yZWkoYi5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCEhYy5mbGlwWSksYy53aWR0aCl7dmFyIGk9Yy53aWR0aD9jLndpZHRoOjUxMixqPWMuaGVpZ2h0P2MuaGVpZ2h0OjIsaz1jLmJvcmRlcj9jLmJvcmRlcjowO2IudGV4SW1hZ2UyRChiLlRFWFRVUkVfMkQsMCxoLGksaixrLGgsYi5VTlNJR05FRF9CWVRFLG51bGwpfWVsc2UgYi50ZXhJbWFnZTJEKGIuVEVYVFVSRV8yRCwwLGgsYi5SR0JBLGIuVU5TSUdORURfQllURSxhLnZhbHVlLmJhc2VUZXh0dXJlLnNvdXJjZSk7Yi50ZXhQYXJhbWV0ZXJpKGIuVEVYVFVSRV8yRCxiLlRFWFRVUkVfTUFHX0ZJTFRFUixkKSxiLnRleFBhcmFtZXRlcmkoYi5URVhUVVJFXzJELGIuVEVYVFVSRV9NSU5fRklMVEVSLGUpLGIudGV4UGFyYW1ldGVyaShiLlRFWFRVUkVfMkQsYi5URVhUVVJFX1dSQVBfUyxmKSxiLnRleFBhcmFtZXRlcmkoYi5URVhUVVJFXzJELGIuVEVYVFVSRV9XUkFQX1QsZyl9Yi51bmlmb3JtMWkoYS51bmlmb3JtTG9jYXRpb24sdGhpcy50ZXh0dXJlQ291bnQpLGEuX2luaXQ9ITAsdGhpcy50ZXh0dXJlQ291bnQrK319LGIuUGl4aVNoYWRlci5wcm90b3R5cGUuc3luY1VuaWZvcm1zPWZ1bmN0aW9uKCl7dGhpcy50ZXh0dXJlQ291bnQ9MTt2YXIgYSxjPXRoaXMuZ2w7Zm9yKHZhciBkIGluIHRoaXMudW5pZm9ybXMpYT10aGlzLnVuaWZvcm1zW2RdLDE9PT1hLmdsVmFsdWVMZW5ndGg/YS5nbE1hdHJpeD09PSEwP2EuZ2xGdW5jLmNhbGwoYyxhLnVuaWZvcm1Mb2NhdGlvbixhLnRyYW5zcG9zZSxhLnZhbHVlKTphLmdsRnVuYy5jYWxsKGMsYS51bmlmb3JtTG9jYXRpb24sYS52YWx1ZSk6Mj09PWEuZ2xWYWx1ZUxlbmd0aD9hLmdsRnVuYy5jYWxsKGMsYS51bmlmb3JtTG9jYXRpb24sYS52YWx1ZS54LGEudmFsdWUueSk6Mz09PWEuZ2xWYWx1ZUxlbmd0aD9hLmdsRnVuYy5jYWxsKGMsYS51bmlmb3JtTG9jYXRpb24sYS52YWx1ZS54LGEudmFsdWUueSxhLnZhbHVlLnopOjQ9PT1hLmdsVmFsdWVMZW5ndGg/YS5nbEZ1bmMuY2FsbChjLGEudW5pZm9ybUxvY2F0aW9uLGEudmFsdWUueCxhLnZhbHVlLnksYS52YWx1ZS56LGEudmFsdWUudyk6XCJzYW1wbGVyMkRcIj09PWEudHlwZSYmKGEuX2luaXQ/KGMuYWN0aXZlVGV4dHVyZShjW1wiVEVYVFVSRVwiK3RoaXMudGV4dHVyZUNvdW50XSksYS52YWx1ZS5iYXNlVGV4dHVyZS5fZGlydHlbYy5pZF0/Yi5pbnN0YW5jZXNbYy5pZF0udXBkYXRlVGV4dHVyZShhLnZhbHVlLmJhc2VUZXh0dXJlKTpjLmJpbmRUZXh0dXJlKGMuVEVYVFVSRV8yRCxhLnZhbHVlLmJhc2VUZXh0dXJlLl9nbFRleHR1cmVzW2MuaWRdKSxjLnVuaWZvcm0xaShhLnVuaWZvcm1Mb2NhdGlvbix0aGlzLnRleHR1cmVDb3VudCksdGhpcy50ZXh0dXJlQ291bnQrKyk6dGhpcy5pbml0U2FtcGxlcjJEKGEpKX0sYi5QaXhpU2hhZGVyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5nbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSksdGhpcy51bmlmb3Jtcz1udWxsLHRoaXMuZ2w9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9bnVsbH0sYi5QaXhpU2hhZGVyLmRlZmF1bHRWZXJ0ZXhTcmM9W1wiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1wiLFwiYXR0cmlidXRlIHZlYzIgYVRleHR1cmVDb29yZDtcIixcImF0dHJpYnV0ZSB2ZWM0IGFDb2xvcjtcIixcInVuaWZvcm0gdmVjMiBwcm9qZWN0aW9uVmVjdG9yO1wiLFwidW5pZm9ybSB2ZWMyIG9mZnNldFZlY3RvcjtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcImNvbnN0IHZlYzIgY2VudGVyID0gdmVjMigtMS4wLCAxLjApO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCggKChhVmVydGV4UG9zaXRpb24gKyBvZmZzZXRWZWN0b3IpIC8gcHJvamVjdGlvblZlY3RvcikgKyBjZW50ZXIgLCAwLjAsIDEuMCk7XCIsXCIgICB2VGV4dHVyZUNvb3JkID0gYVRleHR1cmVDb29yZDtcIixcIiAgIHZDb2xvciA9IHZlYzQoYUNvbG9yLnJnYiAqIGFDb2xvci5hLCBhQ29sb3IuYSk7XCIsXCJ9XCJdLGIuUGl4aUZhc3RTaGFkZXI9ZnVuY3Rpb24oYSl7dGhpcy5fVUlEPWIuX1VJRCsrLHRoaXMuZ2w9YSx0aGlzLnByb2dyYW09bnVsbCx0aGlzLmZyYWdtZW50U3JjPVtcInByZWNpc2lvbiBsb3dwIGZsb2F0O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIGZsb2F0IHZDb2xvcjtcIixcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCkgKiB2Q29sb3IgO1wiLFwifVwiXSx0aGlzLnZlcnRleFNyYz1bXCJhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XCIsXCJhdHRyaWJ1dGUgdmVjMiBhUG9zaXRpb25Db29yZDtcIixcImF0dHJpYnV0ZSB2ZWMyIGFTY2FsZTtcIixcImF0dHJpYnV0ZSBmbG9hdCBhUm90YXRpb247XCIsXCJhdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO1wiLFwiYXR0cmlidXRlIGZsb2F0IGFDb2xvcjtcIixcInVuaWZvcm0gdmVjMiBwcm9qZWN0aW9uVmVjdG9yO1wiLFwidW5pZm9ybSB2ZWMyIG9mZnNldFZlY3RvcjtcIixcInVuaWZvcm0gbWF0MyB1TWF0cml4O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIGZsb2F0IHZDb2xvcjtcIixcImNvbnN0IHZlYzIgY2VudGVyID0gdmVjMigtMS4wLCAxLjApO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIHZlYzIgdjtcIixcIiAgIHZlYzIgc3YgPSBhVmVydGV4UG9zaXRpb24gKiBhU2NhbGU7XCIsXCIgICB2LnggPSAoc3YueCkgKiBjb3MoYVJvdGF0aW9uKSAtIChzdi55KSAqIHNpbihhUm90YXRpb24pO1wiLFwiICAgdi55ID0gKHN2LngpICogc2luKGFSb3RhdGlvbikgKyAoc3YueSkgKiBjb3MoYVJvdGF0aW9uKTtcIixcIiAgIHYgPSAoIHVNYXRyaXggKiB2ZWMzKHYgKyBhUG9zaXRpb25Db29yZCAsIDEuMCkgKS54eSA7XCIsXCIgICBnbF9Qb3NpdGlvbiA9IHZlYzQoICggdiAvIHByb2plY3Rpb25WZWN0b3IpICsgY2VudGVyICwgMC4wLCAxLjApO1wiLFwiICAgdlRleHR1cmVDb29yZCA9IGFUZXh0dXJlQ29vcmQ7XCIsXCIgICB2Q29sb3IgPSBhQ29sb3I7XCIsXCJ9XCJdLHRoaXMudGV4dHVyZUNvdW50PTAsdGhpcy5pbml0KCl9LGIuUGl4aUZhc3RTaGFkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuUGl4aUZhc3RTaGFkZXIsYi5QaXhpRmFzdFNoYWRlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2wsYz1iLmNvbXBpbGVQcm9ncmFtKGEsdGhpcy52ZXJ0ZXhTcmMsdGhpcy5mcmFnbWVudFNyYyk7YS51c2VQcm9ncmFtKGMpLHRoaXMudVNhbXBsZXI9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcInVTYW1wbGVyXCIpLHRoaXMucHJvamVjdGlvblZlY3Rvcj1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwicHJvamVjdGlvblZlY3RvclwiKSx0aGlzLm9mZnNldFZlY3Rvcj1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwib2Zmc2V0VmVjdG9yXCIpLHRoaXMuZGltZW5zaW9ucz1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwiZGltZW5zaW9uc1wiKSx0aGlzLnVNYXRyaXg9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcInVNYXRyaXhcIiksdGhpcy5hVmVydGV4UG9zaXRpb249YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYVZlcnRleFBvc2l0aW9uXCIpLHRoaXMuYVBvc2l0aW9uQ29vcmQ9YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYVBvc2l0aW9uQ29vcmRcIiksdGhpcy5hU2NhbGU9YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYVNjYWxlXCIpLHRoaXMuYVJvdGF0aW9uPWEuZ2V0QXR0cmliTG9jYXRpb24oYyxcImFSb3RhdGlvblwiKSx0aGlzLmFUZXh0dXJlQ29vcmQ9YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYVRleHR1cmVDb29yZFwiKSx0aGlzLmNvbG9yQXR0cmlidXRlPWEuZ2V0QXR0cmliTG9jYXRpb24oYyxcImFDb2xvclwiKSwtMT09PXRoaXMuY29sb3JBdHRyaWJ1dGUmJih0aGlzLmNvbG9yQXR0cmlidXRlPTIpLHRoaXMuYXR0cmlidXRlcz1bdGhpcy5hVmVydGV4UG9zaXRpb24sdGhpcy5hUG9zaXRpb25Db29yZCx0aGlzLmFTY2FsZSx0aGlzLmFSb3RhdGlvbix0aGlzLmFUZXh0dXJlQ29vcmQsdGhpcy5jb2xvckF0dHJpYnV0ZV0sdGhpcy5wcm9ncmFtPWN9LGIuUGl4aUZhc3RTaGFkZXIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdsLmRlbGV0ZVByb2dyYW0odGhpcy5wcm9ncmFtKSx0aGlzLnVuaWZvcm1zPW51bGwsdGhpcy5nbD1udWxsLHRoaXMuYXR0cmlidXRlcz1udWxsfSxiLlN0cmlwU2hhZGVyPWZ1bmN0aW9uKGEpe3RoaXMuX1VJRD1iLl9VSUQrKyx0aGlzLmdsPWEsdGhpcy5wcm9ncmFtPW51bGwsdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidW5pZm9ybSBmbG9hdCBhbHBoYTtcIixcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLngsIHZUZXh0dXJlQ29vcmQueSkpICogYWxwaGE7XCIsXCJ9XCJdLHRoaXMudmVydGV4U3JjPVtcImF0dHJpYnV0ZSB2ZWMyIGFWZXJ0ZXhQb3NpdGlvbjtcIixcImF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XCIsXCJ1bmlmb3JtIG1hdDMgdHJhbnNsYXRpb25NYXRyaXg7XCIsXCJ1bmlmb3JtIHZlYzIgcHJvamVjdGlvblZlY3RvcjtcIixcInVuaWZvcm0gdmVjMiBvZmZzZXRWZWN0b3I7XCIsXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICB2ZWMzIHYgPSB0cmFuc2xhdGlvbk1hdHJpeCAqIHZlYzMoYVZlcnRleFBvc2l0aW9uICwgMS4wKTtcIixcIiAgIHYgLT0gb2Zmc2V0VmVjdG9yLnh5eDtcIixcIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCggdi54IC8gcHJvamVjdGlvblZlY3Rvci54IC0xLjAsIHYueSAvIC1wcm9qZWN0aW9uVmVjdG9yLnkgKyAxLjAgLCAwLjAsIDEuMCk7XCIsXCIgICB2VGV4dHVyZUNvb3JkID0gYVRleHR1cmVDb29yZDtcIixcIn1cIl0sdGhpcy5pbml0KCl9LGIuU3RyaXBTaGFkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuU3RyaXBTaGFkZXIsYi5TdHJpcFNoYWRlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2wsYz1iLmNvbXBpbGVQcm9ncmFtKGEsdGhpcy52ZXJ0ZXhTcmMsdGhpcy5mcmFnbWVudFNyYyk7YS51c2VQcm9ncmFtKGMpLHRoaXMudVNhbXBsZXI9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcInVTYW1wbGVyXCIpLHRoaXMucHJvamVjdGlvblZlY3Rvcj1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwicHJvamVjdGlvblZlY3RvclwiKSx0aGlzLm9mZnNldFZlY3Rvcj1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwib2Zmc2V0VmVjdG9yXCIpLHRoaXMuY29sb3JBdHRyaWJ1dGU9YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYUNvbG9yXCIpLHRoaXMuYVZlcnRleFBvc2l0aW9uPWEuZ2V0QXR0cmliTG9jYXRpb24oYyxcImFWZXJ0ZXhQb3NpdGlvblwiKSx0aGlzLmFUZXh0dXJlQ29vcmQ9YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYVRleHR1cmVDb29yZFwiKSx0aGlzLmF0dHJpYnV0ZXM9W3RoaXMuYVZlcnRleFBvc2l0aW9uLHRoaXMuYVRleHR1cmVDb29yZF0sdGhpcy50cmFuc2xhdGlvbk1hdHJpeD1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwidHJhbnNsYXRpb25NYXRyaXhcIiksdGhpcy5hbHBoYT1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwiYWxwaGFcIiksdGhpcy5wcm9ncmFtPWN9LGIuU3RyaXBTaGFkZXIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdsLmRlbGV0ZVByb2dyYW0odGhpcy5wcm9ncmFtKSx0aGlzLnVuaWZvcm1zPW51bGwsdGhpcy5nbD1udWxsLHRoaXMuYXR0cmlidXRlPW51bGx9LGIuUHJpbWl0aXZlU2hhZGVyPWZ1bmN0aW9uKGEpe3RoaXMuX1VJRD1iLl9VSUQrKyx0aGlzLmdsPWEsdGhpcy5wcm9ncmFtPW51bGwsdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjNCB2Q29sb3I7XCIsXCJ2b2lkIG1haW4odm9pZCkge1wiLFwiICAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yO1wiLFwifVwiXSx0aGlzLnZlcnRleFNyYz1bXCJhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XCIsXCJhdHRyaWJ1dGUgdmVjNCBhQ29sb3I7XCIsXCJ1bmlmb3JtIG1hdDMgdHJhbnNsYXRpb25NYXRyaXg7XCIsXCJ1bmlmb3JtIHZlYzIgcHJvamVjdGlvblZlY3RvcjtcIixcInVuaWZvcm0gdmVjMiBvZmZzZXRWZWN0b3I7XCIsXCJ1bmlmb3JtIGZsb2F0IGFscGhhO1wiLFwidW5pZm9ybSBmbG9hdCBmbGlwWTtcIixcInVuaWZvcm0gdmVjMyB0aW50O1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICB2ZWMzIHYgPSB0cmFuc2xhdGlvbk1hdHJpeCAqIHZlYzMoYVZlcnRleFBvc2l0aW9uICwgMS4wKTtcIixcIiAgIHYgLT0gb2Zmc2V0VmVjdG9yLnh5eDtcIixcIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCggdi54IC8gcHJvamVjdGlvblZlY3Rvci54IC0xLjAsICh2LnkgLyBwcm9qZWN0aW9uVmVjdG9yLnkgKiAtZmxpcFkpICsgZmxpcFkgLCAwLjAsIDEuMCk7XCIsXCIgICB2Q29sb3IgPSBhQ29sb3IgKiB2ZWM0KHRpbnQgKiBhbHBoYSwgYWxwaGEpO1wiLFwifVwiXSx0aGlzLmluaXQoKX0sYi5QcmltaXRpdmVTaGFkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuUHJpbWl0aXZlU2hhZGVyLGIuUHJpbWl0aXZlU2hhZGVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nbCxjPWIuY29tcGlsZVByb2dyYW0oYSx0aGlzLnZlcnRleFNyYyx0aGlzLmZyYWdtZW50U3JjKTthLnVzZVByb2dyYW0oYyksdGhpcy5wcm9qZWN0aW9uVmVjdG9yPWEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsXCJwcm9qZWN0aW9uVmVjdG9yXCIpLHRoaXMub2Zmc2V0VmVjdG9yPWEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsXCJvZmZzZXRWZWN0b3JcIiksdGhpcy50aW50Q29sb3I9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcInRpbnRcIiksdGhpcy5mbGlwWT1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwiZmxpcFlcIiksdGhpcy5hVmVydGV4UG9zaXRpb249YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYVZlcnRleFBvc2l0aW9uXCIpLHRoaXMuY29sb3JBdHRyaWJ1dGU9YS5nZXRBdHRyaWJMb2NhdGlvbihjLFwiYUNvbG9yXCIpLHRoaXMuYXR0cmlidXRlcz1bdGhpcy5hVmVydGV4UG9zaXRpb24sdGhpcy5jb2xvckF0dHJpYnV0ZV0sdGhpcy50cmFuc2xhdGlvbk1hdHJpeD1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwidHJhbnNsYXRpb25NYXRyaXhcIiksdGhpcy5hbHBoYT1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwiYWxwaGFcIiksdGhpcy5wcm9ncmFtPWN9LGIuUHJpbWl0aXZlU2hhZGVyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5nbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSksdGhpcy51bmlmb3Jtcz1udWxsLHRoaXMuZ2w9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9bnVsbH0sYi5Db21wbGV4UHJpbWl0aXZlU2hhZGVyPWZ1bmN0aW9uKGEpe3RoaXMuX1VJRD1iLl9VSUQrKyx0aGlzLmdsPWEsdGhpcy5wcm9ncmFtPW51bGwsdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjNCB2Q29sb3I7XCIsXCJ2b2lkIG1haW4odm9pZCkge1wiLFwiICAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yO1wiLFwifVwiXSx0aGlzLnZlcnRleFNyYz1bXCJhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XCIsXCJ1bmlmb3JtIG1hdDMgdHJhbnNsYXRpb25NYXRyaXg7XCIsXCJ1bmlmb3JtIHZlYzIgcHJvamVjdGlvblZlY3RvcjtcIixcInVuaWZvcm0gdmVjMiBvZmZzZXRWZWN0b3I7XCIsXCJ1bmlmb3JtIHZlYzMgdGludDtcIixcInVuaWZvcm0gZmxvYXQgYWxwaGE7XCIsXCJ1bmlmb3JtIHZlYzMgY29sb3I7XCIsXCJ1bmlmb3JtIGZsb2F0IGZsaXBZO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICB2ZWMzIHYgPSB0cmFuc2xhdGlvbk1hdHJpeCAqIHZlYzMoYVZlcnRleFBvc2l0aW9uICwgMS4wKTtcIixcIiAgIHYgLT0gb2Zmc2V0VmVjdG9yLnh5eDtcIixcIiAgIGdsX1Bvc2l0aW9uID0gdmVjNCggdi54IC8gcHJvamVjdGlvblZlY3Rvci54IC0xLjAsICh2LnkgLyBwcm9qZWN0aW9uVmVjdG9yLnkgKiAtZmxpcFkpICsgZmxpcFkgLCAwLjAsIDEuMCk7XCIsXCIgICB2Q29sb3IgPSB2ZWM0KGNvbG9yICogYWxwaGEgKiB0aW50LCBhbHBoYSk7XCIsXCJ9XCJdLHRoaXMuaW5pdCgpfSxiLkNvbXBsZXhQcmltaXRpdmVTaGFkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuQ29tcGxleFByaW1pdGl2ZVNoYWRlcixiLkNvbXBsZXhQcmltaXRpdmVTaGFkZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdsLGM9Yi5jb21waWxlUHJvZ3JhbShhLHRoaXMudmVydGV4U3JjLHRoaXMuZnJhZ21lbnRTcmMpO2EudXNlUHJvZ3JhbShjKSx0aGlzLnByb2plY3Rpb25WZWN0b3I9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcInByb2plY3Rpb25WZWN0b3JcIiksdGhpcy5vZmZzZXRWZWN0b3I9YS5nZXRVbmlmb3JtTG9jYXRpb24oYyxcIm9mZnNldFZlY3RvclwiKSx0aGlzLnRpbnRDb2xvcj1hLmdldFVuaWZvcm1Mb2NhdGlvbihjLFwidGludFwiKSx0aGlzLmNvbG9yPWEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsXCJjb2xvclwiKSx0aGlzLmZsaXBZPWEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsXCJmbGlwWVwiKSx0aGlzLmFWZXJ0ZXhQb3NpdGlvbj1hLmdldEF0dHJpYkxvY2F0aW9uKGMsXCJhVmVydGV4UG9zaXRpb25cIiksdGhpcy5hdHRyaWJ1dGVzPVt0aGlzLmFWZXJ0ZXhQb3NpdGlvbix0aGlzLmNvbG9yQXR0cmlidXRlXSx0aGlzLnRyYW5zbGF0aW9uTWF0cml4PWEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsXCJ0cmFuc2xhdGlvbk1hdHJpeFwiKSx0aGlzLmFscGhhPWEuZ2V0VW5pZm9ybUxvY2F0aW9uKGMsXCJhbHBoYVwiKSx0aGlzLnByb2dyYW09Y30sYi5Db21wbGV4UHJpbWl0aXZlU2hhZGVyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5nbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSksdGhpcy51bmlmb3Jtcz1udWxsLHRoaXMuZ2w9bnVsbCx0aGlzLmF0dHJpYnV0ZT1udWxsfSxiLldlYkdMR3JhcGhpY3M9ZnVuY3Rpb24oKXt9LGIuV2ViR0xHcmFwaGljcy5yZW5kZXJHcmFwaGljcz1mdW5jdGlvbihhLGMpe3ZhciBkLGU9Yy5nbCxmPWMucHJvamVjdGlvbixnPWMub2Zmc2V0LGg9Yy5zaGFkZXJNYW5hZ2VyLnByaW1pdGl2ZVNoYWRlcjthLmRpcnR5JiZiLldlYkdMR3JhcGhpY3MudXBkYXRlR3JhcGhpY3MoYSxlKTtmb3IodmFyIGk9YS5fd2ViR0xbZS5pZF0saj0wO2o8aS5kYXRhLmxlbmd0aDtqKyspMT09PWkuZGF0YVtqXS5tb2RlPyhkPWkuZGF0YVtqXSxjLnN0ZW5jaWxNYW5hZ2VyLnB1c2hTdGVuY2lsKGEsZCxjKSxlLmRyYXdFbGVtZW50cyhlLlRSSUFOR0xFX0ZBTiw0LGUuVU5TSUdORURfU0hPUlQsMiooZC5pbmRpY2VzLmxlbmd0aC00KSksYy5zdGVuY2lsTWFuYWdlci5wb3BTdGVuY2lsKGEsZCxjKSk6KGQ9aS5kYXRhW2pdLGMuc2hhZGVyTWFuYWdlci5zZXRTaGFkZXIoaCksaD1jLnNoYWRlck1hbmFnZXIucHJpbWl0aXZlU2hhZGVyLGUudW5pZm9ybU1hdHJpeDNmdihoLnRyYW5zbGF0aW9uTWF0cml4LCExLGEud29ybGRUcmFuc2Zvcm0udG9BcnJheSghMCkpLGUudW5pZm9ybTFmKGguZmxpcFksMSksZS51bmlmb3JtMmYoaC5wcm9qZWN0aW9uVmVjdG9yLGYueCwtZi55KSxlLnVuaWZvcm0yZihoLm9mZnNldFZlY3RvciwtZy54LC1nLnkpLGUudW5pZm9ybTNmdihoLnRpbnRDb2xvcixiLmhleDJyZ2IoYS50aW50KSksZS51bmlmb3JtMWYoaC5hbHBoYSxhLndvcmxkQWxwaGEpLGUuYmluZEJ1ZmZlcihlLkFSUkFZX0JVRkZFUixkLmJ1ZmZlciksZS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGguYVZlcnRleFBvc2l0aW9uLDIsZS5GTE9BVCwhMSwyNCwwKSxlLnZlcnRleEF0dHJpYlBvaW50ZXIoaC5jb2xvckF0dHJpYnV0ZSw0LGUuRkxPQVQsITEsMjQsOCksZS5iaW5kQnVmZmVyKGUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsZC5pbmRleEJ1ZmZlciksZS5kcmF3RWxlbWVudHMoZS5UUklBTkdMRV9TVFJJUCxkLmluZGljZXMubGVuZ3RoLGUuVU5TSUdORURfU0hPUlQsMCkpfSxiLldlYkdMR3JhcGhpY3MudXBkYXRlR3JhcGhpY3M9ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLl93ZWJHTFtjLmlkXTtkfHwoZD1hLl93ZWJHTFtjLmlkXT17bGFzdEluZGV4OjAsZGF0YTpbXSxnbDpjfSksYS5kaXJ0eT0hMTt2YXIgZTtpZihhLmNsZWFyRGlydHkpe2ZvcihhLmNsZWFyRGlydHk9ITEsZT0wO2U8ZC5kYXRhLmxlbmd0aDtlKyspe3ZhciBmPWQuZGF0YVtlXTtmLnJlc2V0KCksYi5XZWJHTEdyYXBoaWNzLmdyYXBoaWNzRGF0YVBvb2wucHVzaChmKX1kLmRhdGE9W10sZC5sYXN0SW5kZXg9MH12YXIgZztmb3IoZT1kLmxhc3RJbmRleDtlPGEuZ3JhcGhpY3NEYXRhLmxlbmd0aDtlKyspe3ZhciBoPWEuZ3JhcGhpY3NEYXRhW2VdO2lmKGgudHlwZT09PWIuR3JhcGhpY3MuUE9MWSl7aWYoaC5wb2ludHM9aC5zaGFwZS5wb2ludHMuc2xpY2UoKSxoLnNoYXBlLmNsb3NlZCYmKGgucG9pbnRzWzBdIT09aC5wb2ludHNbaC5wb2ludHMubGVuZ3RoLTJdfHxoLnBvaW50c1sxXSE9PWgucG9pbnRzW2gucG9pbnRzLmxlbmd0aC0xXSkmJmgucG9pbnRzLnB1c2goaC5wb2ludHNbMF0saC5wb2ludHNbMV0pLGguZmlsbCYmaC5wb2ludHMubGVuZ3RoPj02KWlmKGgucG9pbnRzLmxlbmd0aDwxMil7Zz1iLldlYkdMR3JhcGhpY3Muc3dpdGNoTW9kZShkLDApO3ZhciBpPWIuV2ViR0xHcmFwaGljcy5idWlsZFBvbHkoaCxnKTtpfHwoZz1iLldlYkdMR3JhcGhpY3Muc3dpdGNoTW9kZShkLDEpLGIuV2ViR0xHcmFwaGljcy5idWlsZENvbXBsZXhQb2x5KGgsZykpfWVsc2UgZz1iLldlYkdMR3JhcGhpY3Muc3dpdGNoTW9kZShkLDEpLGIuV2ViR0xHcmFwaGljcy5idWlsZENvbXBsZXhQb2x5KGgsZyk7aC5saW5lV2lkdGg+MCYmKGc9Yi5XZWJHTEdyYXBoaWNzLnN3aXRjaE1vZGUoZCwwKSxiLldlYkdMR3JhcGhpY3MuYnVpbGRMaW5lKGgsZykpfWVsc2UgZz1iLldlYkdMR3JhcGhpY3Muc3dpdGNoTW9kZShkLDApLGgudHlwZT09PWIuR3JhcGhpY3MuUkVDVD9iLldlYkdMR3JhcGhpY3MuYnVpbGRSZWN0YW5nbGUoaCxnKTpoLnR5cGU9PT1iLkdyYXBoaWNzLkNJUkN8fGgudHlwZT09PWIuR3JhcGhpY3MuRUxJUD9iLldlYkdMR3JhcGhpY3MuYnVpbGRDaXJjbGUoaCxnKTpoLnR5cGU9PT1iLkdyYXBoaWNzLlJSRUMmJmIuV2ViR0xHcmFwaGljcy5idWlsZFJvdW5kZWRSZWN0YW5nbGUoaCxnKTtkLmxhc3RJbmRleCsrfWZvcihlPTA7ZTxkLmRhdGEubGVuZ3RoO2UrKylnPWQuZGF0YVtlXSxnLmRpcnR5JiZnLnVwbG9hZCgpfSxiLldlYkdMR3JhcGhpY3Muc3dpdGNoTW9kZT1mdW5jdGlvbihhLGMpe3ZhciBkO3JldHVybiBhLmRhdGEubGVuZ3RoPyhkPWEuZGF0YVthLmRhdGEubGVuZ3RoLTFdLChkLm1vZGUhPT1jfHwxPT09YykmJihkPWIuV2ViR0xHcmFwaGljcy5ncmFwaGljc0RhdGFQb29sLnBvcCgpfHxuZXcgYi5XZWJHTEdyYXBoaWNzRGF0YShhLmdsKSxkLm1vZGU9YyxhLmRhdGEucHVzaChkKSkpOihkPWIuV2ViR0xHcmFwaGljcy5ncmFwaGljc0RhdGFQb29sLnBvcCgpfHxuZXcgYi5XZWJHTEdyYXBoaWNzRGF0YShhLmdsKSxkLm1vZGU9YyxhLmRhdGEucHVzaChkKSksZC5kaXJ0eT0hMCxkfSxiLldlYkdMR3JhcGhpY3MuYnVpbGRSZWN0YW5nbGU9ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnNoYXBlLGU9ZC54LGY9ZC55LGc9ZC53aWR0aCxoPWQuaGVpZ2h0O2lmKGEuZmlsbCl7dmFyIGk9Yi5oZXgycmdiKGEuZmlsbENvbG9yKSxqPWEuZmlsbEFscGhhLGs9aVswXSpqLGw9aVsxXSpqLG09aVsyXSpqLG49Yy5wb2ludHMsbz1jLmluZGljZXMscD1uLmxlbmd0aC82O24ucHVzaChlLGYpLG4ucHVzaChrLGwsbSxqKSxuLnB1c2goZStnLGYpLG4ucHVzaChrLGwsbSxqKSxuLnB1c2goZSxmK2gpLG4ucHVzaChrLGwsbSxqKSxuLnB1c2goZStnLGYraCksbi5wdXNoKGssbCxtLGopLG8ucHVzaChwLHAscCsxLHArMixwKzMscCszKX1pZihhLmxpbmVXaWR0aCl7dmFyIHE9YS5wb2ludHM7YS5wb2ludHM9W2UsZixlK2csZixlK2csZitoLGUsZitoLGUsZl0sYi5XZWJHTEdyYXBoaWNzLmJ1aWxkTGluZShhLGMpLGEucG9pbnRzPXF9fSxiLldlYkdMR3JhcGhpY3MuYnVpbGRSb3VuZGVkUmVjdGFuZ2xlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5zaGFwZSxlPWQueCxmPWQueSxnPWQud2lkdGgsaD1kLmhlaWdodCxpPWQucmFkaXVzLGo9W107aWYoai5wdXNoKGUsZitpKSxqPWouY29uY2F0KGIuV2ViR0xHcmFwaGljcy5xdWFkcmF0aWNCZXppZXJDdXJ2ZShlLGYraC1pLGUsZitoLGUraSxmK2gpKSxqPWouY29uY2F0KGIuV2ViR0xHcmFwaGljcy5xdWFkcmF0aWNCZXppZXJDdXJ2ZShlK2ctaSxmK2gsZStnLGYraCxlK2csZitoLWkpKSxqPWouY29uY2F0KGIuV2ViR0xHcmFwaGljcy5xdWFkcmF0aWNCZXppZXJDdXJ2ZShlK2csZitpLGUrZyxmLGUrZy1pLGYpKSxqPWouY29uY2F0KGIuV2ViR0xHcmFwaGljcy5xdWFkcmF0aWNCZXppZXJDdXJ2ZShlK2ksZixlLGYsZSxmK2kpKSxhLmZpbGwpe3ZhciBrPWIuaGV4MnJnYihhLmZpbGxDb2xvciksbD1hLmZpbGxBbHBoYSxtPWtbMF0qbCxuPWtbMV0qbCxvPWtbMl0qbCxwPWMucG9pbnRzLHE9Yy5pbmRpY2VzLHI9cC5sZW5ndGgvNixzPWIuUG9seUsuVHJpYW5ndWxhdGUoaiksdD0wO2Zvcih0PTA7dDxzLmxlbmd0aDt0Kz0zKXEucHVzaChzW3RdK3IpLHEucHVzaChzW3RdK3IpLHEucHVzaChzW3QrMV0rcikscS5wdXNoKHNbdCsyXStyKSxxLnB1c2goc1t0KzJdK3IpO2Zvcih0PTA7dDxqLmxlbmd0aDt0KyspcC5wdXNoKGpbdF0salsrK3RdLG0sbixvLGwpfWlmKGEubGluZVdpZHRoKXt2YXIgdT1hLnBvaW50czthLnBvaW50cz1qLGIuV2ViR0xHcmFwaGljcy5idWlsZExpbmUoYSxjKSxhLnBvaW50cz11fX0sYi5XZWJHTEdyYXBoaWNzLnF1YWRyYXRpY0JlemllckN1cnZlPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtmdW5jdGlvbiBnKGEsYixjKXt2YXIgZD1iLWE7cmV0dXJuIGErZCpjfWZvcih2YXIgaCxpLGosayxsLG0sbj0yMCxvPVtdLHA9MCxxPTA7bj49cTtxKyspcD1xL24saD1nKGEsYyxwKSxpPWcoYixkLHApLGo9ZyhjLGUscCksaz1nKGQsZixwKSxsPWcoaCxqLHApLG09ZyhpLGsscCksby5wdXNoKGwsbSk7cmV0dXJuIG99LGIuV2ViR0xHcmFwaGljcy5idWlsZENpcmNsZT1mdW5jdGlvbihhLGMpe3ZhciBkLGUsZj1hLnNoYXBlLGc9Zi54LGg9Zi55O2EudHlwZT09PWIuR3JhcGhpY3MuQ0lSQz8oZD1mLnJhZGl1cyxlPWYucmFkaXVzKTooZD1mLndpZHRoLGU9Zi5oZWlnaHQpO3ZhciBpPTQwLGo9MipNYXRoLlBJL2ksaz0wO2lmKGEuZmlsbCl7dmFyIGw9Yi5oZXgycmdiKGEuZmlsbENvbG9yKSxtPWEuZmlsbEFscGhhLG49bFswXSptLG89bFsxXSptLHA9bFsyXSptLHE9Yy5wb2ludHMscj1jLmluZGljZXMscz1xLmxlbmd0aC82O2ZvcihyLnB1c2gocyksaz0wO2krMT5rO2srKylxLnB1c2goZyxoLG4sbyxwLG0pLHEucHVzaChnK01hdGguc2luKGoqaykqZCxoK01hdGguY29zKGoqaykqZSxuLG8scCxtKSxyLnB1c2gocysrLHMrKyk7ci5wdXNoKHMtMSl9aWYoYS5saW5lV2lkdGgpe3ZhciB0PWEucG9pbnRzO2ZvcihhLnBvaW50cz1bXSxrPTA7aSsxPms7aysrKWEucG9pbnRzLnB1c2goZytNYXRoLnNpbihqKmspKmQsaCtNYXRoLmNvcyhqKmspKmUpO2IuV2ViR0xHcmFwaGljcy5idWlsZExpbmUoYSxjKSxhLnBvaW50cz10fX0sYi5XZWJHTEdyYXBoaWNzLmJ1aWxkTGluZT1mdW5jdGlvbihhLGMpe3ZhciBkPTAsZT1hLnBvaW50cztpZigwIT09ZS5sZW5ndGgpe2lmKGEubGluZVdpZHRoJTIpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyllW2RdKz0uNTt2YXIgZj1uZXcgYi5Qb2ludChlWzBdLGVbMV0pLGc9bmV3IGIuUG9pbnQoZVtlLmxlbmd0aC0yXSxlW2UubGVuZ3RoLTFdKTtpZihmLng9PT1nLngmJmYueT09PWcueSl7ZT1lLnNsaWNlKCksZS5wb3AoKSxlLnBvcCgpLGc9bmV3IGIuUG9pbnQoZVtlLmxlbmd0aC0yXSxlW2UubGVuZ3RoLTFdKTt2YXIgaD1nLngrLjUqKGYueC1nLngpLGk9Zy55Ky41KihmLnktZy55KTtlLnVuc2hpZnQoaCxpKSxlLnB1c2goaCxpKX12YXIgaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgseSx6LEEsQixDLEQsRSxGLEc9Yy5wb2ludHMsSD1jLmluZGljZXMsST1lLmxlbmd0aC8yLEo9ZS5sZW5ndGgsSz1HLmxlbmd0aC82LEw9YS5saW5lV2lkdGgvMixNPWIuaGV4MnJnYihhLmxpbmVDb2xvciksTj1hLmxpbmVBbHBoYSxPPU1bMF0qTixQPU1bMV0qTixRPU1bMl0qTjtmb3IobD1lWzBdLG09ZVsxXSxuPWVbMl0sbz1lWzNdLHI9LShtLW8pLHM9bC1uLEY9TWF0aC5zcXJ0KHIqcitzKnMpLHIvPUYscy89RixyKj1MLHMqPUwsRy5wdXNoKGwtcixtLXMsTyxQLFEsTiksRy5wdXNoKGwrcixtK3MsTyxQLFEsTiksZD0xO0ktMT5kO2QrKylsPWVbMiooZC0xKV0sbT1lWzIqKGQtMSkrMV0sbj1lWzIqZF0sbz1lWzIqZCsxXSxwPWVbMiooZCsxKV0scT1lWzIqKGQrMSkrMV0scj0tKG0tbykscz1sLW4sRj1NYXRoLnNxcnQocipyK3Mqcyksci89RixzLz1GLHIqPUwscyo9TCx0PS0oby1xKSx1PW4tcCxGPU1hdGguc3FydCh0KnQrdSp1KSx0Lz1GLHUvPUYsdCo9TCx1Kj1MLHg9LXMrbS0oLXMrbykseT0tcituLSgtcitsKSx6PSgtcitsKSooLXMrbyktKC1yK24pKigtcyttKSxBPS11K3EtKC11K28pLEI9LXQrbi0oLXQrcCksQz0oLXQrcCkqKC11K28pLSgtdCtuKSooLXUrcSksRD14KkItQSp5LE1hdGguYWJzKEQpPC4xPyhEKz0xMC4xLEcucHVzaChuLXIsby1zLE8sUCxRLE4pLEcucHVzaChuK3IsbytzLE8sUCxRLE4pKTooaj0oeSpDLUIqeikvRCxrPShBKnoteCpDKS9ELEU9KGotbikqKGotbikrKGstbykrKGstbyksRT4xOTYwMD8odj1yLXQsdz1zLXUsRj1NYXRoLnNxcnQodip2K3cqdyksdi89Rix3Lz1GLHYqPUwsdyo9TCxHLnB1c2gobi12LG8tdyksRy5wdXNoKE8sUCxRLE4pLEcucHVzaChuK3Ysbyt3KSxHLnB1c2goTyxQLFEsTiksRy5wdXNoKG4tdixvLXcpLEcucHVzaChPLFAsUSxOKSxKKyspOihHLnB1c2goaixrKSxHLnB1c2goTyxQLFEsTiksRy5wdXNoKG4tKGotbiksby0oay1vKSksRy5wdXNoKE8sUCxRLE4pKSk7XG5mb3IobD1lWzIqKEktMildLG09ZVsyKihJLTIpKzFdLG49ZVsyKihJLTEpXSxvPWVbMiooSS0xKSsxXSxyPS0obS1vKSxzPWwtbixGPU1hdGguc3FydChyKnIrcypzKSxyLz1GLHMvPUYscio9TCxzKj1MLEcucHVzaChuLXIsby1zKSxHLnB1c2goTyxQLFEsTiksRy5wdXNoKG4rcixvK3MpLEcucHVzaChPLFAsUSxOKSxILnB1c2goSyksZD0wO0o+ZDtkKyspSC5wdXNoKEsrKyk7SC5wdXNoKEstMSl9fSxiLldlYkdMR3JhcGhpY3MuYnVpbGRDb21wbGV4UG9seT1mdW5jdGlvbihhLGMpe3ZhciBkPWEucG9pbnRzLnNsaWNlKCk7aWYoIShkLmxlbmd0aDw2KSl7dmFyIGU9Yy5pbmRpY2VzO2MucG9pbnRzPWQsYy5hbHBoYT1hLmZpbGxBbHBoYSxjLmNvbG9yPWIuaGV4MnJnYihhLmZpbGxDb2xvcik7Zm9yKHZhciBmLGcsaD0xLzAsaT0tMS8wLGo9MS8wLGs9LTEvMCxsPTA7bDxkLmxlbmd0aDtsKz0yKWY9ZFtsXSxnPWRbbCsxXSxoPWg+Zj9mOmgsaT1mPmk/ZjppLGo9aj5nP2c6aixrPWc+az9nOms7ZC5wdXNoKGgsaixpLGosaSxrLGgsayk7dmFyIG09ZC5sZW5ndGgvMjtmb3IobD0wO20+bDtsKyspZS5wdXNoKGwpfX0sYi5XZWJHTEdyYXBoaWNzLmJ1aWxkUG9seT1mdW5jdGlvbihhLGMpe3ZhciBkPWEucG9pbnRzO2lmKCEoZC5sZW5ndGg8Nikpe3ZhciBlPWMucG9pbnRzLGY9Yy5pbmRpY2VzLGc9ZC5sZW5ndGgvMixoPWIuaGV4MnJnYihhLmZpbGxDb2xvciksaT1hLmZpbGxBbHBoYSxqPWhbMF0qaSxrPWhbMV0qaSxsPWhbMl0qaSxtPWIuUG9seUsuVHJpYW5ndWxhdGUoZCk7aWYoIW0pcmV0dXJuITE7dmFyIG49ZS5sZW5ndGgvNixvPTA7Zm9yKG89MDtvPG0ubGVuZ3RoO28rPTMpZi5wdXNoKG1bb10rbiksZi5wdXNoKG1bb10rbiksZi5wdXNoKG1bbysxXStuKSxmLnB1c2gobVtvKzJdK24pLGYucHVzaChtW28rMl0rbik7Zm9yKG89MDtnPm87bysrKWUucHVzaChkWzIqb10sZFsyKm8rMV0saixrLGwsaSk7cmV0dXJuITB9fSxiLldlYkdMR3JhcGhpY3MuZ3JhcGhpY3NEYXRhUG9vbD1bXSxiLldlYkdMR3JhcGhpY3NEYXRhPWZ1bmN0aW9uKGEpe3RoaXMuZ2w9YSx0aGlzLmNvbG9yPVswLDAsMF0sdGhpcy5wb2ludHM9W10sdGhpcy5pbmRpY2VzPVtdLHRoaXMuYnVmZmVyPWEuY3JlYXRlQnVmZmVyKCksdGhpcy5pbmRleEJ1ZmZlcj1hLmNyZWF0ZUJ1ZmZlcigpLHRoaXMubW9kZT0xLHRoaXMuYWxwaGE9MSx0aGlzLmRpcnR5PSEwfSxiLldlYkdMR3JhcGhpY3NEYXRhLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMucG9pbnRzPVtdLHRoaXMuaW5kaWNlcz1bXX0sYi5XZWJHTEdyYXBoaWNzRGF0YS5wcm90b3R5cGUudXBsb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nbDt0aGlzLmdsUG9pbnRzPW5ldyBiLkZsb2F0MzJBcnJheSh0aGlzLnBvaW50cyksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMuYnVmZmVyKSxhLmJ1ZmZlckRhdGEoYS5BUlJBWV9CVUZGRVIsdGhpcy5nbFBvaW50cyxhLlNUQVRJQ19EUkFXKSx0aGlzLmdsSW5kaWNpZXM9bmV3IGIuVWludDE2QXJyYXkodGhpcy5pbmRpY2VzKSxhLmJpbmRCdWZmZXIoYS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmluZGV4QnVmZmVyKSxhLmJ1ZmZlckRhdGEoYS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmdsSW5kaWNpZXMsYS5TVEFUSUNfRFJBVyksdGhpcy5kaXJ0eT0hMX0sYi5nbENvbnRleHRzPVtdLGIuaW5zdGFuY2VzPVtdLGIuV2ViR0xSZW5kZXJlcj1mdW5jdGlvbihhLGMsZCl7aWYoZClmb3IodmFyIGUgaW4gYi5kZWZhdWx0UmVuZGVyT3B0aW9ucylcInVuZGVmaW5lZFwiPT10eXBlb2YgZFtlXSYmKGRbZV09Yi5kZWZhdWx0UmVuZGVyT3B0aW9uc1tlXSk7ZWxzZSBkPWIuZGVmYXVsdFJlbmRlck9wdGlvbnM7Yi5kZWZhdWx0UmVuZGVyZXJ8fChiLnNheUhlbGxvKFwid2ViR0xcIiksYi5kZWZhdWx0UmVuZGVyZXI9dGhpcyksdGhpcy50eXBlPWIuV0VCR0xfUkVOREVSRVIsdGhpcy5yZXNvbHV0aW9uPWQucmVzb2x1dGlvbix0aGlzLnRyYW5zcGFyZW50PWQudHJhbnNwYXJlbnQsdGhpcy5hdXRvUmVzaXplPWQuYXV0b1Jlc2l6ZXx8ITEsdGhpcy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI9ZC5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsdGhpcy5jbGVhckJlZm9yZVJlbmRlcj1kLmNsZWFyQmVmb3JlUmVuZGVyLHRoaXMud2lkdGg9YXx8ODAwLHRoaXMuaGVpZ2h0PWN8fDYwMCx0aGlzLnZpZXc9ZC52aWV3fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY29udGV4dExvc3RCb3VuZD10aGlzLmhhbmRsZUNvbnRleHRMb3N0LmJpbmQodGhpcyksdGhpcy5jb250ZXh0UmVzdG9yZWRCb3VuZD10aGlzLmhhbmRsZUNvbnRleHRSZXN0b3JlZC5iaW5kKHRoaXMpLHRoaXMudmlldy5hZGRFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0bG9zdFwiLHRoaXMuY29udGV4dExvc3RCb3VuZCwhMSksdGhpcy52aWV3LmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRyZXN0b3JlZFwiLHRoaXMuY29udGV4dFJlc3RvcmVkQm91bmQsITEpLHRoaXMuX2NvbnRleHRPcHRpb25zPXthbHBoYTp0aGlzLnRyYW5zcGFyZW50LGFudGlhbGlhczpkLmFudGlhbGlhcyxwcmVtdWx0aXBsaWVkQWxwaGE6dGhpcy50cmFuc3BhcmVudCYmXCJub3RNdWx0aXBsaWVkXCIhPT10aGlzLnRyYW5zcGFyZW50LHN0ZW5jaWw6ITAscHJlc2VydmVEcmF3aW5nQnVmZmVyOmQucHJlc2VydmVEcmF3aW5nQnVmZmVyfSx0aGlzLnByb2plY3Rpb249bmV3IGIuUG9pbnQsdGhpcy5vZmZzZXQ9bmV3IGIuUG9pbnQoMCwwKSx0aGlzLnNoYWRlck1hbmFnZXI9bmV3IGIuV2ViR0xTaGFkZXJNYW5hZ2VyLHRoaXMuc3ByaXRlQmF0Y2g9bmV3IGIuV2ViR0xTcHJpdGVCYXRjaCx0aGlzLm1hc2tNYW5hZ2VyPW5ldyBiLldlYkdMTWFza01hbmFnZXIsdGhpcy5maWx0ZXJNYW5hZ2VyPW5ldyBiLldlYkdMRmlsdGVyTWFuYWdlcix0aGlzLnN0ZW5jaWxNYW5hZ2VyPW5ldyBiLldlYkdMU3RlbmNpbE1hbmFnZXIsdGhpcy5ibGVuZE1vZGVNYW5hZ2VyPW5ldyBiLldlYkdMQmxlbmRNb2RlTWFuYWdlcix0aGlzLnJlbmRlclNlc3Npb249e30sdGhpcy5yZW5kZXJTZXNzaW9uLmdsPXRoaXMuZ2wsdGhpcy5yZW5kZXJTZXNzaW9uLmRyYXdDb3VudD0wLHRoaXMucmVuZGVyU2Vzc2lvbi5zaGFkZXJNYW5hZ2VyPXRoaXMuc2hhZGVyTWFuYWdlcix0aGlzLnJlbmRlclNlc3Npb24ubWFza01hbmFnZXI9dGhpcy5tYXNrTWFuYWdlcix0aGlzLnJlbmRlclNlc3Npb24uZmlsdGVyTWFuYWdlcj10aGlzLmZpbHRlck1hbmFnZXIsdGhpcy5yZW5kZXJTZXNzaW9uLmJsZW5kTW9kZU1hbmFnZXI9dGhpcy5ibGVuZE1vZGVNYW5hZ2VyLHRoaXMucmVuZGVyU2Vzc2lvbi5zcHJpdGVCYXRjaD10aGlzLnNwcml0ZUJhdGNoLHRoaXMucmVuZGVyU2Vzc2lvbi5zdGVuY2lsTWFuYWdlcj10aGlzLnN0ZW5jaWxNYW5hZ2VyLHRoaXMucmVuZGVyU2Vzc2lvbi5yZW5kZXJlcj10aGlzLHRoaXMucmVuZGVyU2Vzc2lvbi5yZXNvbHV0aW9uPXRoaXMucmVzb2x1dGlvbix0aGlzLmluaXRDb250ZXh0KCksdGhpcy5tYXBCbGVuZE1vZGVzKCl9LGIuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5XZWJHTFJlbmRlcmVyLGIuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuaW5pdENvbnRleHQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZXcuZ2V0Q29udGV4dChcIndlYmdsXCIsdGhpcy5fY29udGV4dE9wdGlvbnMpfHx0aGlzLnZpZXcuZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLHRoaXMuX2NvbnRleHRPcHRpb25zKTtpZih0aGlzLmdsPWEsIWEpdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgd2ViR0wuIFRyeSB1c2luZyB0aGUgY2FudmFzIHJlbmRlcmVyXCIpO3RoaXMuZ2xDb250ZXh0SWQ9YS5pZD1iLldlYkdMUmVuZGVyZXIuZ2xDb250ZXh0SWQrKyxiLmdsQ29udGV4dHNbdGhpcy5nbENvbnRleHRJZF09YSxiLmluc3RhbmNlc1t0aGlzLmdsQ29udGV4dElkXT10aGlzLGEuZGlzYWJsZShhLkRFUFRIX1RFU1QpLGEuZGlzYWJsZShhLkNVTExfRkFDRSksYS5lbmFibGUoYS5CTEVORCksdGhpcy5zaGFkZXJNYW5hZ2VyLnNldENvbnRleHQoYSksdGhpcy5zcHJpdGVCYXRjaC5zZXRDb250ZXh0KGEpLHRoaXMubWFza01hbmFnZXIuc2V0Q29udGV4dChhKSx0aGlzLmZpbHRlck1hbmFnZXIuc2V0Q29udGV4dChhKSx0aGlzLmJsZW5kTW9kZU1hbmFnZXIuc2V0Q29udGV4dChhKSx0aGlzLnN0ZW5jaWxNYW5hZ2VyLnNldENvbnRleHQoYSksdGhpcy5yZW5kZXJTZXNzaW9uLmdsPXRoaXMuZ2wsdGhpcy5yZXNpemUodGhpcy53aWR0aCx0aGlzLmhlaWdodCl9LGIuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRleHRMb3N0KXt0aGlzLl9fc3RhZ2UhPT1hJiYoYS5pbnRlcmFjdGl2ZSYmYS5pbnRlcmFjdGlvbk1hbmFnZXIucmVtb3ZlRXZlbnRzKCksdGhpcy5fX3N0YWdlPWEpLGEudXBkYXRlVHJhbnNmb3JtKCk7dmFyIGI9dGhpcy5nbDthLl9pbnRlcmFjdGl2ZT9hLl9pbnRlcmFjdGl2ZUV2ZW50c0FkZGVkfHwoYS5faW50ZXJhY3RpdmVFdmVudHNBZGRlZD0hMCxhLmludGVyYWN0aW9uTWFuYWdlci5zZXRUYXJnZXQodGhpcykpOmEuX2ludGVyYWN0aXZlRXZlbnRzQWRkZWQmJihhLl9pbnRlcmFjdGl2ZUV2ZW50c0FkZGVkPSExLGEuaW50ZXJhY3Rpb25NYW5hZ2VyLnNldFRhcmdldCh0aGlzKSksYi52aWV3cG9ydCgwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCksYi5iaW5kRnJhbWVidWZmZXIoYi5GUkFNRUJVRkZFUixudWxsKSx0aGlzLmNsZWFyQmVmb3JlUmVuZGVyJiYodGhpcy50cmFuc3BhcmVudD9iLmNsZWFyQ29sb3IoMCwwLDAsMCk6Yi5jbGVhckNvbG9yKGEuYmFja2dyb3VuZENvbG9yU3BsaXRbMF0sYS5iYWNrZ3JvdW5kQ29sb3JTcGxpdFsxXSxhLmJhY2tncm91bmRDb2xvclNwbGl0WzJdLDEpLGIuY2xlYXIoYi5DT0xPUl9CVUZGRVJfQklUKSksdGhpcy5yZW5kZXJEaXNwbGF5T2JqZWN0KGEsdGhpcy5wcm9qZWN0aW9uKX19LGIuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyRGlzcGxheU9iamVjdD1mdW5jdGlvbihhLGMsZCl7dGhpcy5yZW5kZXJTZXNzaW9uLmJsZW5kTW9kZU1hbmFnZXIuc2V0QmxlbmRNb2RlKGIuYmxlbmRNb2Rlcy5OT1JNQUwpLHRoaXMucmVuZGVyU2Vzc2lvbi5kcmF3Q291bnQ9MCx0aGlzLnJlbmRlclNlc3Npb24uZmxpcFk9ZD8tMToxLHRoaXMucmVuZGVyU2Vzc2lvbi5wcm9qZWN0aW9uPWMsdGhpcy5yZW5kZXJTZXNzaW9uLm9mZnNldD10aGlzLm9mZnNldCx0aGlzLnNwcml0ZUJhdGNoLmJlZ2luKHRoaXMucmVuZGVyU2Vzc2lvbiksdGhpcy5maWx0ZXJNYW5hZ2VyLmJlZ2luKHRoaXMucmVuZGVyU2Vzc2lvbixkKSxhLl9yZW5kZXJXZWJHTCh0aGlzLnJlbmRlclNlc3Npb24pLHRoaXMuc3ByaXRlQmF0Y2guZW5kKCl9LGIuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEsYil7dGhpcy53aWR0aD1hKnRoaXMucmVzb2x1dGlvbix0aGlzLmhlaWdodD1iKnRoaXMucmVzb2x1dGlvbix0aGlzLnZpZXcud2lkdGg9dGhpcy53aWR0aCx0aGlzLnZpZXcuaGVpZ2h0PXRoaXMuaGVpZ2h0LHRoaXMuYXV0b1Jlc2l6ZSYmKHRoaXMudmlldy5zdHlsZS53aWR0aD10aGlzLndpZHRoL3RoaXMucmVzb2x1dGlvbitcInB4XCIsdGhpcy52aWV3LnN0eWxlLmhlaWdodD10aGlzLmhlaWdodC90aGlzLnJlc29sdXRpb24rXCJweFwiKSx0aGlzLmdsLnZpZXdwb3J0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLnByb2plY3Rpb24ueD10aGlzLndpZHRoLzIvdGhpcy5yZXNvbHV0aW9uLHRoaXMucHJvamVjdGlvbi55PS10aGlzLmhlaWdodC8yL3RoaXMucmVzb2x1dGlvbn0sYi5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS51cGRhdGVUZXh0dXJlPWZ1bmN0aW9uKGEpe2lmKGEuaGFzTG9hZGVkKXt2YXIgYz10aGlzLmdsO3JldHVybiBhLl9nbFRleHR1cmVzW2MuaWRdfHwoYS5fZ2xUZXh0dXJlc1tjLmlkXT1jLmNyZWF0ZVRleHR1cmUoKSksYy5iaW5kVGV4dHVyZShjLlRFWFRVUkVfMkQsYS5fZ2xUZXh0dXJlc1tjLmlkXSksYy5waXhlbFN0b3JlaShjLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCxhLnByZW11bHRpcGxpZWRBbHBoYSksYy50ZXhJbWFnZTJEKGMuVEVYVFVSRV8yRCwwLGMuUkdCQSxjLlJHQkEsYy5VTlNJR05FRF9CWVRFLGEuc291cmNlKSxjLnRleFBhcmFtZXRlcmkoYy5URVhUVVJFXzJELGMuVEVYVFVSRV9NQUdfRklMVEVSLGEuc2NhbGVNb2RlPT09Yi5zY2FsZU1vZGVzLkxJTkVBUj9jLkxJTkVBUjpjLk5FQVJFU1QpLGEubWlwbWFwJiZiLmlzUG93ZXJPZlR3byhhLndpZHRoLGEuaGVpZ2h0KT8oYy50ZXhQYXJhbWV0ZXJpKGMuVEVYVFVSRV8yRCxjLlRFWFRVUkVfTUlOX0ZJTFRFUixhLnNjYWxlTW9kZT09PWIuc2NhbGVNb2Rlcy5MSU5FQVI/Yy5MSU5FQVJfTUlQTUFQX0xJTkVBUjpjLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QpLGMuZ2VuZXJhdGVNaXBtYXAoYy5URVhUVVJFXzJEKSk6Yy50ZXhQYXJhbWV0ZXJpKGMuVEVYVFVSRV8yRCxjLlRFWFRVUkVfTUlOX0ZJTFRFUixhLnNjYWxlTW9kZT09PWIuc2NhbGVNb2Rlcy5MSU5FQVI/Yy5MSU5FQVI6Yy5ORUFSRVNUKSxhLl9wb3dlck9mMj8oYy50ZXhQYXJhbWV0ZXJpKGMuVEVYVFVSRV8yRCxjLlRFWFRVUkVfV1JBUF9TLGMuUkVQRUFUKSxjLnRleFBhcmFtZXRlcmkoYy5URVhUVVJFXzJELGMuVEVYVFVSRV9XUkFQX1QsYy5SRVBFQVQpKTooYy50ZXhQYXJhbWV0ZXJpKGMuVEVYVFVSRV8yRCxjLlRFWFRVUkVfV1JBUF9TLGMuQ0xBTVBfVE9fRURHRSksYy50ZXhQYXJhbWV0ZXJpKGMuVEVYVFVSRV8yRCxjLlRFWFRVUkVfV1JBUF9ULGMuQ0xBTVBfVE9fRURHRSkpLGEuX2RpcnR5W2MuaWRdPSExLGEuX2dsVGV4dHVyZXNbYy5pZF19fSxiLldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmhhbmRsZUNvbnRleHRMb3N0PWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKSx0aGlzLmNvbnRleHRMb3N0PSEwfSxiLldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmhhbmRsZUNvbnRleHRSZXN0b3JlZD1mdW5jdGlvbigpe3RoaXMuaW5pdENvbnRleHQoKTtmb3IodmFyIGEgaW4gYi5UZXh0dXJlQ2FjaGUpe3ZhciBjPWIuVGV4dHVyZUNhY2hlW2FdLmJhc2VUZXh0dXJlO2MuX2dsVGV4dHVyZXM9W119dGhpcy5jb250ZXh0TG9zdD0hMX0sYi5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy52aWV3LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsdGhpcy5jb250ZXh0TG9zdEJvdW5kKSx0aGlzLnZpZXcucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsdGhpcy5jb250ZXh0UmVzdG9yZWRCb3VuZCksYi5nbENvbnRleHRzW3RoaXMuZ2xDb250ZXh0SWRdPW51bGwsdGhpcy5wcm9qZWN0aW9uPW51bGwsdGhpcy5vZmZzZXQ9bnVsbCx0aGlzLnNoYWRlck1hbmFnZXIuZGVzdHJveSgpLHRoaXMuc3ByaXRlQmF0Y2guZGVzdHJveSgpLHRoaXMubWFza01hbmFnZXIuZGVzdHJveSgpLHRoaXMuZmlsdGVyTWFuYWdlci5kZXN0cm95KCksdGhpcy5zaGFkZXJNYW5hZ2VyPW51bGwsdGhpcy5zcHJpdGVCYXRjaD1udWxsLHRoaXMubWFza01hbmFnZXI9bnVsbCx0aGlzLmZpbHRlck1hbmFnZXI9bnVsbCx0aGlzLmdsPW51bGwsdGhpcy5yZW5kZXJTZXNzaW9uPW51bGx9LGIuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUubWFwQmxlbmRNb2Rlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2w7Yi5ibGVuZE1vZGVzV2ViR0x8fChiLmJsZW5kTW9kZXNXZWJHTD1bXSxiLmJsZW5kTW9kZXNXZWJHTFtiLmJsZW5kTW9kZXMuTk9STUFMXT1bYS5PTkUsYS5PTkVfTUlOVVNfU1JDX0FMUEhBXSxiLmJsZW5kTW9kZXNXZWJHTFtiLmJsZW5kTW9kZXMuQUREXT1bYS5TUkNfQUxQSEEsYS5EU1RfQUxQSEFdLGIuYmxlbmRNb2Rlc1dlYkdMW2IuYmxlbmRNb2Rlcy5NVUxUSVBMWV09W2EuRFNUX0NPTE9SLGEuT05FX01JTlVTX1NSQ19BTFBIQV0sYi5ibGVuZE1vZGVzV2ViR0xbYi5ibGVuZE1vZGVzLlNDUkVFTl09W2EuU1JDX0FMUEhBLGEuT05FXSxiLmJsZW5kTW9kZXNXZWJHTFtiLmJsZW5kTW9kZXMuT1ZFUkxBWV09W2EuT05FLGEuT05FX01JTlVTX1NSQ19BTFBIQV0sYi5ibGVuZE1vZGVzV2ViR0xbYi5ibGVuZE1vZGVzLkRBUktFTl09W2EuT05FLGEuT05FX01JTlVTX1NSQ19BTFBIQV0sYi5ibGVuZE1vZGVzV2ViR0xbYi5ibGVuZE1vZGVzLkxJR0hURU5dPVthLk9ORSxhLk9ORV9NSU5VU19TUkNfQUxQSEFdLGIuYmxlbmRNb2Rlc1dlYkdMW2IuYmxlbmRNb2Rlcy5DT0xPUl9ET0RHRV09W2EuT05FLGEuT05FX01JTlVTX1NSQ19BTFBIQV0sYi5ibGVuZE1vZGVzV2ViR0xbYi5ibGVuZE1vZGVzLkNPTE9SX0JVUk5dPVthLk9ORSxhLk9ORV9NSU5VU19TUkNfQUxQSEFdLGIuYmxlbmRNb2Rlc1dlYkdMW2IuYmxlbmRNb2Rlcy5IQVJEX0xJR0hUXT1bYS5PTkUsYS5PTkVfTUlOVVNfU1JDX0FMUEhBXSxiLmJsZW5kTW9kZXNXZWJHTFtiLmJsZW5kTW9kZXMuU09GVF9MSUdIVF09W2EuT05FLGEuT05FX01JTlVTX1NSQ19BTFBIQV0sYi5ibGVuZE1vZGVzV2ViR0xbYi5ibGVuZE1vZGVzLkRJRkZFUkVOQ0VdPVthLk9ORSxhLk9ORV9NSU5VU19TUkNfQUxQSEFdLGIuYmxlbmRNb2Rlc1dlYkdMW2IuYmxlbmRNb2Rlcy5FWENMVVNJT05dPVthLk9ORSxhLk9ORV9NSU5VU19TUkNfQUxQSEFdLGIuYmxlbmRNb2Rlc1dlYkdMW2IuYmxlbmRNb2Rlcy5IVUVdPVthLk9ORSxhLk9ORV9NSU5VU19TUkNfQUxQSEFdLGIuYmxlbmRNb2Rlc1dlYkdMW2IuYmxlbmRNb2Rlcy5TQVRVUkFUSU9OXT1bYS5PTkUsYS5PTkVfTUlOVVNfU1JDX0FMUEhBXSxiLmJsZW5kTW9kZXNXZWJHTFtiLmJsZW5kTW9kZXMuQ09MT1JdPVthLk9ORSxhLk9ORV9NSU5VU19TUkNfQUxQSEFdLGIuYmxlbmRNb2Rlc1dlYkdMW2IuYmxlbmRNb2Rlcy5MVU1JTk9TSVRZXT1bYS5PTkUsYS5PTkVfTUlOVVNfU1JDX0FMUEhBXSl9LGIuV2ViR0xSZW5kZXJlci5nbENvbnRleHRJZD0wLGIuV2ViR0xCbGVuZE1vZGVNYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50QmxlbmRNb2RlPTk5OTk5fSxiLldlYkdMQmxlbmRNb2RlTWFuYWdlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5XZWJHTEJsZW5kTW9kZU1hbmFnZXIsYi5XZWJHTEJsZW5kTW9kZU1hbmFnZXIucHJvdG90eXBlLnNldENvbnRleHQ9ZnVuY3Rpb24oYSl7dGhpcy5nbD1hfSxiLldlYkdMQmxlbmRNb2RlTWFuYWdlci5wcm90b3R5cGUuc2V0QmxlbmRNb2RlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuY3VycmVudEJsZW5kTW9kZT09PWEpcmV0dXJuITE7dGhpcy5jdXJyZW50QmxlbmRNb2RlPWE7dmFyIGM9Yi5ibGVuZE1vZGVzV2ViR0xbdGhpcy5jdXJyZW50QmxlbmRNb2RlXTtyZXR1cm4gdGhpcy5nbC5ibGVuZEZ1bmMoY1swXSxjWzFdKSwhMH0sYi5XZWJHTEJsZW5kTW9kZU1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmdsPW51bGx9LGIuV2ViR0xNYXNrTWFuYWdlcj1mdW5jdGlvbigpe30sYi5XZWJHTE1hc2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLldlYkdMTWFza01hbmFnZXIsYi5XZWJHTE1hc2tNYW5hZ2VyLnByb3RvdHlwZS5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe3RoaXMuZ2w9YX0sYi5XZWJHTE1hc2tNYW5hZ2VyLnByb3RvdHlwZS5wdXNoTWFzaz1mdW5jdGlvbihhLGMpe3ZhciBkPWMuZ2w7YS5kaXJ0eSYmYi5XZWJHTEdyYXBoaWNzLnVwZGF0ZUdyYXBoaWNzKGEsZCksYS5fd2ViR0xbZC5pZF0uZGF0YS5sZW5ndGgmJmMuc3RlbmNpbE1hbmFnZXIucHVzaFN0ZW5jaWwoYSxhLl93ZWJHTFtkLmlkXS5kYXRhWzBdLGMpfSxiLldlYkdMTWFza01hbmFnZXIucHJvdG90eXBlLnBvcE1hc2s9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdsO2Iuc3RlbmNpbE1hbmFnZXIucG9wU3RlbmNpbChhLGEuX3dlYkdMW2MuaWRdLmRhdGFbMF0sYil9LGIuV2ViR0xNYXNrTWFuYWdlci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZ2w9bnVsbH0sYi5XZWJHTFN0ZW5jaWxNYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5zdGVuY2lsU3RhY2s9W10sdGhpcy5yZXZlcnNlPSEwLHRoaXMuY291bnQ9MH0sYi5XZWJHTFN0ZW5jaWxNYW5hZ2VyLnByb3RvdHlwZS5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe3RoaXMuZ2w9YX0sYi5XZWJHTFN0ZW5jaWxNYW5hZ2VyLnByb3RvdHlwZS5wdXNoU3RlbmNpbD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5nbDt0aGlzLmJpbmRHcmFwaGljcyhhLGIsYyksMD09PXRoaXMuc3RlbmNpbFN0YWNrLmxlbmd0aCYmKGQuZW5hYmxlKGQuU1RFTkNJTF9URVNUKSxkLmNsZWFyKGQuU1RFTkNJTF9CVUZGRVJfQklUKSx0aGlzLnJldmVyc2U9ITAsdGhpcy5jb3VudD0wKSx0aGlzLnN0ZW5jaWxTdGFjay5wdXNoKGIpO3ZhciBlPXRoaXMuY291bnQ7ZC5jb2xvck1hc2soITEsITEsITEsITEpLGQuc3RlbmNpbEZ1bmMoZC5BTFdBWVMsMCwyNTUpLGQuc3RlbmNpbE9wKGQuS0VFUCxkLktFRVAsZC5JTlZFUlQpLDE9PT1iLm1vZGU/KGQuZHJhd0VsZW1lbnRzKGQuVFJJQU5HTEVfRkFOLGIuaW5kaWNlcy5sZW5ndGgtNCxkLlVOU0lHTkVEX1NIT1JULDApLHRoaXMucmV2ZXJzZT8oZC5zdGVuY2lsRnVuYyhkLkVRVUFMLDI1NS1lLDI1NSksZC5zdGVuY2lsT3AoZC5LRUVQLGQuS0VFUCxkLkRFQ1IpKTooZC5zdGVuY2lsRnVuYyhkLkVRVUFMLGUsMjU1KSxkLnN0ZW5jaWxPcChkLktFRVAsZC5LRUVQLGQuSU5DUikpLGQuZHJhd0VsZW1lbnRzKGQuVFJJQU5HTEVfRkFOLDQsZC5VTlNJR05FRF9TSE9SVCwyKihiLmluZGljZXMubGVuZ3RoLTQpKSx0aGlzLnJldmVyc2U/ZC5zdGVuY2lsRnVuYyhkLkVRVUFMLDI1NS0oZSsxKSwyNTUpOmQuc3RlbmNpbEZ1bmMoZC5FUVVBTCxlKzEsMjU1KSx0aGlzLnJldmVyc2U9IXRoaXMucmV2ZXJzZSk6KHRoaXMucmV2ZXJzZT8oZC5zdGVuY2lsRnVuYyhkLkVRVUFMLGUsMjU1KSxkLnN0ZW5jaWxPcChkLktFRVAsZC5LRUVQLGQuSU5DUikpOihkLnN0ZW5jaWxGdW5jKGQuRVFVQUwsMjU1LWUsMjU1KSxkLnN0ZW5jaWxPcChkLktFRVAsZC5LRUVQLGQuREVDUikpLGQuZHJhd0VsZW1lbnRzKGQuVFJJQU5HTEVfU1RSSVAsYi5pbmRpY2VzLmxlbmd0aCxkLlVOU0lHTkVEX1NIT1JULDApLHRoaXMucmV2ZXJzZT9kLnN0ZW5jaWxGdW5jKGQuRVFVQUwsZSsxLDI1NSk6ZC5zdGVuY2lsRnVuYyhkLkVRVUFMLDI1NS0oZSsxKSwyNTUpKSxkLmNvbG9yTWFzayghMCwhMCwhMCwhMCksZC5zdGVuY2lsT3AoZC5LRUVQLGQuS0VFUCxkLktFRVApLHRoaXMuY291bnQrK30sYi5XZWJHTFN0ZW5jaWxNYW5hZ2VyLnByb3RvdHlwZS5iaW5kR3JhcGhpY3M9ZnVuY3Rpb24oYSxjLGQpe3RoaXMuX2N1cnJlbnRHcmFwaGljcz1hO3ZhciBlLGY9dGhpcy5nbCxnPWQucHJvamVjdGlvbixoPWQub2Zmc2V0OzE9PT1jLm1vZGU/KGU9ZC5zaGFkZXJNYW5hZ2VyLmNvbXBsZXhQcmltaXRpdmVTaGFkZXIsZC5zaGFkZXJNYW5hZ2VyLnNldFNoYWRlcihlKSxmLnVuaWZvcm0xZihlLmZsaXBZLGQuZmxpcFkpLGYudW5pZm9ybU1hdHJpeDNmdihlLnRyYW5zbGF0aW9uTWF0cml4LCExLGEud29ybGRUcmFuc2Zvcm0udG9BcnJheSghMCkpLGYudW5pZm9ybTJmKGUucHJvamVjdGlvblZlY3RvcixnLngsLWcueSksZi51bmlmb3JtMmYoZS5vZmZzZXRWZWN0b3IsLWgueCwtaC55KSxmLnVuaWZvcm0zZnYoZS50aW50Q29sb3IsYi5oZXgycmdiKGEudGludCkpLGYudW5pZm9ybTNmdihlLmNvbG9yLGMuY29sb3IpLGYudW5pZm9ybTFmKGUuYWxwaGEsYS53b3JsZEFscGhhKmMuYWxwaGEpLGYuYmluZEJ1ZmZlcihmLkFSUkFZX0JVRkZFUixjLmJ1ZmZlciksZi52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUuYVZlcnRleFBvc2l0aW9uLDIsZi5GTE9BVCwhMSw4LDApLGYuYmluZEJ1ZmZlcihmLkVMRU1FTlRfQVJSQVlfQlVGRkVSLGMuaW5kZXhCdWZmZXIpKTooZT1kLnNoYWRlck1hbmFnZXIucHJpbWl0aXZlU2hhZGVyLGQuc2hhZGVyTWFuYWdlci5zZXRTaGFkZXIoZSksZi51bmlmb3JtTWF0cml4M2Z2KGUudHJhbnNsYXRpb25NYXRyaXgsITEsYS53b3JsZFRyYW5zZm9ybS50b0FycmF5KCEwKSksZi51bmlmb3JtMWYoZS5mbGlwWSxkLmZsaXBZKSxmLnVuaWZvcm0yZihlLnByb2plY3Rpb25WZWN0b3IsZy54LC1nLnkpLGYudW5pZm9ybTJmKGUub2Zmc2V0VmVjdG9yLC1oLngsLWgueSksZi51bmlmb3JtM2Z2KGUudGludENvbG9yLGIuaGV4MnJnYihhLnRpbnQpKSxmLnVuaWZvcm0xZihlLmFscGhhLGEud29ybGRBbHBoYSksZi5iaW5kQnVmZmVyKGYuQVJSQVlfQlVGRkVSLGMuYnVmZmVyKSxmLnZlcnRleEF0dHJpYlBvaW50ZXIoZS5hVmVydGV4UG9zaXRpb24sMixmLkZMT0FULCExLDI0LDApLGYudmVydGV4QXR0cmliUG9pbnRlcihlLmNvbG9yQXR0cmlidXRlLDQsZi5GTE9BVCwhMSwyNCw4KSxmLmJpbmRCdWZmZXIoZi5FTEVNRU5UX0FSUkFZX0JVRkZFUixjLmluZGV4QnVmZmVyKSl9LGIuV2ViR0xTdGVuY2lsTWFuYWdlci5wcm90b3R5cGUucG9wU3RlbmNpbD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5nbDtpZih0aGlzLnN0ZW5jaWxTdGFjay5wb3AoKSx0aGlzLmNvdW50LS0sMD09PXRoaXMuc3RlbmNpbFN0YWNrLmxlbmd0aClkLmRpc2FibGUoZC5TVEVOQ0lMX1RFU1QpO2Vsc2V7dmFyIGU9dGhpcy5jb3VudDt0aGlzLmJpbmRHcmFwaGljcyhhLGIsYyksZC5jb2xvck1hc2soITEsITEsITEsITEpLDE9PT1iLm1vZGU/KHRoaXMucmV2ZXJzZT0hdGhpcy5yZXZlcnNlLHRoaXMucmV2ZXJzZT8oZC5zdGVuY2lsRnVuYyhkLkVRVUFMLDI1NS0oZSsxKSwyNTUpLGQuc3RlbmNpbE9wKGQuS0VFUCxkLktFRVAsZC5JTkNSKSk6KGQuc3RlbmNpbEZ1bmMoZC5FUVVBTCxlKzEsMjU1KSxkLnN0ZW5jaWxPcChkLktFRVAsZC5LRUVQLGQuREVDUikpLGQuZHJhd0VsZW1lbnRzKGQuVFJJQU5HTEVfRkFOLDQsZC5VTlNJR05FRF9TSE9SVCwyKihiLmluZGljZXMubGVuZ3RoLTQpKSxkLnN0ZW5jaWxGdW5jKGQuQUxXQVlTLDAsMjU1KSxkLnN0ZW5jaWxPcChkLktFRVAsZC5LRUVQLGQuSU5WRVJUKSxkLmRyYXdFbGVtZW50cyhkLlRSSUFOR0xFX0ZBTixiLmluZGljZXMubGVuZ3RoLTQsZC5VTlNJR05FRF9TSE9SVCwwKSx0aGlzLnJldmVyc2U/ZC5zdGVuY2lsRnVuYyhkLkVRVUFMLGUsMjU1KTpkLnN0ZW5jaWxGdW5jKGQuRVFVQUwsMjU1LWUsMjU1KSk6KHRoaXMucmV2ZXJzZT8oZC5zdGVuY2lsRnVuYyhkLkVRVUFMLGUrMSwyNTUpLGQuc3RlbmNpbE9wKGQuS0VFUCxkLktFRVAsZC5ERUNSKSk6KGQuc3RlbmNpbEZ1bmMoZC5FUVVBTCwyNTUtKGUrMSksMjU1KSxkLnN0ZW5jaWxPcChkLktFRVAsZC5LRUVQLGQuSU5DUikpLGQuZHJhd0VsZW1lbnRzKGQuVFJJQU5HTEVfU1RSSVAsYi5pbmRpY2VzLmxlbmd0aCxkLlVOU0lHTkVEX1NIT1JULDApLHRoaXMucmV2ZXJzZT9kLnN0ZW5jaWxGdW5jKGQuRVFVQUwsZSwyNTUpOmQuc3RlbmNpbEZ1bmMoZC5FUVVBTCwyNTUtZSwyNTUpKSxkLmNvbG9yTWFzayghMCwhMCwhMCwhMCksZC5zdGVuY2lsT3AoZC5LRUVQLGQuS0VFUCxkLktFRVApfX0sYi5XZWJHTFN0ZW5jaWxNYW5hZ2VyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5zdGVuY2lsU3RhY2s9bnVsbCx0aGlzLmdsPW51bGx9LGIuV2ViR0xTaGFkZXJNYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5tYXhBdHRpYnM9MTAsdGhpcy5hdHRyaWJTdGF0ZT1bXSx0aGlzLnRlbXBBdHRyaWJTdGF0ZT1bXTtmb3IodmFyIGE9MDthPHRoaXMubWF4QXR0aWJzO2ErKyl0aGlzLmF0dHJpYlN0YXRlW2FdPSExO3RoaXMuc3RhY2s9W119LGIuV2ViR0xTaGFkZXJNYW5hZ2VyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLldlYkdMU2hhZGVyTWFuYWdlcixiLldlYkdMU2hhZGVyTWFuYWdlci5wcm90b3R5cGUuc2V0Q29udGV4dD1mdW5jdGlvbihhKXt0aGlzLmdsPWEsdGhpcy5wcmltaXRpdmVTaGFkZXI9bmV3IGIuUHJpbWl0aXZlU2hhZGVyKGEpLHRoaXMuY29tcGxleFByaW1pdGl2ZVNoYWRlcj1uZXcgYi5Db21wbGV4UHJpbWl0aXZlU2hhZGVyKGEpLHRoaXMuZGVmYXVsdFNoYWRlcj1uZXcgYi5QaXhpU2hhZGVyKGEpLHRoaXMuZmFzdFNoYWRlcj1uZXcgYi5QaXhpRmFzdFNoYWRlcihhKSx0aGlzLnN0cmlwU2hhZGVyPW5ldyBiLlN0cmlwU2hhZGVyKGEpLHRoaXMuc2V0U2hhZGVyKHRoaXMuZGVmYXVsdFNoYWRlcil9LGIuV2ViR0xTaGFkZXJNYW5hZ2VyLnByb3RvdHlwZS5zZXRBdHRyaWJzPWZ1bmN0aW9uKGEpe3ZhciBiO2ZvcihiPTA7Yjx0aGlzLnRlbXBBdHRyaWJTdGF0ZS5sZW5ndGg7YisrKXRoaXMudGVtcEF0dHJpYlN0YXRlW2JdPSExO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl07dGhpcy50ZW1wQXR0cmliU3RhdGVbY109ITB9dmFyIGQ9dGhpcy5nbDtmb3IoYj0wO2I8dGhpcy5hdHRyaWJTdGF0ZS5sZW5ndGg7YisrKXRoaXMuYXR0cmliU3RhdGVbYl0hPT10aGlzLnRlbXBBdHRyaWJTdGF0ZVtiXSYmKHRoaXMuYXR0cmliU3RhdGVbYl09dGhpcy50ZW1wQXR0cmliU3RhdGVbYl0sdGhpcy50ZW1wQXR0cmliU3RhdGVbYl0/ZC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShiKTpkLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShiKSl9LGIuV2ViR0xTaGFkZXJNYW5hZ2VyLnByb3RvdHlwZS5zZXRTaGFkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2N1cnJlbnRJZD09PWEuX1VJRD8hMToodGhpcy5fY3VycmVudElkPWEuX1VJRCx0aGlzLmN1cnJlbnRTaGFkZXI9YSx0aGlzLmdsLnVzZVByb2dyYW0oYS5wcm9ncmFtKSx0aGlzLnNldEF0dHJpYnMoYS5hdHRyaWJ1dGVzKSwhMCl9LGIuV2ViR0xTaGFkZXJNYW5hZ2VyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hdHRyaWJTdGF0ZT1udWxsLHRoaXMudGVtcEF0dHJpYlN0YXRlPW51bGwsdGhpcy5wcmltaXRpdmVTaGFkZXIuZGVzdHJveSgpLHRoaXMuY29tcGxleFByaW1pdGl2ZVNoYWRlci5kZXN0cm95KCksdGhpcy5kZWZhdWx0U2hhZGVyLmRlc3Ryb3koKSx0aGlzLmZhc3RTaGFkZXIuZGVzdHJveSgpLHRoaXMuc3RyaXBTaGFkZXIuZGVzdHJveSgpLHRoaXMuZ2w9bnVsbH0sYi5XZWJHTFNwcml0ZUJhdGNoPWZ1bmN0aW9uKCl7dGhpcy52ZXJ0U2l6ZT01LHRoaXMuc2l6ZT0yZTM7dmFyIGE9NCp0aGlzLnNpemUqNCp0aGlzLnZlcnRTaXplLGM9Nip0aGlzLnNpemU7dGhpcy52ZXJ0aWNlcz1uZXcgYi5BcnJheUJ1ZmZlcihhKSx0aGlzLnBvc2l0aW9ucz1uZXcgYi5GbG9hdDMyQXJyYXkodGhpcy52ZXJ0aWNlcyksdGhpcy5jb2xvcnM9bmV3IGIuVWludDMyQXJyYXkodGhpcy52ZXJ0aWNlcyksdGhpcy5pbmRpY2VzPW5ldyBiLlVpbnQxNkFycmF5KGMpLHRoaXMubGFzdEluZGV4Q291bnQ9MDtmb3IodmFyIGQ9MCxlPTA7Yz5kO2QrPTYsZSs9NCl0aGlzLmluZGljZXNbZCswXT1lKzAsdGhpcy5pbmRpY2VzW2QrMV09ZSsxLHRoaXMuaW5kaWNlc1tkKzJdPWUrMix0aGlzLmluZGljZXNbZCszXT1lKzAsdGhpcy5pbmRpY2VzW2QrNF09ZSsyLHRoaXMuaW5kaWNlc1tkKzVdPWUrMzt0aGlzLmRyYXdpbmc9ITEsdGhpcy5jdXJyZW50QmF0Y2hTaXplPTAsdGhpcy5jdXJyZW50QmFzZVRleHR1cmU9bnVsbCx0aGlzLmRpcnR5PSEwLHRoaXMudGV4dHVyZXM9W10sdGhpcy5ibGVuZE1vZGVzPVtdLHRoaXMuc2hhZGVycz1bXSx0aGlzLnNwcml0ZXM9W10sdGhpcy5kZWZhdWx0U2hhZGVyPW5ldyBiLkFic3RyYWN0RmlsdGVyKFtcInByZWNpc2lvbiBsb3dwIGZsb2F0O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIHZlYzQgdkNvbG9yO1wiLFwidW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XCIsXCJ2b2lkIG1haW4odm9pZCkge1wiLFwiICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKSAqIHZDb2xvciA7XCIsXCJ9XCJdKX0sYi5XZWJHTFNwcml0ZUJhdGNoLnByb3RvdHlwZS5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe3RoaXMuZ2w9YSx0aGlzLnZlcnRleEJ1ZmZlcj1hLmNyZWF0ZUJ1ZmZlcigpLHRoaXMuaW5kZXhCdWZmZXI9YS5jcmVhdGVCdWZmZXIoKSxhLmJpbmRCdWZmZXIoYS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmluZGV4QnVmZmVyKSxhLmJ1ZmZlckRhdGEoYS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmluZGljZXMsYS5TVEFUSUNfRFJBVyksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMudmVydGV4QnVmZmVyKSxhLmJ1ZmZlckRhdGEoYS5BUlJBWV9CVUZGRVIsdGhpcy52ZXJ0aWNlcyxhLkRZTkFNSUNfRFJBVyksdGhpcy5jdXJyZW50QmxlbmRNb2RlPTk5OTk5O3ZhciBjPW5ldyBiLlBpeGlTaGFkZXIoYSk7Yy5mcmFnbWVudFNyYz10aGlzLmRlZmF1bHRTaGFkZXIuZnJhZ21lbnRTcmMsYy51bmlmb3Jtcz17fSxjLmluaXQoKSx0aGlzLmRlZmF1bHRTaGFkZXIuc2hhZGVyc1thLmlkXT1jfSxiLldlYkdMU3ByaXRlQmF0Y2gucHJvdG90eXBlLmJlZ2luPWZ1bmN0aW9uKGEpe3RoaXMucmVuZGVyU2Vzc2lvbj1hLHRoaXMuc2hhZGVyPXRoaXMucmVuZGVyU2Vzc2lvbi5zaGFkZXJNYW5hZ2VyLmRlZmF1bHRTaGFkZXIsdGhpcy5zdGFydCgpfSxiLldlYkdMU3ByaXRlQmF0Y2gucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe3RoaXMuZmx1c2goKX0sYi5XZWJHTFNwcml0ZUJhdGNoLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7dmFyIGI9YS50ZXh0dXJlO3RoaXMuY3VycmVudEJhdGNoU2l6ZT49dGhpcy5zaXplJiYodGhpcy5mbHVzaCgpLHRoaXMuY3VycmVudEJhc2VUZXh0dXJlPWIuYmFzZVRleHR1cmUpO3ZhciBjPWIuX3V2cztpZihjKXt2YXIgZCxlLGYsZyxoPWEuYW5jaG9yLngsaT1hLmFuY2hvci55O2lmKGIudHJpbSl7dmFyIGo9Yi50cmltO2U9ai54LWgqai53aWR0aCxkPWUrYi5jcm9wLndpZHRoLGc9ai55LWkqai5oZWlnaHQsZj1nK2IuY3JvcC5oZWlnaHR9ZWxzZSBkPWIuZnJhbWUud2lkdGgqKDEtaCksZT1iLmZyYW1lLndpZHRoKi1oLGY9Yi5mcmFtZS5oZWlnaHQqKDEtaSksZz1iLmZyYW1lLmhlaWdodCotaTt2YXIgaz00KnRoaXMuY3VycmVudEJhdGNoU2l6ZSp0aGlzLnZlcnRTaXplLGw9Yi5iYXNlVGV4dHVyZS5yZXNvbHV0aW9uLG09YS53b3JsZFRyYW5zZm9ybSxuPW0uYS9sLG89bS5iL2wscD1tLmMvbCxxPW0uZC9sLHI9bS50eCxzPW0udHksdD10aGlzLmNvbG9ycyx1PXRoaXMucG9zaXRpb25zO3RoaXMucmVuZGVyU2Vzc2lvbi5yb3VuZFBpeGVscz8odVtrXT1uKmUrcCpnK3J8MCx1W2srMV09cSpnK28qZStzfDAsdVtrKzVdPW4qZCtwKmcrcnwwLHVbays2XT1xKmcrbypkK3N8MCx1W2srMTBdPW4qZCtwKmYrcnwwLHVbaysxMV09cSpmK28qZCtzfDAsdVtrKzE1XT1uKmUrcCpmK3J8MCx1W2srMTZdPXEqZitvKmUrc3wwKToodVtrXT1uKmUrcCpnK3IsdVtrKzFdPXEqZytvKmUrcyx1W2srNV09bipkK3AqZytyLHVbays2XT1xKmcrbypkK3MsdVtrKzEwXT1uKmQrcCpmK3IsdVtrKzExXT1xKmYrbypkK3MsdVtrKzE1XT1uKmUrcCpmK3IsdVtrKzE2XT1xKmYrbyplK3MpLHVbaysyXT1jLngwLHVbayszXT1jLnkwLHVbays3XT1jLngxLHVbays4XT1jLnkxLHVbaysxMl09Yy54Mix1W2srMTNdPWMueTIsdVtrKzE3XT1jLngzLHVbaysxOF09Yy55Mzt2YXIgdj1hLnRpbnQ7dFtrKzRdPXRbays5XT10W2srMTRdPXRbaysxOV09KHY+PjE2KSsoNjUyODAmdikrKCgyNTUmdik8PDE2KSsoMjU1KmEud29ybGRBbHBoYTw8MjQpLHRoaXMuc3ByaXRlc1t0aGlzLmN1cnJlbnRCYXRjaFNpemUrK109YX19LGIuV2ViR0xTcHJpdGVCYXRjaC5wcm90b3R5cGUucmVuZGVyVGlsaW5nU3ByaXRlPWZ1bmN0aW9uKGEpe3ZhciBjPWEudGlsaW5nVGV4dHVyZTt0aGlzLmN1cnJlbnRCYXRjaFNpemU+PXRoaXMuc2l6ZSYmKHRoaXMuZmx1c2goKSx0aGlzLmN1cnJlbnRCYXNlVGV4dHVyZT1jLmJhc2VUZXh0dXJlKSxhLl91dnN8fChhLl91dnM9bmV3IGIuVGV4dHVyZVV2cyk7dmFyIGQ9YS5fdXZzO2EudGlsZVBvc2l0aW9uLnglPWMuYmFzZVRleHR1cmUud2lkdGgqYS50aWxlU2NhbGVPZmZzZXQueCxhLnRpbGVQb3NpdGlvbi55JT1jLmJhc2VUZXh0dXJlLmhlaWdodCphLnRpbGVTY2FsZU9mZnNldC55O3ZhciBlPWEudGlsZVBvc2l0aW9uLngvKGMuYmFzZVRleHR1cmUud2lkdGgqYS50aWxlU2NhbGVPZmZzZXQueCksZj1hLnRpbGVQb3NpdGlvbi55LyhjLmJhc2VUZXh0dXJlLmhlaWdodCphLnRpbGVTY2FsZU9mZnNldC55KSxnPWEud2lkdGgvYy5iYXNlVGV4dHVyZS53aWR0aC8oYS50aWxlU2NhbGUueCphLnRpbGVTY2FsZU9mZnNldC54KSxoPWEuaGVpZ2h0L2MuYmFzZVRleHR1cmUuaGVpZ2h0LyhhLnRpbGVTY2FsZS55KmEudGlsZVNjYWxlT2Zmc2V0LnkpO2QueDA9MC1lLGQueTA9MC1mLGQueDE9MSpnLWUsZC55MT0wLWYsZC54Mj0xKmctZSxkLnkyPTEqaC1mLGQueDM9MC1lLGQueTM9MSpoLWY7dmFyIGk9YS50aW50LGo9KGk+PjE2KSsoNjUyODAmaSkrKCgyNTUmaSk8PDE2KSsoMjU1KmEuYWxwaGE8PDI0KSxrPXRoaXMucG9zaXRpb25zLGw9dGhpcy5jb2xvcnMsbT1hLndpZHRoLG49YS5oZWlnaHQsbz1hLmFuY2hvci54LHA9YS5hbmNob3IueSxxPW0qKDEtbykscj1tKi1vLHM9biooMS1wKSx0PW4qLXAsdT00KnRoaXMuY3VycmVudEJhdGNoU2l6ZSp0aGlzLnZlcnRTaXplLHY9Yy5iYXNlVGV4dHVyZS5yZXNvbHV0aW9uLHc9YS53b3JsZFRyYW5zZm9ybSx4PXcuYS92LHk9dy5iL3Ysej13LmMvdixBPXcuZC92LEI9dy50eCxDPXcudHk7a1t1KytdPXgqcit6KnQrQixrW3UrK109QSp0K3kqcitDLGtbdSsrXT1kLngwLGtbdSsrXT1kLnkwLGxbdSsrXT1qLGtbdSsrXT14KnEreip0K0Isa1t1KytdPUEqdCt5KnErQyxrW3UrK109ZC54MSxrW3UrK109ZC55MSxsW3UrK109aixrW3UrK109eCpxK3oqcytCLGtbdSsrXT1BKnMreSpxK0Msa1t1KytdPWQueDIsa1t1KytdPWQueTIsbFt1KytdPWosa1t1KytdPXgqcit6KnMrQixrW3UrK109QSpzK3kqcitDLGtbdSsrXT1kLngzLGtbdSsrXT1kLnkzLGxbdSsrXT1qLHRoaXMuc3ByaXRlc1t0aGlzLmN1cnJlbnRCYXRjaFNpemUrK109YX0sYi5XZWJHTFNwcml0ZUJhdGNoLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmN1cnJlbnRCYXRjaFNpemUpe3ZhciBhLGM9dGhpcy5nbDtpZih0aGlzLmRpcnR5KXt0aGlzLmRpcnR5PSExLGMuYWN0aXZlVGV4dHVyZShjLlRFWFRVUkUwKSxjLmJpbmRCdWZmZXIoYy5BUlJBWV9CVUZGRVIsdGhpcy52ZXJ0ZXhCdWZmZXIpLGMuYmluZEJ1ZmZlcihjLkVMRU1FTlRfQVJSQVlfQlVGRkVSLHRoaXMuaW5kZXhCdWZmZXIpLGE9dGhpcy5kZWZhdWx0U2hhZGVyLnNoYWRlcnNbYy5pZF07dmFyIGQ9NCp0aGlzLnZlcnRTaXplO2MudmVydGV4QXR0cmliUG9pbnRlcihhLmFWZXJ0ZXhQb3NpdGlvbiwyLGMuRkxPQVQsITEsZCwwKSxjLnZlcnRleEF0dHJpYlBvaW50ZXIoYS5hVGV4dHVyZUNvb3JkLDIsYy5GTE9BVCwhMSxkLDgpLGMudmVydGV4QXR0cmliUG9pbnRlcihhLmNvbG9yQXR0cmlidXRlLDQsYy5VTlNJR05FRF9CWVRFLCEwLGQsMTYpfWlmKHRoaXMuY3VycmVudEJhdGNoU2l6ZT4uNSp0aGlzLnNpemUpYy5idWZmZXJTdWJEYXRhKGMuQVJSQVlfQlVGRkVSLDAsdGhpcy52ZXJ0aWNlcyk7ZWxzZXt2YXIgZT10aGlzLnBvc2l0aW9ucy5zdWJhcnJheSgwLDQqdGhpcy5jdXJyZW50QmF0Y2hTaXplKnRoaXMudmVydFNpemUpO2MuYnVmZmVyU3ViRGF0YShjLkFSUkFZX0JVRkZFUiwwLGUpfWZvcih2YXIgZixnLGgsaSxqPTAsaz0wLGw9bnVsbCxtPXRoaXMucmVuZGVyU2Vzc2lvbi5ibGVuZE1vZGVNYW5hZ2VyLmN1cnJlbnRCbGVuZE1vZGUsbj1udWxsLG89ITEscD0hMSxxPTAscj10aGlzLmN1cnJlbnRCYXRjaFNpemU7cj5xO3ErKyl7aWYoaT10aGlzLnNwcml0ZXNbcV0sZj1pLnRleHR1cmUuYmFzZVRleHR1cmUsZz1pLmJsZW5kTW9kZSxoPWkuc2hhZGVyfHx0aGlzLmRlZmF1bHRTaGFkZXIsbz1tIT09ZyxwPW4hPT1oLChsIT09Znx8b3x8cCkmJih0aGlzLnJlbmRlckJhdGNoKGwsaixrKSxrPXEsaj0wLGw9ZixvJiYobT1nLHRoaXMucmVuZGVyU2Vzc2lvbi5ibGVuZE1vZGVNYW5hZ2VyLnNldEJsZW5kTW9kZShtKSkscCkpe249aCxhPW4uc2hhZGVyc1tjLmlkXSxhfHwoYT1uZXcgYi5QaXhpU2hhZGVyKGMpLGEuZnJhZ21lbnRTcmM9bi5mcmFnbWVudFNyYyxhLnVuaWZvcm1zPW4udW5pZm9ybXMsYS5pbml0KCksbi5zaGFkZXJzW2MuaWRdPWEpLHRoaXMucmVuZGVyU2Vzc2lvbi5zaGFkZXJNYW5hZ2VyLnNldFNoYWRlcihhKSxhLmRpcnR5JiZhLnN5bmNVbmlmb3JtcygpO3ZhciBzPXRoaXMucmVuZGVyU2Vzc2lvbi5wcm9qZWN0aW9uO2MudW5pZm9ybTJmKGEucHJvamVjdGlvblZlY3RvcixzLngscy55KTt2YXIgdD10aGlzLnJlbmRlclNlc3Npb24ub2Zmc2V0O2MudW5pZm9ybTJmKGEub2Zmc2V0VmVjdG9yLHQueCx0LnkpfWorK310aGlzLnJlbmRlckJhdGNoKGwsaixrKSx0aGlzLmN1cnJlbnRCYXRjaFNpemU9MH19LGIuV2ViR0xTcHJpdGVCYXRjaC5wcm90b3R5cGUucmVuZGVyQmF0Y2g9ZnVuY3Rpb24oYSxiLGMpe2lmKDAhPT1iKXt2YXIgZD10aGlzLmdsO2EuX2RpcnR5W2QuaWRdP3RoaXMucmVuZGVyU2Vzc2lvbi5yZW5kZXJlci51cGRhdGVUZXh0dXJlKGEpOmQuYmluZFRleHR1cmUoZC5URVhUVVJFXzJELGEuX2dsVGV4dHVyZXNbZC5pZF0pLGQuZHJhd0VsZW1lbnRzKGQuVFJJQU5HTEVTLDYqYixkLlVOU0lHTkVEX1NIT1JULDYqYyoyKSx0aGlzLnJlbmRlclNlc3Npb24uZHJhd0NvdW50Kyt9fSxiLldlYkdMU3ByaXRlQmF0Y2gucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLmZsdXNoKCksdGhpcy5kaXJ0eT0hMH0sYi5XZWJHTFNwcml0ZUJhdGNoLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3RoaXMuZGlydHk9ITB9LGIuV2ViR0xTcHJpdGVCYXRjaC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMudmVydGljZXM9bnVsbCx0aGlzLmluZGljZXM9bnVsbCx0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRleEJ1ZmZlciksdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5pbmRleEJ1ZmZlciksdGhpcy5jdXJyZW50QmFzZVRleHR1cmU9bnVsbCx0aGlzLmdsPW51bGx9LGIuV2ViR0xGYXN0U3ByaXRlQmF0Y2g9ZnVuY3Rpb24oYSl7dGhpcy52ZXJ0U2l6ZT0xMCx0aGlzLm1heFNpemU9NmUzLHRoaXMuc2l6ZT10aGlzLm1heFNpemU7dmFyIGM9NCp0aGlzLnNpemUqdGhpcy52ZXJ0U2l6ZSxkPTYqdGhpcy5tYXhTaXplO3RoaXMudmVydGljZXM9bmV3IGIuRmxvYXQzMkFycmF5KGMpLHRoaXMuaW5kaWNlcz1uZXcgYi5VaW50MTZBcnJheShkKSx0aGlzLnZlcnRleEJ1ZmZlcj1udWxsLHRoaXMuaW5kZXhCdWZmZXI9bnVsbCx0aGlzLmxhc3RJbmRleENvdW50PTA7Zm9yKHZhciBlPTAsZj0wO2Q+ZTtlKz02LGYrPTQpdGhpcy5pbmRpY2VzW2UrMF09ZiswLHRoaXMuaW5kaWNlc1tlKzFdPWYrMSx0aGlzLmluZGljZXNbZSsyXT1mKzIsdGhpcy5pbmRpY2VzW2UrM109ZiswLHRoaXMuaW5kaWNlc1tlKzRdPWYrMix0aGlzLmluZGljZXNbZSs1XT1mKzM7dGhpcy5kcmF3aW5nPSExLHRoaXMuY3VycmVudEJhdGNoU2l6ZT0wLHRoaXMuY3VycmVudEJhc2VUZXh0dXJlPW51bGwsdGhpcy5jdXJyZW50QmxlbmRNb2RlPTAsdGhpcy5yZW5kZXJTZXNzaW9uPW51bGwsdGhpcy5zaGFkZXI9bnVsbCx0aGlzLm1hdHJpeD1udWxsLHRoaXMuc2V0Q29udGV4dChhKX0sYi5XZWJHTEZhc3RTcHJpdGVCYXRjaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5XZWJHTEZhc3RTcHJpdGVCYXRjaCxiLldlYkdMRmFzdFNwcml0ZUJhdGNoLnByb3RvdHlwZS5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe3RoaXMuZ2w9YSx0aGlzLnZlcnRleEJ1ZmZlcj1hLmNyZWF0ZUJ1ZmZlcigpLHRoaXMuaW5kZXhCdWZmZXI9YS5jcmVhdGVCdWZmZXIoKSxhLmJpbmRCdWZmZXIoYS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmluZGV4QnVmZmVyKSxhLmJ1ZmZlckRhdGEoYS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmluZGljZXMsYS5TVEFUSUNfRFJBVyksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMudmVydGV4QnVmZmVyKSxhLmJ1ZmZlckRhdGEoYS5BUlJBWV9CVUZGRVIsdGhpcy52ZXJ0aWNlcyxhLkRZTkFNSUNfRFJBVyl9LGIuV2ViR0xGYXN0U3ByaXRlQmF0Y2gucHJvdG90eXBlLmJlZ2luPWZ1bmN0aW9uKGEsYil7dGhpcy5yZW5kZXJTZXNzaW9uPWIsdGhpcy5zaGFkZXI9dGhpcy5yZW5kZXJTZXNzaW9uLnNoYWRlck1hbmFnZXIuZmFzdFNoYWRlcix0aGlzLm1hdHJpeD1hLndvcmxkVHJhbnNmb3JtLnRvQXJyYXkoITApLHRoaXMuc3RhcnQoKX0sYi5XZWJHTEZhc3RTcHJpdGVCYXRjaC5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKCl7dGhpcy5mbHVzaCgpfSxiLldlYkdMRmFzdFNwcml0ZUJhdGNoLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7dmFyIGI9YS5jaGlsZHJlbixjPWJbMF07aWYoYy50ZXh0dXJlLl91dnMpe3RoaXMuY3VycmVudEJhc2VUZXh0dXJlPWMudGV4dHVyZS5iYXNlVGV4dHVyZSxjLmJsZW5kTW9kZSE9PXRoaXMucmVuZGVyU2Vzc2lvbi5ibGVuZE1vZGVNYW5hZ2VyLmN1cnJlbnRCbGVuZE1vZGUmJih0aGlzLmZsdXNoKCksdGhpcy5yZW5kZXJTZXNzaW9uLmJsZW5kTW9kZU1hbmFnZXIuc2V0QmxlbmRNb2RlKGMuYmxlbmRNb2RlKSk7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKXRoaXMucmVuZGVyU3ByaXRlKGJbZF0pO3RoaXMuZmx1c2goKX19LGIuV2ViR0xGYXN0U3ByaXRlQmF0Y2gucHJvdG90eXBlLnJlbmRlclNwcml0ZT1mdW5jdGlvbihhKXtpZihhLnZpc2libGUmJihhLnRleHR1cmUuYmFzZVRleHR1cmU9PT10aGlzLmN1cnJlbnRCYXNlVGV4dHVyZXx8KHRoaXMuZmx1c2goKSx0aGlzLmN1cnJlbnRCYXNlVGV4dHVyZT1hLnRleHR1cmUuYmFzZVRleHR1cmUsYS50ZXh0dXJlLl91dnMpKSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqPXRoaXMudmVydGljZXM7aWYoYj1hLnRleHR1cmUuX3V2cyxjPWEudGV4dHVyZS5mcmFtZS53aWR0aCxkPWEudGV4dHVyZS5mcmFtZS5oZWlnaHQsYS50ZXh0dXJlLnRyaW0pe3ZhciBrPWEudGV4dHVyZS50cmltO2Y9ay54LWEuYW5jaG9yLngqay53aWR0aCxlPWYrYS50ZXh0dXJlLmNyb3Aud2lkdGgsaD1rLnktYS5hbmNob3IueSprLmhlaWdodCxnPWgrYS50ZXh0dXJlLmNyb3AuaGVpZ2h0fWVsc2UgZT1hLnRleHR1cmUuZnJhbWUud2lkdGgqKDEtYS5hbmNob3IueCksZj1hLnRleHR1cmUuZnJhbWUud2lkdGgqLWEuYW5jaG9yLngsZz1hLnRleHR1cmUuZnJhbWUuaGVpZ2h0KigxLWEuYW5jaG9yLnkpLGg9YS50ZXh0dXJlLmZyYW1lLmhlaWdodCotYS5hbmNob3IueTtpPTQqdGhpcy5jdXJyZW50QmF0Y2hTaXplKnRoaXMudmVydFNpemUsaltpKytdPWYsaltpKytdPWgsaltpKytdPWEucG9zaXRpb24ueCxqW2krK109YS5wb3NpdGlvbi55LGpbaSsrXT1hLnNjYWxlLngsaltpKytdPWEuc2NhbGUueSxqW2krK109YS5yb3RhdGlvbixqW2krK109Yi54MCxqW2krK109Yi55MSxqW2krK109YS5hbHBoYSxqW2krK109ZSxqW2krK109aCxqW2krK109YS5wb3NpdGlvbi54LGpbaSsrXT1hLnBvc2l0aW9uLnksaltpKytdPWEuc2NhbGUueCxqW2krK109YS5zY2FsZS55LGpbaSsrXT1hLnJvdGF0aW9uLGpbaSsrXT1iLngxLGpbaSsrXT1iLnkxLGpbaSsrXT1hLmFscGhhLGpbaSsrXT1lLGpbaSsrXT1nLGpbaSsrXT1hLnBvc2l0aW9uLngsaltpKytdPWEucG9zaXRpb24ueSxqW2krK109YS5zY2FsZS54LGpbaSsrXT1hLnNjYWxlLnksaltpKytdPWEucm90YXRpb24saltpKytdPWIueDIsaltpKytdPWIueTIsaltpKytdPWEuYWxwaGEsaltpKytdPWYsaltpKytdPWcsaltpKytdPWEucG9zaXRpb24ueCxqW2krK109YS5wb3NpdGlvbi55LGpbaSsrXT1hLnNjYWxlLngsaltpKytdPWEuc2NhbGUueSxqW2krK109YS5yb3RhdGlvbixqW2krK109Yi54MyxqW2krK109Yi55MyxqW2krK109YS5hbHBoYSx0aGlzLmN1cnJlbnRCYXRjaFNpemUrKyx0aGlzLmN1cnJlbnRCYXRjaFNpemU+PXRoaXMuc2l6ZSYmdGhpcy5mbHVzaCgpfX0sYi5XZWJHTEZhc3RTcHJpdGVCYXRjaC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5jdXJyZW50QmF0Y2hTaXplKXt2YXIgYT10aGlzLmdsO2lmKHRoaXMuY3VycmVudEJhc2VUZXh0dXJlLl9nbFRleHR1cmVzW2EuaWRdfHx0aGlzLnJlbmRlclNlc3Npb24ucmVuZGVyZXIudXBkYXRlVGV4dHVyZSh0aGlzLmN1cnJlbnRCYXNlVGV4dHVyZSxhKSxhLmJpbmRUZXh0dXJlKGEuVEVYVFVSRV8yRCx0aGlzLmN1cnJlbnRCYXNlVGV4dHVyZS5fZ2xUZXh0dXJlc1thLmlkXSksdGhpcy5jdXJyZW50QmF0Y2hTaXplPi41KnRoaXMuc2l6ZSlhLmJ1ZmZlclN1YkRhdGEoYS5BUlJBWV9CVUZGRVIsMCx0aGlzLnZlcnRpY2VzKTtlbHNle3ZhciBiPXRoaXMudmVydGljZXMuc3ViYXJyYXkoMCw0KnRoaXMuY3VycmVudEJhdGNoU2l6ZSp0aGlzLnZlcnRTaXplKTthLmJ1ZmZlclN1YkRhdGEoYS5BUlJBWV9CVUZGRVIsMCxiKX1hLmRyYXdFbGVtZW50cyhhLlRSSUFOR0xFUyw2KnRoaXMuY3VycmVudEJhdGNoU2l6ZSxhLlVOU0lHTkVEX1NIT1JULDApLHRoaXMuY3VycmVudEJhdGNoU2l6ZT0wLHRoaXMucmVuZGVyU2Vzc2lvbi5kcmF3Q291bnQrK319LGIuV2ViR0xGYXN0U3ByaXRlQmF0Y2gucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLmZsdXNoKCl9LGIuV2ViR0xGYXN0U3ByaXRlQmF0Y2gucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nbDthLmFjdGl2ZVRleHR1cmUoYS5URVhUVVJFMCksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMudmVydGV4QnVmZmVyKSxhLmJpbmRCdWZmZXIoYS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmluZGV4QnVmZmVyKTt2YXIgYj10aGlzLnJlbmRlclNlc3Npb24ucHJvamVjdGlvbjthLnVuaWZvcm0yZih0aGlzLnNoYWRlci5wcm9qZWN0aW9uVmVjdG9yLGIueCxiLnkpLGEudW5pZm9ybU1hdHJpeDNmdih0aGlzLnNoYWRlci51TWF0cml4LCExLHRoaXMubWF0cml4KTt2YXIgYz00KnRoaXMudmVydFNpemU7YS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuc2hhZGVyLmFWZXJ0ZXhQb3NpdGlvbiwyLGEuRkxPQVQsITEsYywwKSxhLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5zaGFkZXIuYVBvc2l0aW9uQ29vcmQsMixhLkZMT0FULCExLGMsOCksYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuc2hhZGVyLmFTY2FsZSwyLGEuRkxPQVQsITEsYywxNiksYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuc2hhZGVyLmFSb3RhdGlvbiwxLGEuRkxPQVQsITEsYywyNCksYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMuc2hhZGVyLmFUZXh0dXJlQ29vcmQsMixhLkZMT0FULCExLGMsMjgpLGEudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnNoYWRlci5jb2xvckF0dHJpYnV0ZSwxLGEuRkxPQVQsITEsYywzNil9LGIuV2ViR0xGaWx0ZXJNYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5maWx0ZXJTdGFjaz1bXSx0aGlzLm9mZnNldFg9MCx0aGlzLm9mZnNldFk9MH0sYi5XZWJHTEZpbHRlck1hbmFnZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuV2ViR0xGaWx0ZXJNYW5hZ2VyLGIuV2ViR0xGaWx0ZXJNYW5hZ2VyLnByb3RvdHlwZS5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe3RoaXMuZ2w9YSx0aGlzLnRleHR1cmVQb29sPVtdLHRoaXMuaW5pdFNoYWRlckJ1ZmZlcnMoKX0sYi5XZWJHTEZpbHRlck1hbmFnZXIucHJvdG90eXBlLmJlZ2luPWZ1bmN0aW9uKGEsYil7dGhpcy5yZW5kZXJTZXNzaW9uPWEsdGhpcy5kZWZhdWx0U2hhZGVyPWEuc2hhZGVyTWFuYWdlci5kZWZhdWx0U2hhZGVyO3ZhciBjPXRoaXMucmVuZGVyU2Vzc2lvbi5wcm9qZWN0aW9uO3RoaXMud2lkdGg9MipjLngsdGhpcy5oZWlnaHQ9MiotYy55LHRoaXMuYnVmZmVyPWJ9LGIuV2ViR0xGaWx0ZXJNYW5hZ2VyLnByb3RvdHlwZS5wdXNoRmlsdGVyPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2wsZD10aGlzLnJlbmRlclNlc3Npb24ucHJvamVjdGlvbixlPXRoaXMucmVuZGVyU2Vzc2lvbi5vZmZzZXQ7YS5fZmlsdGVyQXJlYT1hLnRhcmdldC5maWx0ZXJBcmVhfHxhLnRhcmdldC5nZXRCb3VuZHMoKSx0aGlzLmZpbHRlclN0YWNrLnB1c2goYSk7dmFyIGY9YS5maWx0ZXJQYXNzZXNbMF07dGhpcy5vZmZzZXRYKz1hLl9maWx0ZXJBcmVhLngsdGhpcy5vZmZzZXRZKz1hLl9maWx0ZXJBcmVhLnk7dmFyIGc9dGhpcy50ZXh0dXJlUG9vbC5wb3AoKTtnP2cucmVzaXplKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpOmc9bmV3IGIuRmlsdGVyVGV4dHVyZSh0aGlzLmdsLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLGMuYmluZFRleHR1cmUoYy5URVhUVVJFXzJELGcudGV4dHVyZSk7dmFyIGg9YS5fZmlsdGVyQXJlYSxpPWYucGFkZGluZztoLngtPWksaC55LT1pLGgud2lkdGgrPTIqaSxoLmhlaWdodCs9MippLGgueDwwJiYoaC54PTApLGgud2lkdGg+dGhpcy53aWR0aCYmKGgud2lkdGg9dGhpcy53aWR0aCksaC55PDAmJihoLnk9MCksaC5oZWlnaHQ+dGhpcy5oZWlnaHQmJihoLmhlaWdodD10aGlzLmhlaWdodCksYy5iaW5kRnJhbWVidWZmZXIoYy5GUkFNRUJVRkZFUixnLmZyYW1lQnVmZmVyKSxjLnZpZXdwb3J0KDAsMCxoLndpZHRoLGguaGVpZ2h0KSxkLng9aC53aWR0aC8yLGQueT0taC5oZWlnaHQvMixlLng9LWgueCxlLnk9LWgueSxjLmNvbG9yTWFzayghMCwhMCwhMCwhMCksYy5jbGVhckNvbG9yKDAsMCwwLDApLGMuY2xlYXIoYy5DT0xPUl9CVUZGRVJfQklUKSxhLl9nbEZpbHRlclRleHR1cmU9Z30sYi5XZWJHTEZpbHRlck1hbmFnZXIucHJvdG90eXBlLnBvcEZpbHRlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2wsYz10aGlzLmZpbHRlclN0YWNrLnBvcCgpLGQ9Yy5fZmlsdGVyQXJlYSxlPWMuX2dsRmlsdGVyVGV4dHVyZSxmPXRoaXMucmVuZGVyU2Vzc2lvbi5wcm9qZWN0aW9uLGc9dGhpcy5yZW5kZXJTZXNzaW9uLm9mZnNldDtpZihjLmZpbHRlclBhc3Nlcy5sZW5ndGg+MSl7YS52aWV3cG9ydCgwLDAsZC53aWR0aCxkLmhlaWdodCksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMudmVydGV4QnVmZmVyKSx0aGlzLnZlcnRleEFycmF5WzBdPTAsdGhpcy52ZXJ0ZXhBcnJheVsxXT1kLmhlaWdodCx0aGlzLnZlcnRleEFycmF5WzJdPWQud2lkdGgsdGhpcy52ZXJ0ZXhBcnJheVszXT1kLmhlaWdodCx0aGlzLnZlcnRleEFycmF5WzRdPTAsdGhpcy52ZXJ0ZXhBcnJheVs1XT0wLHRoaXMudmVydGV4QXJyYXlbNl09ZC53aWR0aCx0aGlzLnZlcnRleEFycmF5WzddPTAsYS5idWZmZXJTdWJEYXRhKGEuQVJSQVlfQlVGRkVSLDAsdGhpcy52ZXJ0ZXhBcnJheSksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMudXZCdWZmZXIpLHRoaXMudXZBcnJheVsyXT1kLndpZHRoL3RoaXMud2lkdGgsdGhpcy51dkFycmF5WzVdPWQuaGVpZ2h0L3RoaXMuaGVpZ2h0LHRoaXMudXZBcnJheVs2XT1kLndpZHRoL3RoaXMud2lkdGgsdGhpcy51dkFycmF5WzddPWQuaGVpZ2h0L3RoaXMuaGVpZ2h0LGEuYnVmZmVyU3ViRGF0YShhLkFSUkFZX0JVRkZFUiwwLHRoaXMudXZBcnJheSk7dmFyIGg9ZSxpPXRoaXMudGV4dHVyZVBvb2wucG9wKCk7aXx8KGk9bmV3IGIuRmlsdGVyVGV4dHVyZSh0aGlzLmdsLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpKSxpLnJlc2l6ZSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSxhLmJpbmRGcmFtZWJ1ZmZlcihhLkZSQU1FQlVGRkVSLGkuZnJhbWVCdWZmZXIpLGEuY2xlYXIoYS5DT0xPUl9CVUZGRVJfQklUKSxhLmRpc2FibGUoYS5CTEVORCk7Zm9yKHZhciBqPTA7ajxjLmZpbHRlclBhc3Nlcy5sZW5ndGgtMTtqKyspe3ZhciBrPWMuZmlsdGVyUGFzc2VzW2pdO2EuYmluZEZyYW1lYnVmZmVyKGEuRlJBTUVCVUZGRVIsaS5mcmFtZUJ1ZmZlciksYS5hY3RpdmVUZXh0dXJlKGEuVEVYVFVSRTApLGEuYmluZFRleHR1cmUoYS5URVhUVVJFXzJELGgudGV4dHVyZSksdGhpcy5hcHBseUZpbHRlclBhc3MoayxkLGQud2lkdGgsZC5oZWlnaHQpO3ZhciBsPWg7aD1pLGk9bH1hLmVuYWJsZShhLkJMRU5EKSxlPWgsdGhpcy50ZXh0dXJlUG9vbC5wdXNoKGkpfXZhciBtPWMuZmlsdGVyUGFzc2VzW2MuZmlsdGVyUGFzc2VzLmxlbmd0aC0xXTt0aGlzLm9mZnNldFgtPWQueCx0aGlzLm9mZnNldFktPWQueTt2YXIgbj10aGlzLndpZHRoLG89dGhpcy5oZWlnaHQscD0wLHE9MCxyPXRoaXMuYnVmZmVyO2lmKDA9PT10aGlzLmZpbHRlclN0YWNrLmxlbmd0aClhLmNvbG9yTWFzayghMCwhMCwhMCwhMCk7ZWxzZXt2YXIgcz10aGlzLmZpbHRlclN0YWNrW3RoaXMuZmlsdGVyU3RhY2subGVuZ3RoLTFdO2Q9cy5fZmlsdGVyQXJlYSxuPWQud2lkdGgsbz1kLmhlaWdodCxwPWQueCxxPWQueSxyPXMuX2dsRmlsdGVyVGV4dHVyZS5mcmFtZUJ1ZmZlcn1mLng9bi8yLGYueT0tby8yLGcueD1wLGcueT1xLGQ9Yy5fZmlsdGVyQXJlYTt2YXIgdD1kLngtcCx1PWQueS1xO2EuYmluZEJ1ZmZlcihhLkFSUkFZX0JVRkZFUix0aGlzLnZlcnRleEJ1ZmZlciksdGhpcy52ZXJ0ZXhBcnJheVswXT10LHRoaXMudmVydGV4QXJyYXlbMV09dStkLmhlaWdodCx0aGlzLnZlcnRleEFycmF5WzJdPXQrZC53aWR0aCx0aGlzLnZlcnRleEFycmF5WzNdPXUrZC5oZWlnaHQsdGhpcy52ZXJ0ZXhBcnJheVs0XT10LHRoaXMudmVydGV4QXJyYXlbNV09dSx0aGlzLnZlcnRleEFycmF5WzZdPXQrZC53aWR0aCx0aGlzLnZlcnRleEFycmF5WzddPXUsYS5idWZmZXJTdWJEYXRhKGEuQVJSQVlfQlVGRkVSLDAsdGhpcy52ZXJ0ZXhBcnJheSksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMudXZCdWZmZXIpLHRoaXMudXZBcnJheVsyXT1kLndpZHRoL3RoaXMud2lkdGgsdGhpcy51dkFycmF5WzVdPWQuaGVpZ2h0L3RoaXMuaGVpZ2h0LHRoaXMudXZBcnJheVs2XT1kLndpZHRoL3RoaXMud2lkdGgsdGhpcy51dkFycmF5WzddPWQuaGVpZ2h0L3RoaXMuaGVpZ2h0LGEuYnVmZmVyU3ViRGF0YShhLkFSUkFZX0JVRkZFUiwwLHRoaXMudXZBcnJheSksYS52aWV3cG9ydCgwLDAsbixvKSxhLmJpbmRGcmFtZWJ1ZmZlcihhLkZSQU1FQlVGRkVSLHIpLGEuYWN0aXZlVGV4dHVyZShhLlRFWFRVUkUwKSxhLmJpbmRUZXh0dXJlKGEuVEVYVFVSRV8yRCxlLnRleHR1cmUpLHRoaXMuYXBwbHlGaWx0ZXJQYXNzKG0sZCxuLG8pLHRoaXMudGV4dHVyZVBvb2wucHVzaChlKSxjLl9nbEZpbHRlclRleHR1cmU9bnVsbH0sYi5XZWJHTEZpbHRlck1hbmFnZXIucHJvdG90eXBlLmFwcGx5RmlsdGVyUGFzcz1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj10aGlzLmdsLGc9YS5zaGFkZXJzW2YuaWRdO2d8fChnPW5ldyBiLlBpeGlTaGFkZXIoZiksZy5mcmFnbWVudFNyYz1hLmZyYWdtZW50U3JjLGcudW5pZm9ybXM9YS51bmlmb3JtcyxnLmluaXQoKSxhLnNoYWRlcnNbZi5pZF09ZyksdGhpcy5yZW5kZXJTZXNzaW9uLnNoYWRlck1hbmFnZXIuc2V0U2hhZGVyKGcpLGYudW5pZm9ybTJmKGcucHJvamVjdGlvblZlY3RvcixkLzIsLWUvMiksZi51bmlmb3JtMmYoZy5vZmZzZXRWZWN0b3IsMCwwKSxhLnVuaWZvcm1zLmRpbWVuc2lvbnMmJihhLnVuaWZvcm1zLmRpbWVuc2lvbnMudmFsdWVbMF09dGhpcy53aWR0aCxhLnVuaWZvcm1zLmRpbWVuc2lvbnMudmFsdWVbMV09dGhpcy5oZWlnaHQsYS51bmlmb3Jtcy5kaW1lbnNpb25zLnZhbHVlWzJdPXRoaXMudmVydGV4QXJyYXlbMF0sYS51bmlmb3Jtcy5kaW1lbnNpb25zLnZhbHVlWzNdPXRoaXMudmVydGV4QXJyYXlbNV0pLGcuc3luY1VuaWZvcm1zKCksZi5iaW5kQnVmZmVyKGYuQVJSQVlfQlVGRkVSLHRoaXMudmVydGV4QnVmZmVyKSxmLnZlcnRleEF0dHJpYlBvaW50ZXIoZy5hVmVydGV4UG9zaXRpb24sMixmLkZMT0FULCExLDAsMCksZi5iaW5kQnVmZmVyKGYuQVJSQVlfQlVGRkVSLHRoaXMudXZCdWZmZXIpLGYudmVydGV4QXR0cmliUG9pbnRlcihnLmFUZXh0dXJlQ29vcmQsMixmLkZMT0FULCExLDAsMCksZi5iaW5kQnVmZmVyKGYuQVJSQVlfQlVGRkVSLHRoaXMuY29sb3JCdWZmZXIpLGYudmVydGV4QXR0cmliUG9pbnRlcihnLmNvbG9yQXR0cmlidXRlLDIsZi5GTE9BVCwhMSwwLDApLGYuYmluZEJ1ZmZlcihmLkVMRU1FTlRfQVJSQVlfQlVGRkVSLHRoaXMuaW5kZXhCdWZmZXIpLGYuZHJhd0VsZW1lbnRzKGYuVFJJQU5HTEVTLDYsZi5VTlNJR05FRF9TSE9SVCwwKSx0aGlzLnJlbmRlclNlc3Npb24uZHJhd0NvdW50Kyt9LGIuV2ViR0xGaWx0ZXJNYW5hZ2VyLnByb3RvdHlwZS5pbml0U2hhZGVyQnVmZmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2w7dGhpcy52ZXJ0ZXhCdWZmZXI9YS5jcmVhdGVCdWZmZXIoKSx0aGlzLnV2QnVmZmVyPWEuY3JlYXRlQnVmZmVyKCksdGhpcy5jb2xvckJ1ZmZlcj1hLmNyZWF0ZUJ1ZmZlcigpLHRoaXMuaW5kZXhCdWZmZXI9YS5jcmVhdGVCdWZmZXIoKSx0aGlzLnZlcnRleEFycmF5PW5ldyBiLkZsb2F0MzJBcnJheShbMCwwLDEsMCwwLDEsMSwxXSksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMudmVydGV4QnVmZmVyKSxhLmJ1ZmZlckRhdGEoYS5BUlJBWV9CVUZGRVIsdGhpcy52ZXJ0ZXhBcnJheSxhLlNUQVRJQ19EUkFXKSx0aGlzLnV2QXJyYXk9bmV3IGIuRmxvYXQzMkFycmF5KFswLDAsMSwwLDAsMSwxLDFdKSxhLmJpbmRCdWZmZXIoYS5BUlJBWV9CVUZGRVIsdGhpcy51dkJ1ZmZlciksYS5idWZmZXJEYXRhKGEuQVJSQVlfQlVGRkVSLHRoaXMudXZBcnJheSxhLlNUQVRJQ19EUkFXKSx0aGlzLmNvbG9yQXJyYXk9bmV3IGIuRmxvYXQzMkFycmF5KFsxLDE2Nzc3MjE1LDEsMTY3NzcyMTUsMSwxNjc3NzIxNSwxLDE2Nzc3MjE1XSksYS5iaW5kQnVmZmVyKGEuQVJSQVlfQlVGRkVSLHRoaXMuY29sb3JCdWZmZXIpLGEuYnVmZmVyRGF0YShhLkFSUkFZX0JVRkZFUix0aGlzLmNvbG9yQXJyYXksYS5TVEFUSUNfRFJBVyksYS5iaW5kQnVmZmVyKGEuRUxFTUVOVF9BUlJBWV9CVUZGRVIsdGhpcy5pbmRleEJ1ZmZlciksYS5idWZmZXJEYXRhKGEuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbmV3IFVpbnQxNkFycmF5KFswLDEsMiwxLDMsMl0pLGEuU1RBVElDX0RSQVcpfSxiLldlYkdMRmlsdGVyTWFuYWdlci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2w7dGhpcy5maWx0ZXJTdGFjaz1udWxsLHRoaXMub2Zmc2V0WD0wLHRoaXMub2Zmc2V0WT0wO2Zvcih2YXIgYj0wO2I8dGhpcy50ZXh0dXJlUG9vbC5sZW5ndGg7YisrKXRoaXMudGV4dHVyZVBvb2xbYl0uZGVzdHJveSgpO3RoaXMudGV4dHVyZVBvb2w9bnVsbCxhLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRleEJ1ZmZlciksYS5kZWxldGVCdWZmZXIodGhpcy51dkJ1ZmZlciksYS5kZWxldGVCdWZmZXIodGhpcy5jb2xvckJ1ZmZlciksYS5kZWxldGVCdWZmZXIodGhpcy5pbmRleEJ1ZmZlcil9LGIuRmlsdGVyVGV4dHVyZT1mdW5jdGlvbihhLGMsZCxlKXt0aGlzLmdsPWEsdGhpcy5mcmFtZUJ1ZmZlcj1hLmNyZWF0ZUZyYW1lYnVmZmVyKCksdGhpcy50ZXh0dXJlPWEuY3JlYXRlVGV4dHVyZSgpLGU9ZXx8Yi5zY2FsZU1vZGVzLkRFRkFVTFQsYS5iaW5kVGV4dHVyZShhLlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSxhLnRleFBhcmFtZXRlcmkoYS5URVhUVVJFXzJELGEuVEVYVFVSRV9NQUdfRklMVEVSLGU9PT1iLnNjYWxlTW9kZXMuTElORUFSP2EuTElORUFSOmEuTkVBUkVTVCksYS50ZXhQYXJhbWV0ZXJpKGEuVEVYVFVSRV8yRCxhLlRFWFRVUkVfTUlOX0ZJTFRFUixlPT09Yi5zY2FsZU1vZGVzLkxJTkVBUj9hLkxJTkVBUjphLk5FQVJFU1QpLGEudGV4UGFyYW1ldGVyaShhLlRFWFRVUkVfMkQsYS5URVhUVVJFX1dSQVBfUyxhLkNMQU1QX1RPX0VER0UpLGEudGV4UGFyYW1ldGVyaShhLlRFWFRVUkVfMkQsYS5URVhUVVJFX1dSQVBfVCxhLkNMQU1QX1RPX0VER0UpLGEuYmluZEZyYW1lYnVmZmVyKGEuRlJBTUVCVUZGRVIsdGhpcy5mcmFtZUJ1ZmZlciksYS5iaW5kRnJhbWVidWZmZXIoYS5GUkFNRUJVRkZFUix0aGlzLmZyYW1lQnVmZmVyKSxhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGEuRlJBTUVCVUZGRVIsYS5DT0xPUl9BVFRBQ0hNRU5UMCxhLlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlLDApLHRoaXMucmVuZGVyQnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCksYS5iaW5kUmVuZGVyYnVmZmVyKGEuUkVOREVSQlVGRkVSLHRoaXMucmVuZGVyQnVmZmVyKSxhLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGEuRlJBTUVCVUZGRVIsYS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsYS5SRU5ERVJCVUZGRVIsdGhpcy5yZW5kZXJCdWZmZXIpLHRoaXMucmVzaXplKGMsZClcbn0sYi5GaWx0ZXJUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkZpbHRlclRleHR1cmUsYi5GaWx0ZXJUZXh0dXJlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2w7YS5jbGVhckNvbG9yKDAsMCwwLDApLGEuY2xlYXIoYS5DT0xPUl9CVUZGRVJfQklUKX0sYi5GaWx0ZXJUZXh0dXJlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLndpZHRoIT09YXx8dGhpcy5oZWlnaHQhPT1iKXt0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9Yjt2YXIgYz10aGlzLmdsO2MuYmluZFRleHR1cmUoYy5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksYy50ZXhJbWFnZTJEKGMuVEVYVFVSRV8yRCwwLGMuUkdCQSxhLGIsMCxjLlJHQkEsYy5VTlNJR05FRF9CWVRFLG51bGwpLGMuYmluZFJlbmRlcmJ1ZmZlcihjLlJFTkRFUkJVRkZFUix0aGlzLnJlbmRlckJ1ZmZlciksYy5yZW5kZXJidWZmZXJTdG9yYWdlKGMuUkVOREVSQlVGRkVSLGMuREVQVEhfU1RFTkNJTCxhLGIpfX0sYi5GaWx0ZXJUZXh0dXJlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nbDthLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVCdWZmZXIpLGEuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpLHRoaXMuZnJhbWVCdWZmZXI9bnVsbCx0aGlzLnRleHR1cmU9bnVsbH0sYi5DYW52YXNCdWZmZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9Yix0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiksdGhpcy5jYW52YXMud2lkdGg9YSx0aGlzLmNhbnZhcy5oZWlnaHQ9Yn0sYi5DYW52YXNCdWZmZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuQ2FudmFzQnVmZmVyLGIuQ2FudmFzQnVmZmVyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxiLkNhbnZhc0J1ZmZlci5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEsYil7dGhpcy53aWR0aD10aGlzLmNhbnZhcy53aWR0aD1hLHRoaXMuaGVpZ2h0PXRoaXMuY2FudmFzLmhlaWdodD1ifSxiLkNhbnZhc01hc2tNYW5hZ2VyPWZ1bmN0aW9uKCl7fSxiLkNhbnZhc01hc2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkNhbnZhc01hc2tNYW5hZ2VyLGIuQ2FudmFzTWFza01hbmFnZXIucHJvdG90eXBlLnB1c2hNYXNrPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yy5jb250ZXh0O2Quc2F2ZSgpO3ZhciBlPWEuYWxwaGEsZj1hLndvcmxkVHJhbnNmb3JtLGc9Yy5yZXNvbHV0aW9uO2Quc2V0VHJhbnNmb3JtKGYuYSpnLGYuYipnLGYuYypnLGYuZCpnLGYudHgqZyxmLnR5KmcpLGIuQ2FudmFzR3JhcGhpY3MucmVuZGVyR3JhcGhpY3NNYXNrKGEsZCksZC5jbGlwKCksYS53b3JsZEFscGhhPWV9LGIuQ2FudmFzTWFza01hbmFnZXIucHJvdG90eXBlLnBvcE1hc2s9ZnVuY3Rpb24oYSl7YS5jb250ZXh0LnJlc3RvcmUoKX0sYi5DYW52YXNUaW50ZXI9ZnVuY3Rpb24oKXt9LGIuQ2FudmFzVGludGVyLmdldFRpbnRlZFRleHR1cmU9ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnRleHR1cmU7Yz1iLkNhbnZhc1RpbnRlci5yb3VuZENvbG9yKGMpO3ZhciBlPVwiI1wiKyhcIjAwMDAwXCIrKDB8YykudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO2lmKGQudGludENhY2hlPWQudGludENhY2hlfHx7fSxkLnRpbnRDYWNoZVtlXSlyZXR1cm4gZC50aW50Q2FjaGVbZV07dmFyIGY9Yi5DYW52YXNUaW50ZXIuY2FudmFzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO2lmKGIuQ2FudmFzVGludGVyLnRpbnRNZXRob2QoZCxjLGYpLGIuQ2FudmFzVGludGVyLmNvbnZlcnRUaW50VG9JbWFnZSl7dmFyIGc9bmV3IEltYWdlO2cuc3JjPWYudG9EYXRhVVJMKCksZC50aW50Q2FjaGVbZV09Z31lbHNlIGQudGludENhY2hlW2VdPWYsYi5DYW52YXNUaW50ZXIuY2FudmFzPW51bGw7cmV0dXJuIGZ9LGIuQ2FudmFzVGludGVyLnRpbnRXaXRoTXVsdGlwbHk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMuZ2V0Q29udGV4dChcIjJkXCIpLGU9YS5jcm9wO2Mud2lkdGg9ZS53aWR0aCxjLmhlaWdodD1lLmhlaWdodCxkLmZpbGxTdHlsZT1cIiNcIisoXCIwMDAwMFwiKygwfGIpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KSxkLmZpbGxSZWN0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSxkLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cIm11bHRpcGx5XCIsZC5kcmF3SW1hZ2UoYS5iYXNlVGV4dHVyZS5zb3VyY2UsZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0LDAsMCxlLndpZHRoLGUuaGVpZ2h0KSxkLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cImRlc3RpbmF0aW9uLWF0b3BcIixkLmRyYXdJbWFnZShhLmJhc2VUZXh0dXJlLnNvdXJjZSxlLngsZS55LGUud2lkdGgsZS5oZWlnaHQsMCwwLGUud2lkdGgsZS5oZWlnaHQpfSxiLkNhbnZhc1RpbnRlci50aW50V2l0aE92ZXJsYXk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMuZ2V0Q29udGV4dChcIjJkXCIpLGU9YS5jcm9wO2Mud2lkdGg9ZS53aWR0aCxjLmhlaWdodD1lLmhlaWdodCxkLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cImNvcHlcIixkLmZpbGxTdHlsZT1cIiNcIisoXCIwMDAwMFwiKygwfGIpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KSxkLmZpbGxSZWN0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSxkLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cImRlc3RpbmF0aW9uLWF0b3BcIixkLmRyYXdJbWFnZShhLmJhc2VUZXh0dXJlLnNvdXJjZSxlLngsZS55LGUud2lkdGgsZS5oZWlnaHQsMCwwLGUud2lkdGgsZS5oZWlnaHQpfSxiLkNhbnZhc1RpbnRlci50aW50V2l0aFBlclBpeGVsPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1kLmdldENvbnRleHQoXCIyZFwiKSxmPWEuY3JvcDtkLndpZHRoPWYud2lkdGgsZC5oZWlnaHQ9Zi5oZWlnaHQsZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJjb3B5XCIsZS5kcmF3SW1hZ2UoYS5iYXNlVGV4dHVyZS5zb3VyY2UsZi54LGYueSxmLndpZHRoLGYuaGVpZ2h0LDAsMCxmLndpZHRoLGYuaGVpZ2h0KTtmb3IodmFyIGc9Yi5oZXgycmdiKGMpLGg9Z1swXSxpPWdbMV0saj1nWzJdLGs9ZS5nZXRJbWFnZURhdGEoMCwwLGYud2lkdGgsZi5oZWlnaHQpLGw9ay5kYXRhLG09MDttPGwubGVuZ3RoO20rPTQpbFttKzBdKj1oLGxbbSsxXSo9aSxsW20rMl0qPWo7ZS5wdXRJbWFnZURhdGEoaywwLDApfSxiLkNhbnZhc1RpbnRlci5yb3VuZENvbG9yPWZ1bmN0aW9uKGEpe3ZhciBjPWIuQ2FudmFzVGludGVyLmNhY2hlU3RlcHNQZXJDb2xvckNoYW5uZWwsZD1iLmhleDJyZ2IoYSk7cmV0dXJuIGRbMF09TWF0aC5taW4oMjU1LGRbMF0vYypjKSxkWzFdPU1hdGgubWluKDI1NSxkWzFdL2MqYyksZFsyXT1NYXRoLm1pbigyNTUsZFsyXS9jKmMpLGIucmdiMmhleChkKX0sYi5DYW52YXNUaW50ZXIuY2FjaGVTdGVwc1BlckNvbG9yQ2hhbm5lbD04LGIuQ2FudmFzVGludGVyLmNvbnZlcnRUaW50VG9JbWFnZT0hMSxiLkNhbnZhc1RpbnRlci5jYW5Vc2VNdWx0aXBseT1iLmNhblVzZU5ld0NhbnZhc0JsZW5kTW9kZXMoKSxiLkNhbnZhc1RpbnRlci50aW50TWV0aG9kPWIuQ2FudmFzVGludGVyLmNhblVzZU11bHRpcGx5P2IuQ2FudmFzVGludGVyLnRpbnRXaXRoTXVsdGlwbHk6Yi5DYW52YXNUaW50ZXIudGludFdpdGhQZXJQaXhlbCxiLkNhbnZhc1JlbmRlcmVyPWZ1bmN0aW9uKGEsYyxkKXtpZihkKWZvcih2YXIgZSBpbiBiLmRlZmF1bHRSZW5kZXJPcHRpb25zKVwidW5kZWZpbmVkXCI9PXR5cGVvZiBkW2VdJiYoZFtlXT1iLmRlZmF1bHRSZW5kZXJPcHRpb25zW2VdKTtlbHNlIGQ9Yi5kZWZhdWx0UmVuZGVyT3B0aW9ucztiLmRlZmF1bHRSZW5kZXJlcnx8KGIuc2F5SGVsbG8oXCJDYW52YXNcIiksYi5kZWZhdWx0UmVuZGVyZXI9dGhpcyksdGhpcy50eXBlPWIuQ0FOVkFTX1JFTkRFUkVSLHRoaXMucmVzb2x1dGlvbj1kLnJlc29sdXRpb24sdGhpcy5jbGVhckJlZm9yZVJlbmRlcj1kLmNsZWFyQmVmb3JlUmVuZGVyLHRoaXMudHJhbnNwYXJlbnQ9ZC50cmFuc3BhcmVudCx0aGlzLmF1dG9SZXNpemU9ZC5hdXRvUmVzaXplfHwhMSx0aGlzLndpZHRoPWF8fDgwMCx0aGlzLmhlaWdodD1jfHw2MDAsdGhpcy53aWR0aCo9dGhpcy5yZXNvbHV0aW9uLHRoaXMuaGVpZ2h0Kj10aGlzLnJlc29sdXRpb24sdGhpcy52aWV3PWQudmlld3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSx0aGlzLmNvbnRleHQ9dGhpcy52aWV3LmdldENvbnRleHQoXCIyZFwiLHthbHBoYTp0aGlzLnRyYW5zcGFyZW50fSksdGhpcy5yZWZyZXNoPSEwLHRoaXMudmlldy53aWR0aD10aGlzLndpZHRoKnRoaXMucmVzb2x1dGlvbix0aGlzLnZpZXcuaGVpZ2h0PXRoaXMuaGVpZ2h0KnRoaXMucmVzb2x1dGlvbix0aGlzLmNvdW50PTAsdGhpcy5tYXNrTWFuYWdlcj1uZXcgYi5DYW52YXNNYXNrTWFuYWdlcix0aGlzLnJlbmRlclNlc3Npb249e2NvbnRleHQ6dGhpcy5jb250ZXh0LG1hc2tNYW5hZ2VyOnRoaXMubWFza01hbmFnZXIsc2NhbGVNb2RlOm51bGwsc21vb3RoUHJvcGVydHk6bnVsbCxyb3VuZFBpeGVsczohMX0sdGhpcy5tYXBCbGVuZE1vZGVzKCksdGhpcy5yZXNpemUoYSxjKSxcImltYWdlU21vb3RoaW5nRW5hYmxlZFwiaW4gdGhpcy5jb250ZXh0P3RoaXMucmVuZGVyU2Vzc2lvbi5zbW9vdGhQcm9wZXJ0eT1cImltYWdlU21vb3RoaW5nRW5hYmxlZFwiOlwid2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkXCJpbiB0aGlzLmNvbnRleHQ/dGhpcy5yZW5kZXJTZXNzaW9uLnNtb290aFByb3BlcnR5PVwid2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkXCI6XCJtb3pJbWFnZVNtb290aGluZ0VuYWJsZWRcImluIHRoaXMuY29udGV4dD90aGlzLnJlbmRlclNlc3Npb24uc21vb3RoUHJvcGVydHk9XCJtb3pJbWFnZVNtb290aGluZ0VuYWJsZWRcIjpcIm9JbWFnZVNtb290aGluZ0VuYWJsZWRcImluIHRoaXMuY29udGV4dD90aGlzLnJlbmRlclNlc3Npb24uc21vb3RoUHJvcGVydHk9XCJvSW1hZ2VTbW9vdGhpbmdFbmFibGVkXCI6XCJtc0ltYWdlU21vb3RoaW5nRW5hYmxlZFwiaW4gdGhpcy5jb250ZXh0JiYodGhpcy5yZW5kZXJTZXNzaW9uLnNtb290aFByb3BlcnR5PVwibXNJbWFnZVNtb290aGluZ0VuYWJsZWRcIil9LGIuQ2FudmFzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuQ2FudmFzUmVuZGVyZXIsYi5DYW52YXNSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe2EudXBkYXRlVHJhbnNmb3JtKCksdGhpcy5jb250ZXh0LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhPTEsdGhpcy5yZW5kZXJTZXNzaW9uLmN1cnJlbnRCbGVuZE1vZGU9Yi5ibGVuZE1vZGVzLk5PUk1BTCx0aGlzLmNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuTk9STUFMXSxuYXZpZ2F0b3IuaXNDb2Nvb25KUyYmdGhpcy52aWV3LnNjcmVlbmNhbnZhcyYmKHRoaXMuY29udGV4dC5maWxsU3R5bGU9XCJibGFja1wiLHRoaXMuY29udGV4dC5jbGVhcigpKSx0aGlzLmNsZWFyQmVmb3JlUmVuZGVyJiYodGhpcy50cmFuc3BhcmVudD90aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KToodGhpcy5jb250ZXh0LmZpbGxTdHlsZT1hLmJhY2tncm91bmRDb2xvclN0cmluZyx0aGlzLmNvbnRleHQuZmlsbFJlY3QoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpKSksdGhpcy5yZW5kZXJEaXNwbGF5T2JqZWN0KGEpLGEuaW50ZXJhY3RpdmUmJihhLl9pbnRlcmFjdGl2ZUV2ZW50c0FkZGVkfHwoYS5faW50ZXJhY3RpdmVFdmVudHNBZGRlZD0hMCxhLmludGVyYWN0aW9uTWFuYWdlci5zZXRUYXJnZXQodGhpcykpKX0sYi5DYW52YXNSZW5kZXJlci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihhKXtcInVuZGVmaW5lZFwiPT10eXBlb2YgYSYmKGE9ITApLGEmJnRoaXMudmlldy5wYXJlbnQmJnRoaXMudmlldy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy52aWV3KSx0aGlzLnZpZXc9bnVsbCx0aGlzLmNvbnRleHQ9bnVsbCx0aGlzLm1hc2tNYW5hZ2VyPW51bGwsdGhpcy5yZW5kZXJTZXNzaW9uPW51bGx9LGIuQ2FudmFzUmVuZGVyZXIucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhLGIpe3RoaXMud2lkdGg9YSp0aGlzLnJlc29sdXRpb24sdGhpcy5oZWlnaHQ9Yip0aGlzLnJlc29sdXRpb24sdGhpcy52aWV3LndpZHRoPXRoaXMud2lkdGgsdGhpcy52aWV3LmhlaWdodD10aGlzLmhlaWdodCx0aGlzLmF1dG9SZXNpemUmJih0aGlzLnZpZXcuc3R5bGUud2lkdGg9dGhpcy53aWR0aC90aGlzLnJlc29sdXRpb24rXCJweFwiLHRoaXMudmlldy5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQvdGhpcy5yZXNvbHV0aW9uK1wicHhcIil9LGIuQ2FudmFzUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlckRpc3BsYXlPYmplY3Q9ZnVuY3Rpb24oYSxiKXt0aGlzLnJlbmRlclNlc3Npb24uY29udGV4dD1ifHx0aGlzLmNvbnRleHQsdGhpcy5yZW5kZXJTZXNzaW9uLnJlc29sdXRpb249dGhpcy5yZXNvbHV0aW9uLGEuX3JlbmRlckNhbnZhcyh0aGlzLnJlbmRlclNlc3Npb24pfSxiLkNhbnZhc1JlbmRlcmVyLnByb3RvdHlwZS5tYXBCbGVuZE1vZGVzPWZ1bmN0aW9uKCl7Yi5ibGVuZE1vZGVzQ2FudmFzfHwoYi5ibGVuZE1vZGVzQ2FudmFzPVtdLGIuY2FuVXNlTmV3Q2FudmFzQmxlbmRNb2RlcygpPyhiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLk5PUk1BTF09XCJzb3VyY2Utb3ZlclwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuQUREXT1cImxpZ2h0ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLk1VTFRJUExZXT1cIm11bHRpcGx5XCIsYi5ibGVuZE1vZGVzQ2FudmFzW2IuYmxlbmRNb2Rlcy5TQ1JFRU5dPVwic2NyZWVuXCIsYi5ibGVuZE1vZGVzQ2FudmFzW2IuYmxlbmRNb2Rlcy5PVkVSTEFZXT1cIm92ZXJsYXlcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkRBUktFTl09XCJkYXJrZW5cIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkxJR0hURU5dPVwibGlnaHRlblwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuQ09MT1JfRE9ER0VdPVwiY29sb3ItZG9kZ2VcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkNPTE9SX0JVUk5dPVwiY29sb3ItYnVyblwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuSEFSRF9MSUdIVF09XCJoYXJkLWxpZ2h0XCIsYi5ibGVuZE1vZGVzQ2FudmFzW2IuYmxlbmRNb2Rlcy5TT0ZUX0xJR0hUXT1cInNvZnQtbGlnaHRcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkRJRkZFUkVOQ0VdPVwiZGlmZmVyZW5jZVwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuRVhDTFVTSU9OXT1cImV4Y2x1c2lvblwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuSFVFXT1cImh1ZVwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuU0FUVVJBVElPTl09XCJzYXR1cmF0aW9uXCIsYi5ibGVuZE1vZGVzQ2FudmFzW2IuYmxlbmRNb2Rlcy5DT0xPUl09XCJjb2xvclwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuTFVNSU5PU0lUWV09XCJsdW1pbm9zaXR5XCIpOihiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLk5PUk1BTF09XCJzb3VyY2Utb3ZlclwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuQUREXT1cImxpZ2h0ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLk1VTFRJUExZXT1cInNvdXJjZS1vdmVyXCIsYi5ibGVuZE1vZGVzQ2FudmFzW2IuYmxlbmRNb2Rlcy5TQ1JFRU5dPVwic291cmNlLW92ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLk9WRVJMQVldPVwic291cmNlLW92ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkRBUktFTl09XCJzb3VyY2Utb3ZlclwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuTElHSFRFTl09XCJzb3VyY2Utb3ZlclwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuQ09MT1JfRE9ER0VdPVwic291cmNlLW92ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkNPTE9SX0JVUk5dPVwic291cmNlLW92ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkhBUkRfTElHSFRdPVwic291cmNlLW92ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLlNPRlRfTElHSFRdPVwic291cmNlLW92ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkRJRkZFUkVOQ0VdPVwic291cmNlLW92ZXJcIixiLmJsZW5kTW9kZXNDYW52YXNbYi5ibGVuZE1vZGVzLkVYQ0xVU0lPTl09XCJzb3VyY2Utb3ZlclwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuSFVFXT1cInNvdXJjZS1vdmVyXCIsYi5ibGVuZE1vZGVzQ2FudmFzW2IuYmxlbmRNb2Rlcy5TQVRVUkFUSU9OXT1cInNvdXJjZS1vdmVyXCIsYi5ibGVuZE1vZGVzQ2FudmFzW2IuYmxlbmRNb2Rlcy5DT0xPUl09XCJzb3VyY2Utb3ZlclwiLGIuYmxlbmRNb2Rlc0NhbnZhc1tiLmJsZW5kTW9kZXMuTFVNSU5PU0lUWV09XCJzb3VyY2Utb3ZlclwiKSl9LGIuQ2FudmFzR3JhcGhpY3M9ZnVuY3Rpb24oKXt9LGIuQ2FudmFzR3JhcGhpY3MucmVuZGVyR3JhcGhpY3M9ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLndvcmxkQWxwaGE7YS5kaXJ0eSYmKHRoaXMudXBkYXRlR3JhcGhpY3NUaW50KGEpLGEuZGlydHk9ITEpO2Zvcih2YXIgZT0wO2U8YS5ncmFwaGljc0RhdGEubGVuZ3RoO2UrKyl7dmFyIGY9YS5ncmFwaGljc0RhdGFbZV0sZz1mLnNoYXBlLGg9Zi5fZmlsbFRpbnQsaT1mLl9saW5lVGludDtpZihjLmxpbmVXaWR0aD1mLmxpbmVXaWR0aCxmLnR5cGU9PT1iLkdyYXBoaWNzLlBPTFkpe2MuYmVnaW5QYXRoKCk7dmFyIGo9Zy5wb2ludHM7Yy5tb3ZlVG8oalswXSxqWzFdKTtmb3IodmFyIGs9MTtrPGoubGVuZ3RoLzI7aysrKWMubGluZVRvKGpbMiprXSxqWzIqaysxXSk7Zy5jbG9zZWQmJmMubGluZVRvKGpbMF0salsxXSksalswXT09PWpbai5sZW5ndGgtMl0mJmpbMV09PT1qW2oubGVuZ3RoLTFdJiZjLmNsb3NlUGF0aCgpLGYuZmlsbCYmKGMuZ2xvYmFsQWxwaGE9Zi5maWxsQWxwaGEqZCxjLmZpbGxTdHlsZT1cIiNcIisoXCIwMDAwMFwiKygwfGgpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KSxjLmZpbGwoKSksZi5saW5lV2lkdGgmJihjLmdsb2JhbEFscGhhPWYubGluZUFscGhhKmQsYy5zdHJva2VTdHlsZT1cIiNcIisoXCIwMDAwMFwiKygwfGkpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KSxjLnN0cm9rZSgpKX1lbHNlIGlmKGYudHlwZT09PWIuR3JhcGhpY3MuUkVDVCkoZi5maWxsQ29sb3J8fDA9PT1mLmZpbGxDb2xvcikmJihjLmdsb2JhbEFscGhhPWYuZmlsbEFscGhhKmQsYy5maWxsU3R5bGU9XCIjXCIrKFwiMDAwMDBcIisoMHxoKS50b1N0cmluZygxNikpLnN1YnN0cigtNiksYy5maWxsUmVjdChnLngsZy55LGcud2lkdGgsZy5oZWlnaHQpKSxmLmxpbmVXaWR0aCYmKGMuZ2xvYmFsQWxwaGE9Zi5saW5lQWxwaGEqZCxjLnN0cm9rZVN0eWxlPVwiI1wiKyhcIjAwMDAwXCIrKDB8aSkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpLGMuc3Ryb2tlUmVjdChnLngsZy55LGcud2lkdGgsZy5oZWlnaHQpKTtlbHNlIGlmKGYudHlwZT09PWIuR3JhcGhpY3MuQ0lSQyljLmJlZ2luUGF0aCgpLGMuYXJjKGcueCxnLnksZy5yYWRpdXMsMCwyKk1hdGguUEkpLGMuY2xvc2VQYXRoKCksZi5maWxsJiYoYy5nbG9iYWxBbHBoYT1mLmZpbGxBbHBoYSpkLGMuZmlsbFN0eWxlPVwiI1wiKyhcIjAwMDAwXCIrKDB8aCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpLGMuZmlsbCgpKSxmLmxpbmVXaWR0aCYmKGMuZ2xvYmFsQWxwaGE9Zi5saW5lQWxwaGEqZCxjLnN0cm9rZVN0eWxlPVwiI1wiKyhcIjAwMDAwXCIrKDB8aSkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpLGMuc3Ryb2tlKCkpO2Vsc2UgaWYoZi50eXBlPT09Yi5HcmFwaGljcy5FTElQKXt2YXIgbD0yKmcud2lkdGgsbT0yKmcuaGVpZ2h0LG49Zy54LWwvMixvPWcueS1tLzI7Yy5iZWdpblBhdGgoKTt2YXIgcD0uNTUyMjg0OCxxPWwvMipwLHI9bS8yKnAscz1uK2wsdD1vK20sdT1uK2wvMix2PW8rbS8yO2MubW92ZVRvKG4sdiksYy5iZXppZXJDdXJ2ZVRvKG4sdi1yLHUtcSxvLHUsbyksYy5iZXppZXJDdXJ2ZVRvKHUrcSxvLHMsdi1yLHMsdiksYy5iZXppZXJDdXJ2ZVRvKHMsdityLHUrcSx0LHUsdCksYy5iZXppZXJDdXJ2ZVRvKHUtcSx0LG4sdityLG4sdiksYy5jbG9zZVBhdGgoKSxmLmZpbGwmJihjLmdsb2JhbEFscGhhPWYuZmlsbEFscGhhKmQsYy5maWxsU3R5bGU9XCIjXCIrKFwiMDAwMDBcIisoMHxoKS50b1N0cmluZygxNikpLnN1YnN0cigtNiksYy5maWxsKCkpLGYubGluZVdpZHRoJiYoYy5nbG9iYWxBbHBoYT1mLmxpbmVBbHBoYSpkLGMuc3Ryb2tlU3R5bGU9XCIjXCIrKFwiMDAwMDBcIisoMHxpKS50b1N0cmluZygxNikpLnN1YnN0cigtNiksYy5zdHJva2UoKSl9ZWxzZSBpZihmLnR5cGU9PT1iLkdyYXBoaWNzLlJSRUMpe3ZhciB3PWcueCx4PWcueSx5PWcud2lkdGgsej1nLmhlaWdodCxBPWcucmFkaXVzLEI9TWF0aC5taW4oeSx6KS8yfDA7QT1BPkI/QjpBLGMuYmVnaW5QYXRoKCksYy5tb3ZlVG8odyx4K0EpLGMubGluZVRvKHcseCt6LUEpLGMucXVhZHJhdGljQ3VydmVUbyh3LHgreix3K0EseCt6KSxjLmxpbmVUbyh3K3ktQSx4K3opLGMucXVhZHJhdGljQ3VydmVUbyh3K3kseCt6LHcreSx4K3otQSksYy5saW5lVG8odyt5LHgrQSksYy5xdWFkcmF0aWNDdXJ2ZVRvKHcreSx4LHcreS1BLHgpLGMubGluZVRvKHcrQSx4KSxjLnF1YWRyYXRpY0N1cnZlVG8odyx4LHcseCtBKSxjLmNsb3NlUGF0aCgpLChmLmZpbGxDb2xvcnx8MD09PWYuZmlsbENvbG9yKSYmKGMuZ2xvYmFsQWxwaGE9Zi5maWxsQWxwaGEqZCxjLmZpbGxTdHlsZT1cIiNcIisoXCIwMDAwMFwiKygwfGgpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KSxjLmZpbGwoKSksZi5saW5lV2lkdGgmJihjLmdsb2JhbEFscGhhPWYubGluZUFscGhhKmQsYy5zdHJva2VTdHlsZT1cIiNcIisoXCIwMDAwMFwiKygwfGkpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KSxjLnN0cm9rZSgpKX19fSxiLkNhbnZhc0dyYXBoaWNzLnJlbmRlckdyYXBoaWNzTWFzaz1mdW5jdGlvbihhLGMpe3ZhciBkPWEuZ3JhcGhpY3NEYXRhLmxlbmd0aDtpZigwIT09ZCl7ZD4xJiYoZD0xLHdpbmRvdy5jb25zb2xlLmxvZyhcIlBpeGkuanMgd2FybmluZzogbWFza3MgaW4gY2FudmFzIGNhbiBvbmx5IG1hc2sgdXNpbmcgdGhlIGZpcnN0IHBhdGggaW4gdGhlIGdyYXBoaWNzIG9iamVjdFwiKSk7Zm9yKHZhciBlPTA7MT5lO2UrKyl7dmFyIGY9YS5ncmFwaGljc0RhdGFbZV0sZz1mLnNoYXBlO2lmKGYudHlwZT09PWIuR3JhcGhpY3MuUE9MWSl7Yy5iZWdpblBhdGgoKTt2YXIgaD1nLnBvaW50cztjLm1vdmVUbyhoWzBdLGhbMV0pO2Zvcih2YXIgaT0xO2k8aC5sZW5ndGgvMjtpKyspYy5saW5lVG8oaFsyKmldLGhbMippKzFdKTtoWzBdPT09aFtoLmxlbmd0aC0yXSYmaFsxXT09PWhbaC5sZW5ndGgtMV0mJmMuY2xvc2VQYXRoKCl9ZWxzZSBpZihmLnR5cGU9PT1iLkdyYXBoaWNzLlJFQ1QpYy5iZWdpblBhdGgoKSxjLnJlY3QoZy54LGcueSxnLndpZHRoLGcuaGVpZ2h0KSxjLmNsb3NlUGF0aCgpO2Vsc2UgaWYoZi50eXBlPT09Yi5HcmFwaGljcy5DSVJDKWMuYmVnaW5QYXRoKCksYy5hcmMoZy54LGcueSxnLnJhZGl1cywwLDIqTWF0aC5QSSksYy5jbG9zZVBhdGgoKTtlbHNlIGlmKGYudHlwZT09PWIuR3JhcGhpY3MuRUxJUCl7dmFyIGo9MipnLndpZHRoLGs9MipnLmhlaWdodCxsPWcueC1qLzIsbT1nLnktay8yO2MuYmVnaW5QYXRoKCk7dmFyIG49LjU1MjI4NDgsbz1qLzIqbixwPWsvMipuLHE9bCtqLHI9bStrLHM9bCtqLzIsdD1tK2svMjtjLm1vdmVUbyhsLHQpLGMuYmV6aWVyQ3VydmVUbyhsLHQtcCxzLW8sbSxzLG0pLGMuYmV6aWVyQ3VydmVUbyhzK28sbSxxLHQtcCxxLHQpLGMuYmV6aWVyQ3VydmVUbyhxLHQrcCxzK28scixzLHIpLGMuYmV6aWVyQ3VydmVUbyhzLW8scixsLHQrcCxsLHQpLGMuY2xvc2VQYXRoKCl9ZWxzZSBpZihmLnR5cGU9PT1iLkdyYXBoaWNzLlJSRUMpe3ZhciB1PWcucG9pbnRzLHY9dVswXSx3PXVbMV0seD11WzJdLHk9dVszXSx6PXVbNF0sQT1NYXRoLm1pbih4LHkpLzJ8MDt6PXo+QT9BOnosYy5iZWdpblBhdGgoKSxjLm1vdmVUbyh2LHcreiksYy5saW5lVG8odix3K3kteiksYy5xdWFkcmF0aWNDdXJ2ZVRvKHYsdyt5LHYreix3K3kpLGMubGluZVRvKHYreC16LHcreSksYy5xdWFkcmF0aWNDdXJ2ZVRvKHYreCx3K3ksdit4LHcreS16KSxjLmxpbmVUbyh2K3gsdyt6KSxjLnF1YWRyYXRpY0N1cnZlVG8odit4LHcsdit4LXosdyksYy5saW5lVG8odit6LHcpLGMucXVhZHJhdGljQ3VydmVUbyh2LHcsdix3K3opLGMuY2xvc2VQYXRoKCl9fX19LGIuQ2FudmFzR3JhcGhpY3MudXBkYXRlR3JhcGhpY3NUaW50PWZ1bmN0aW9uKGEpe2lmKDE2Nzc3MjE1IT09YS50aW50KWZvcih2YXIgYj0oYS50aW50Pj4xNiYyNTUpLzI1NSxjPShhLnRpbnQ+PjgmMjU1KS8yNTUsZD0oMjU1JmEudGludCkvMjU1LGU9MDtlPGEuZ3JhcGhpY3NEYXRhLmxlbmd0aDtlKyspe3ZhciBmPWEuZ3JhcGhpY3NEYXRhW2VdLGc9MHxmLmZpbGxDb2xvcixoPTB8Zi5saW5lQ29sb3I7Zi5fZmlsbFRpbnQ9KChnPj4xNiYyNTUpLzI1NSpiKjI1NTw8MTYpKygoZz4+OCYyNTUpLzI1NSpjKjI1NTw8OCkrKDI1NSZnKS8yNTUqZCoyNTUsZi5fbGluZVRpbnQ9KChoPj4xNiYyNTUpLzI1NSpiKjI1NTw8MTYpKygoaD4+OCYyNTUpLzI1NSpjKjI1NTw8OCkrKDI1NSZoKS8yNTUqZCoyNTV9fSxiLkdyYXBoaWNzPWZ1bmN0aW9uKCl7Yi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLmNhbGwodGhpcyksdGhpcy5yZW5kZXJhYmxlPSEwLHRoaXMuZmlsbEFscGhhPTEsdGhpcy5saW5lV2lkdGg9MCx0aGlzLmxpbmVDb2xvcj0wLHRoaXMuZ3JhcGhpY3NEYXRhPVtdLHRoaXMudGludD0xNjc3NzIxNSx0aGlzLmJsZW5kTW9kZT1iLmJsZW5kTW9kZXMuTk9STUFMLHRoaXMuY3VycmVudFBhdGg9bnVsbCx0aGlzLl93ZWJHTD1bXSx0aGlzLmlzTWFzaz0hMSx0aGlzLmJvdW5kc1BhZGRpbmc9MCx0aGlzLl9sb2NhbEJvdW5kcz1uZXcgYi5SZWN0YW5nbGUoMCwwLDEsMSksdGhpcy5kaXJ0eT0hMCx0aGlzLndlYkdMRGlydHk9ITEsdGhpcy5jYWNoZWRTcHJpdGVEaXJ0eT0hMX0sYi5HcmFwaGljcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlKSxiLkdyYXBoaWNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkdyYXBoaWNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkdyYXBoaWNzLnByb3RvdHlwZSxcImNhY2hlQXNCaXRtYXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhY2hlQXNCaXRtYXB9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9jYWNoZUFzQml0bWFwPWEsdGhpcy5fY2FjaGVBc0JpdG1hcD90aGlzLl9nZW5lcmF0ZUNhY2hlZFNwcml0ZSgpOih0aGlzLmRlc3Ryb3lDYWNoZWRTcHJpdGUoKSx0aGlzLmRpcnR5PSEwKX19KSxiLkdyYXBoaWNzLnByb3RvdHlwZS5saW5lU3R5bGU9ZnVuY3Rpb24oYSxjLGQpe2lmKHRoaXMubGluZVdpZHRoPWF8fDAsdGhpcy5saW5lQ29sb3I9Y3x8MCx0aGlzLmxpbmVBbHBoYT1hcmd1bWVudHMubGVuZ3RoPDM/MTpkLHRoaXMuY3VycmVudFBhdGgpe2lmKHRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5kcmF3U2hhcGUobmV3IGIuUG9seWdvbih0aGlzLmN1cnJlbnRQYXRoLnNoYXBlLnBvaW50cy5zbGljZSgtMikpKSx0aGlzO3RoaXMuY3VycmVudFBhdGgubGluZVdpZHRoPXRoaXMubGluZVdpZHRoLHRoaXMuY3VycmVudFBhdGgubGluZUNvbG9yPXRoaXMubGluZUNvbG9yLHRoaXMuY3VycmVudFBhdGgubGluZUFscGhhPXRoaXMubGluZUFscGhhfXJldHVybiB0aGlzfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5kcmF3U2hhcGUobmV3IGIuUG9seWdvbihbYSxjXSkpLHRoaXN9LGIuR3JhcGhpY3MucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnNoYXBlLnBvaW50cy5wdXNoKGEsYiksdGhpcy5kaXJ0eT0hMCx0aGlzfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuY3VycmVudFBhdGg/MD09PXRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzLmxlbmd0aCYmKHRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzPVswLDBdKTp0aGlzLm1vdmVUbygwLDApO3ZhciBlLGYsZz0yMCxoPXRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzOzA9PT1oLmxlbmd0aCYmdGhpcy5tb3ZlVG8oMCwwKTtmb3IodmFyIGk9aFtoLmxlbmd0aC0yXSxqPWhbaC5sZW5ndGgtMV0saz0wLGw9MTtnPj1sO2wrKylrPWwvZyxlPWkrKGEtaSkqayxmPWorKGItaikqayxoLnB1c2goZSsoYSsoYy1hKSprLWUpKmssZisoYisoZC1iKSprLWYpKmspO3JldHVybiB0aGlzLmRpcnR5PSEwLHRoaXN9LGIuR3JhcGhpY3MucHJvdG90eXBlLmJlemllckN1cnZlVG89ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuY3VycmVudFBhdGg/MD09PXRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzLmxlbmd0aCYmKHRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzPVswLDBdKTp0aGlzLm1vdmVUbygwLDApO2Zvcih2YXIgZyxoLGksaixrLGw9MjAsbT10aGlzLmN1cnJlbnRQYXRoLnNoYXBlLnBvaW50cyxuPW1bbS5sZW5ndGgtMl0sbz1tW20ubGVuZ3RoLTFdLHA9MCxxPTE7bD49cTtxKyspcD1xL2wsZz0xLXAsaD1nKmcsaT1oKmcsaj1wKnAsaz1qKnAsbS5wdXNoKGkqbiszKmgqcCphKzMqZypqKmMrayplLGkqbyszKmgqcCpiKzMqZypqKmQraypmKTtyZXR1cm4gdGhpcy5kaXJ0eT0hMCx0aGlzfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5hcmNUbz1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMuY3VycmVudFBhdGg/MD09PXRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzLmxlbmd0aCYmdGhpcy5jdXJyZW50UGF0aC5zaGFwZS5wb2ludHMucHVzaChhLGIpOnRoaXMubW92ZVRvKGEsYik7dmFyIGY9dGhpcy5jdXJyZW50UGF0aC5zaGFwZS5wb2ludHMsZz1mW2YubGVuZ3RoLTJdLGg9ZltmLmxlbmd0aC0xXSxpPWgtYixqPWctYSxrPWQtYixsPWMtYSxtPU1hdGguYWJzKGkqbC1qKmspO2lmKDFlLTg+bXx8MD09PWUpKGZbZi5sZW5ndGgtMl0hPT1hfHxmW2YubGVuZ3RoLTFdIT09YikmJmYucHVzaChhLGIpO2Vsc2V7dmFyIG49aSppK2oqaixvPWsqaytsKmwscD1pKmsraipsLHE9ZSpNYXRoLnNxcnQobikvbSxyPWUqTWF0aC5zcXJ0KG8pL20scz1xKnAvbix0PXIqcC9vLHU9cSpsK3Iqaix2PXEqaytyKmksdz1qKihyK3MpLHg9aSoocitzKSx5PWwqKHErdCksej1rKihxK3QpLEE9TWF0aC5hdGFuMih4LXYsdy11KSxCPU1hdGguYXRhbjIoei12LHktdSk7dGhpcy5hcmModSthLHYrYixlLEEsQixqKms+bCppKX1yZXR1cm4gdGhpcy5kaXJ0eT0hMCx0aGlzfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5hcmM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnLGg9YStNYXRoLmNvcyhkKSpjLGk9YitNYXRoLnNpbihkKSpjO2lmKHRoaXMuY3VycmVudFBhdGg/KGc9dGhpcy5jdXJyZW50UGF0aC5zaGFwZS5wb2ludHMsMD09PWcubGVuZ3RoP2cucHVzaChoLGkpOihnW2cubGVuZ3RoLTJdIT09aHx8Z1tnLmxlbmd0aC0xXSE9PWkpJiZnLnB1c2goaCxpKSk6KHRoaXMubW92ZVRvKGgsaSksZz10aGlzLmN1cnJlbnRQYXRoLnNoYXBlLnBvaW50cyksZD09PWUpcmV0dXJuIHRoaXM7IWYmJmQ+PWU/ZSs9MipNYXRoLlBJOmYmJmU+PWQmJihkKz0yKk1hdGguUEkpO3ZhciBqPWY/LTEqKGQtZSk6ZS1kLGs9TWF0aC5hYnMoaikvKDIqTWF0aC5QSSkqNDA7aWYoMD09PWopcmV0dXJuIHRoaXM7Zm9yKHZhciBsPWovKDIqayksbT0yKmwsbj1NYXRoLmNvcyhsKSxvPU1hdGguc2luKGwpLHA9ay0xLHE9cCUxL3Ascj0wO3A+PXI7cisrKXt2YXIgcz1yK3Eqcix0PWwrZCttKnMsdT1NYXRoLmNvcyh0KSx2PS1NYXRoLnNpbih0KTtnLnB1c2goKG4qdStvKnYpKmMrYSwobiotditvKnUpKmMrYil9cmV0dXJuIHRoaXMuZGlydHk9ITAsdGhpc30sYi5HcmFwaGljcy5wcm90b3R5cGUuYmVnaW5GaWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZmlsbGluZz0hMCx0aGlzLmZpbGxDb2xvcj1hfHwwLHRoaXMuZmlsbEFscGhhPXZvaWQgMD09PWI/MTpiLHRoaXMuY3VycmVudFBhdGgmJnRoaXMuY3VycmVudFBhdGguc2hhcGUucG9pbnRzLmxlbmd0aDw9MiYmKHRoaXMuY3VycmVudFBhdGguZmlsbD10aGlzLmZpbGxpbmcsdGhpcy5jdXJyZW50UGF0aC5maWxsQ29sb3I9dGhpcy5maWxsQ29sb3IsdGhpcy5jdXJyZW50UGF0aC5maWxsQWxwaGE9dGhpcy5maWxsQWxwaGEpLHRoaXN9LGIuR3JhcGhpY3MucHJvdG90eXBlLmVuZEZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsaW5nPSExLHRoaXMuZmlsbENvbG9yPW51bGwsdGhpcy5maWxsQWxwaGE9MSx0aGlzfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5kcmF3UmVjdD1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gdGhpcy5kcmF3U2hhcGUobmV3IGIuUmVjdGFuZ2xlKGEsYyxkLGUpKSx0aGlzfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5kcmF3Um91bmRlZFJlY3Q9ZnVuY3Rpb24oYSxjLGQsZSxmKXtyZXR1cm4gdGhpcy5kcmF3U2hhcGUobmV3IGIuUm91bmRlZFJlY3RhbmdsZShhLGMsZCxlLGYpKSx0aGlzfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5kcmF3Q2lyY2xlPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5kcmF3U2hhcGUobmV3IGIuQ2lyY2xlKGEsYyxkKSksdGhpc30sYi5HcmFwaGljcy5wcm90b3R5cGUuZHJhd0VsbGlwc2U9ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHRoaXMuZHJhd1NoYXBlKG5ldyBiLkVsbGlwc2UoYSxjLGQsZSkpLHRoaXN9LGIuR3JhcGhpY3MucHJvdG90eXBlLmRyYXdQb2x5Z29uPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgQXJyYXl8fChhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpLHRoaXMuZHJhd1NoYXBlKG5ldyBiLlBvbHlnb24oYSkpLHRoaXN9LGIuR3JhcGhpY3MucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGluZVdpZHRoPTAsdGhpcy5maWxsaW5nPSExLHRoaXMuZGlydHk9ITAsdGhpcy5jbGVhckRpcnR5PSEwLHRoaXMuZ3JhcGhpY3NEYXRhPVtdLHRoaXN9LGIuR3JhcGhpY3MucHJvdG90eXBlLmdlbmVyYXRlVGV4dHVyZT1mdW5jdGlvbihhLGMpe2E9YXx8MTt2YXIgZD10aGlzLmdldEJvdW5kcygpLGU9bmV3IGIuQ2FudmFzQnVmZmVyKGQud2lkdGgqYSxkLmhlaWdodCphKSxmPWIuVGV4dHVyZS5mcm9tQ2FudmFzKGUuY2FudmFzLGMpO3JldHVybiBmLmJhc2VUZXh0dXJlLnJlc29sdXRpb249YSxlLmNvbnRleHQuc2NhbGUoYSxhKSxlLmNvbnRleHQudHJhbnNsYXRlKC1kLngsLWQueSksYi5DYW52YXNHcmFwaGljcy5yZW5kZXJHcmFwaGljcyh0aGlzLGUuY29udGV4dCksZn0sYi5HcmFwaGljcy5wcm90b3R5cGUuX3JlbmRlcldlYkdMPWZ1bmN0aW9uKGEpe2lmKHRoaXMudmlzaWJsZSE9PSExJiYwIT09dGhpcy5hbHBoYSYmdGhpcy5pc01hc2shPT0hMCl7aWYodGhpcy5fY2FjaGVBc0JpdG1hcClyZXR1cm4odGhpcy5kaXJ0eXx8dGhpcy5jYWNoZWRTcHJpdGVEaXJ0eSkmJih0aGlzLl9nZW5lcmF0ZUNhY2hlZFNwcml0ZSgpLHRoaXMudXBkYXRlQ2FjaGVkU3ByaXRlVGV4dHVyZSgpLHRoaXMuY2FjaGVkU3ByaXRlRGlydHk9ITEsdGhpcy5kaXJ0eT0hMSksdGhpcy5fY2FjaGVkU3ByaXRlLndvcmxkQWxwaGE9dGhpcy53b3JsZEFscGhhLHZvaWQgYi5TcHJpdGUucHJvdG90eXBlLl9yZW5kZXJXZWJHTC5jYWxsKHRoaXMuX2NhY2hlZFNwcml0ZSxhKTtpZihhLnNwcml0ZUJhdGNoLnN0b3AoKSxhLmJsZW5kTW9kZU1hbmFnZXIuc2V0QmxlbmRNb2RlKHRoaXMuYmxlbmRNb2RlKSx0aGlzLl9tYXNrJiZhLm1hc2tNYW5hZ2VyLnB1c2hNYXNrKHRoaXMuX21hc2ssYSksdGhpcy5fZmlsdGVycyYmYS5maWx0ZXJNYW5hZ2VyLnB1c2hGaWx0ZXIodGhpcy5fZmlsdGVyQmxvY2spLHRoaXMuYmxlbmRNb2RlIT09YS5zcHJpdGVCYXRjaC5jdXJyZW50QmxlbmRNb2RlKXthLnNwcml0ZUJhdGNoLmN1cnJlbnRCbGVuZE1vZGU9dGhpcy5ibGVuZE1vZGU7dmFyIGM9Yi5ibGVuZE1vZGVzV2ViR0xbYS5zcHJpdGVCYXRjaC5jdXJyZW50QmxlbmRNb2RlXTthLnNwcml0ZUJhdGNoLmdsLmJsZW5kRnVuYyhjWzBdLGNbMV0pfWlmKHRoaXMud2ViR0xEaXJ0eSYmKHRoaXMuZGlydHk9ITAsdGhpcy53ZWJHTERpcnR5PSExKSxiLldlYkdMR3JhcGhpY3MucmVuZGVyR3JhcGhpY3ModGhpcyxhKSx0aGlzLmNoaWxkcmVuLmxlbmd0aCl7YS5zcHJpdGVCYXRjaC5zdGFydCgpO2Zvcih2YXIgZD0wLGU9dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZT5kO2QrKyl0aGlzLmNoaWxkcmVuW2RdLl9yZW5kZXJXZWJHTChhKTthLnNwcml0ZUJhdGNoLnN0b3AoKX10aGlzLl9maWx0ZXJzJiZhLmZpbHRlck1hbmFnZXIucG9wRmlsdGVyKCksdGhpcy5fbWFzayYmYS5tYXNrTWFuYWdlci5wb3BNYXNrKHRoaXMubWFzayxhKSxhLmRyYXdDb3VudCsrLGEuc3ByaXRlQmF0Y2guc3RhcnQoKX19LGIuR3JhcGhpY3MucHJvdG90eXBlLl9yZW5kZXJDYW52YXM9ZnVuY3Rpb24oYSl7aWYodGhpcy52aXNpYmxlIT09ITEmJjAhPT10aGlzLmFscGhhJiZ0aGlzLmlzTWFzayE9PSEwKXtpZih0aGlzLl9jYWNoZUFzQml0bWFwKXJldHVybih0aGlzLmRpcnR5fHx0aGlzLmNhY2hlZFNwcml0ZURpcnR5KSYmKHRoaXMuX2dlbmVyYXRlQ2FjaGVkU3ByaXRlKCksdGhpcy51cGRhdGVDYWNoZWRTcHJpdGVUZXh0dXJlKCksdGhpcy5jYWNoZWRTcHJpdGVEaXJ0eT0hMSx0aGlzLmRpcnR5PSExKSx0aGlzLl9jYWNoZWRTcHJpdGUuYWxwaGE9dGhpcy5hbHBoYSx2b2lkIGIuU3ByaXRlLnByb3RvdHlwZS5fcmVuZGVyQ2FudmFzLmNhbGwodGhpcy5fY2FjaGVkU3ByaXRlLGEpO3ZhciBjPWEuY29udGV4dCxkPXRoaXMud29ybGRUcmFuc2Zvcm07dGhpcy5ibGVuZE1vZGUhPT1hLmN1cnJlbnRCbGVuZE1vZGUmJihhLmN1cnJlbnRCbGVuZE1vZGU9dGhpcy5ibGVuZE1vZGUsYy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Yi5ibGVuZE1vZGVzQ2FudmFzW2EuY3VycmVudEJsZW5kTW9kZV0pLHRoaXMuX21hc2smJmEubWFza01hbmFnZXIucHVzaE1hc2sodGhpcy5fbWFzayxhKTt2YXIgZT1hLnJlc29sdXRpb247Yy5zZXRUcmFuc2Zvcm0oZC5hKmUsZC5iKmUsZC5jKmUsZC5kKmUsZC50eCplLGQudHkqZSksYi5DYW52YXNHcmFwaGljcy5yZW5kZXJHcmFwaGljcyh0aGlzLGMpO2Zvcih2YXIgZj0wLGc9dGhpcy5jaGlsZHJlbi5sZW5ndGg7Zz5mO2YrKyl0aGlzLmNoaWxkcmVuW2ZdLl9yZW5kZXJDYW52YXMoYSk7dGhpcy5fbWFzayYmYS5tYXNrTWFuYWdlci5wb3BNYXNrKGEpfX0sYi5HcmFwaGljcy5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNNYXNrKXJldHVybiBiLkVtcHR5UmVjdGFuZ2xlO3RoaXMuZGlydHkmJih0aGlzLnVwZGF0ZUxvY2FsQm91bmRzKCksdGhpcy53ZWJHTERpcnR5PSEwLHRoaXMuY2FjaGVkU3ByaXRlRGlydHk9ITAsdGhpcy5kaXJ0eT0hMSk7dmFyIGM9dGhpcy5fbG9jYWxCb3VuZHMsZD1jLngsZT1jLndpZHRoK2MueCxmPWMueSxnPWMuaGVpZ2h0K2MueSxoPWF8fHRoaXMud29ybGRUcmFuc2Zvcm0saT1oLmEsaj1oLmIsaz1oLmMsbD1oLmQsbT1oLnR4LG49aC50eSxvPWkqZStrKmcrbSxwPWwqZytqKmUrbixxPWkqZCtrKmcrbSxyPWwqZytqKmQrbixzPWkqZCtrKmYrbSx0PWwqZitqKmQrbix1PWkqZStrKmYrbSx2PWwqZitqKmUrbix3PW8seD1wLHk9byx6PXA7cmV0dXJuIHk9eT5xP3E6eSx5PXk+cz9zOnkseT15PnU/dTp5LHo9ej5yP3I6eix6PXo+dD90Onosej16PnY/djp6LHc9cT53P3E6dyx3PXM+dz9zOncsdz11Pnc/dTp3LHg9cj54P3I6eCx4PXQ+eD90OngseD12Png/djp4LHRoaXMuX2JvdW5kcy54PXksdGhpcy5fYm91bmRzLndpZHRoPXcteSx0aGlzLl9ib3VuZHMueT16LHRoaXMuX2JvdW5kcy5oZWlnaHQ9eC16LHRoaXMuX2JvdW5kc30sYi5HcmFwaGljcy5wcm90b3R5cGUudXBkYXRlTG9jYWxCb3VuZHM9ZnVuY3Rpb24oKXt2YXIgYT0xLzAsYz0tMS8wLGQ9MS8wLGU9LTEvMDtpZih0aGlzLmdyYXBoaWNzRGF0YS5sZW5ndGgpZm9yKHZhciBmLGcsaCxpLGosayxsPTA7bDx0aGlzLmdyYXBoaWNzRGF0YS5sZW5ndGg7bCsrKXt2YXIgbT10aGlzLmdyYXBoaWNzRGF0YVtsXSxuPW0udHlwZSxvPW0ubGluZVdpZHRoO2lmKGY9bS5zaGFwZSxuPT09Yi5HcmFwaGljcy5SRUNUfHxuPT09Yi5HcmFwaGljcy5SUkVDKWg9Zi54LW8vMixpPWYueS1vLzIsaj1mLndpZHRoK28saz1mLmhlaWdodCtvLGE9YT5oP2g6YSxjPWgraj5jP2grajpjLGQ9ZD5pP2k6ZCxlPWkraz5lP2krazplO2Vsc2UgaWYobj09PWIuR3JhcGhpY3MuQ0lSQyloPWYueCxpPWYueSxqPWYucmFkaXVzK28vMixrPWYucmFkaXVzK28vMixhPWE+aC1qP2gtajphLGM9aCtqPmM/aCtqOmMsZD1kPmktaz9pLWs6ZCxlPWkraz5lP2krazplO2Vsc2UgaWYobj09PWIuR3JhcGhpY3MuRUxJUCloPWYueCxpPWYueSxqPWYud2lkdGgrby8yLGs9Zi5oZWlnaHQrby8yLGE9YT5oLWo/aC1qOmEsYz1oK2o+Yz9oK2o6YyxkPWQ+aS1rP2ktazpkLGU9aStrPmU/aStrOmU7ZWxzZXtnPWYucG9pbnRzO2Zvcih2YXIgcD0wO3A8Zy5sZW5ndGg7cCs9MiloPWdbcF0saT1nW3ArMV0sYT1hPmgtbz9oLW86YSxjPWgrbz5jP2grbzpjLGQ9ZD5pLW8/aS1vOmQsZT1pK28+ZT9pK286ZX19ZWxzZSBhPTAsYz0wLGQ9MCxlPTA7dmFyIHE9dGhpcy5ib3VuZHNQYWRkaW5nO3RoaXMuX2xvY2FsQm91bmRzLng9YS1xLHRoaXMuX2xvY2FsQm91bmRzLndpZHRoPWMtYSsyKnEsdGhpcy5fbG9jYWxCb3VuZHMueT1kLXEsdGhpcy5fbG9jYWxCb3VuZHMuaGVpZ2h0PWUtZCsyKnF9LGIuR3JhcGhpY3MucHJvdG90eXBlLl9nZW5lcmF0ZUNhY2hlZFNwcml0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0TG9jYWxCb3VuZHMoKTtpZih0aGlzLl9jYWNoZWRTcHJpdGUpdGhpcy5fY2FjaGVkU3ByaXRlLmJ1ZmZlci5yZXNpemUoYS53aWR0aCxhLmhlaWdodCk7ZWxzZXt2YXIgYz1uZXcgYi5DYW52YXNCdWZmZXIoYS53aWR0aCxhLmhlaWdodCksZD1iLlRleHR1cmUuZnJvbUNhbnZhcyhjLmNhbnZhcyk7dGhpcy5fY2FjaGVkU3ByaXRlPW5ldyBiLlNwcml0ZShkKSx0aGlzLl9jYWNoZWRTcHJpdGUuYnVmZmVyPWMsdGhpcy5fY2FjaGVkU3ByaXRlLndvcmxkVHJhbnNmb3JtPXRoaXMud29ybGRUcmFuc2Zvcm19dGhpcy5fY2FjaGVkU3ByaXRlLmFuY2hvci54PS0oYS54L2Eud2lkdGgpLHRoaXMuX2NhY2hlZFNwcml0ZS5hbmNob3IueT0tKGEueS9hLmhlaWdodCksdGhpcy5fY2FjaGVkU3ByaXRlLmJ1ZmZlci5jb250ZXh0LnRyYW5zbGF0ZSgtYS54LC1hLnkpLHRoaXMud29ybGRBbHBoYT0xLGIuQ2FudmFzR3JhcGhpY3MucmVuZGVyR3JhcGhpY3ModGhpcyx0aGlzLl9jYWNoZWRTcHJpdGUuYnVmZmVyLmNvbnRleHQpLHRoaXMuX2NhY2hlZFNwcml0ZS5hbHBoYT10aGlzLmFscGhhfSxiLkdyYXBoaWNzLnByb3RvdHlwZS51cGRhdGVDYWNoZWRTcHJpdGVUZXh0dXJlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fY2FjaGVkU3ByaXRlLGI9YS50ZXh0dXJlLGM9YS5idWZmZXIuY2FudmFzO2IuYmFzZVRleHR1cmUud2lkdGg9Yy53aWR0aCxiLmJhc2VUZXh0dXJlLmhlaWdodD1jLmhlaWdodCxiLmNyb3Aud2lkdGg9Yi5mcmFtZS53aWR0aD1jLndpZHRoLGIuY3JvcC5oZWlnaHQ9Yi5mcmFtZS5oZWlnaHQ9Yy5oZWlnaHQsYS5fd2lkdGg9Yy53aWR0aCxhLl9oZWlnaHQ9Yy5oZWlnaHQsYi5iYXNlVGV4dHVyZS5kaXJ0eSgpfSxiLkdyYXBoaWNzLnByb3RvdHlwZS5kZXN0cm95Q2FjaGVkU3ByaXRlPWZ1bmN0aW9uKCl7dGhpcy5fY2FjaGVkU3ByaXRlLnRleHR1cmUuZGVzdHJveSghMCksdGhpcy5fY2FjaGVkU3ByaXRlPW51bGx9LGIuR3JhcGhpY3MucHJvdG90eXBlLmRyYXdTaGFwZT1mdW5jdGlvbihhKXt0aGlzLmN1cnJlbnRQYXRoJiZ0aGlzLmN1cnJlbnRQYXRoLnNoYXBlLnBvaW50cy5sZW5ndGg8PTImJnRoaXMuZ3JhcGhpY3NEYXRhLnBvcCgpLHRoaXMuY3VycmVudFBhdGg9bnVsbDt2YXIgYz1uZXcgYi5HcmFwaGljc0RhdGEodGhpcy5saW5lV2lkdGgsdGhpcy5saW5lQ29sb3IsdGhpcy5saW5lQWxwaGEsdGhpcy5maWxsQ29sb3IsdGhpcy5maWxsQWxwaGEsdGhpcy5maWxsaW5nLGEpO3JldHVybiB0aGlzLmdyYXBoaWNzRGF0YS5wdXNoKGMpLGMudHlwZT09PWIuR3JhcGhpY3MuUE9MWSYmKGMuc2hhcGUuY2xvc2VkPXRoaXMuZmlsbGluZyx0aGlzLmN1cnJlbnRQYXRoPWMpLHRoaXMuZGlydHk9ITAsY30sYi5HcmFwaGljc0RhdGE9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dGhpcy5saW5lV2lkdGg9YSx0aGlzLmxpbmVDb2xvcj1iLHRoaXMubGluZUFscGhhPWMsdGhpcy5fbGluZVRpbnQ9Yix0aGlzLmZpbGxDb2xvcj1kLHRoaXMuZmlsbEFscGhhPWUsdGhpcy5fZmlsbFRpbnQ9ZCx0aGlzLmZpbGw9Zix0aGlzLnNoYXBlPWcsdGhpcy50eXBlPWcudHlwZX0sYi5HcmFwaGljcy5QT0xZPTAsYi5HcmFwaGljcy5SRUNUPTEsYi5HcmFwaGljcy5DSVJDPTIsYi5HcmFwaGljcy5FTElQPTMsYi5HcmFwaGljcy5SUkVDPTQsYi5Qb2x5Z29uLnByb3RvdHlwZS50eXBlPWIuR3JhcGhpY3MuUE9MWSxiLlJlY3RhbmdsZS5wcm90b3R5cGUudHlwZT1iLkdyYXBoaWNzLlJFQ1QsYi5DaXJjbGUucHJvdG90eXBlLnR5cGU9Yi5HcmFwaGljcy5DSVJDLGIuRWxsaXBzZS5wcm90b3R5cGUudHlwZT1iLkdyYXBoaWNzLkVMSVAsYi5Sb3VuZGVkUmVjdGFuZ2xlLnByb3RvdHlwZS50eXBlPWIuR3JhcGhpY3MuUlJFQyxiLlN0cmlwPWZ1bmN0aW9uKGEpe2IuRGlzcGxheU9iamVjdENvbnRhaW5lci5jYWxsKHRoaXMpLHRoaXMudGV4dHVyZT1hLHRoaXMudXZzPW5ldyBiLkZsb2F0MzJBcnJheShbMCwxLDEsMSwxLDAsMCwxXSksdGhpcy52ZXJ0aWNlcz1uZXcgYi5GbG9hdDMyQXJyYXkoWzAsMCwxMDAsMCwxMDAsMTAwLDAsMTAwXSksdGhpcy5jb2xvcnM9bmV3IGIuRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy5pbmRpY2VzPW5ldyBiLlVpbnQxNkFycmF5KFswLDEsMiwzXSksdGhpcy5kaXJ0eT0hMCx0aGlzLmJsZW5kTW9kZT1iLmJsZW5kTW9kZXMuTk9STUFMLHRoaXMuY2FudmFzUGFkZGluZz0wLHRoaXMuZHJhd01vZGU9Yi5TdHJpcC5EcmF3TW9kZXMuVFJJQU5HTEVfU1RSSVB9LGIuU3RyaXAucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZSksYi5TdHJpcC5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5TdHJpcCxiLlN0cmlwLnByb3RvdHlwZS5fcmVuZGVyV2ViR0w9ZnVuY3Rpb24oYSl7IXRoaXMudmlzaWJsZXx8dGhpcy5hbHBoYTw9MHx8KGEuc3ByaXRlQmF0Y2guc3RvcCgpLHRoaXMuX3ZlcnRleEJ1ZmZlcnx8dGhpcy5faW5pdFdlYkdMKGEpLGEuc2hhZGVyTWFuYWdlci5zZXRTaGFkZXIoYS5zaGFkZXJNYW5hZ2VyLnN0cmlwU2hhZGVyKSx0aGlzLl9yZW5kZXJTdHJpcChhKSxhLnNwcml0ZUJhdGNoLnN0YXJ0KCkpfSxiLlN0cmlwLnByb3RvdHlwZS5faW5pdFdlYkdMPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2w7dGhpcy5fdmVydGV4QnVmZmVyPWIuY3JlYXRlQnVmZmVyKCksdGhpcy5faW5kZXhCdWZmZXI9Yi5jcmVhdGVCdWZmZXIoKSx0aGlzLl91dkJ1ZmZlcj1iLmNyZWF0ZUJ1ZmZlcigpLHRoaXMuX2NvbG9yQnVmZmVyPWIuY3JlYXRlQnVmZmVyKCksYi5iaW5kQnVmZmVyKGIuQVJSQVlfQlVGRkVSLHRoaXMuX3ZlcnRleEJ1ZmZlciksYi5idWZmZXJEYXRhKGIuQVJSQVlfQlVGRkVSLHRoaXMudmVydGljZXMsYi5EWU5BTUlDX0RSQVcpLGIuYmluZEJ1ZmZlcihiLkFSUkFZX0JVRkZFUix0aGlzLl91dkJ1ZmZlciksYi5idWZmZXJEYXRhKGIuQVJSQVlfQlVGRkVSLHRoaXMudXZzLGIuU1RBVElDX0RSQVcpLGIuYmluZEJ1ZmZlcihiLkFSUkFZX0JVRkZFUix0aGlzLl9jb2xvckJ1ZmZlciksYi5idWZmZXJEYXRhKGIuQVJSQVlfQlVGRkVSLHRoaXMuY29sb3JzLGIuU1RBVElDX0RSQVcpLGIuYmluZEJ1ZmZlcihiLkVMRU1FTlRfQVJSQVlfQlVGRkVSLHRoaXMuX2luZGV4QnVmZmVyKSxiLmJ1ZmZlckRhdGEoYi5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLmluZGljZXMsYi5TVEFUSUNfRFJBVyl9LGIuU3RyaXAucHJvdG90eXBlLl9yZW5kZXJTdHJpcD1mdW5jdGlvbihhKXt2YXIgYz1hLmdsLGQ9YS5wcm9qZWN0aW9uLGU9YS5vZmZzZXQsZj1hLnNoYWRlck1hbmFnZXIuc3RyaXBTaGFkZXIsZz10aGlzLmRyYXdNb2RlPT09Yi5TdHJpcC5EcmF3TW9kZXMuVFJJQU5HTEVfU1RSSVA/Yy5UUklBTkdMRV9TVFJJUDpjLlRSSUFOR0xFUzthLmJsZW5kTW9kZU1hbmFnZXIuc2V0QmxlbmRNb2RlKHRoaXMuYmxlbmRNb2RlKSxjLnVuaWZvcm1NYXRyaXgzZnYoZi50cmFuc2xhdGlvbk1hdHJpeCwhMSx0aGlzLndvcmxkVHJhbnNmb3JtLnRvQXJyYXkoITApKSxjLnVuaWZvcm0yZihmLnByb2plY3Rpb25WZWN0b3IsZC54LC1kLnkpLGMudW5pZm9ybTJmKGYub2Zmc2V0VmVjdG9yLC1lLngsLWUueSksYy51bmlmb3JtMWYoZi5hbHBoYSx0aGlzLndvcmxkQWxwaGEpLHRoaXMuZGlydHk/KHRoaXMuZGlydHk9ITEsYy5iaW5kQnVmZmVyKGMuQVJSQVlfQlVGRkVSLHRoaXMuX3ZlcnRleEJ1ZmZlciksYy5idWZmZXJEYXRhKGMuQVJSQVlfQlVGRkVSLHRoaXMudmVydGljZXMsYy5TVEFUSUNfRFJBVyksYy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGYuYVZlcnRleFBvc2l0aW9uLDIsYy5GTE9BVCwhMSwwLDApLGMuYmluZEJ1ZmZlcihjLkFSUkFZX0JVRkZFUix0aGlzLl91dkJ1ZmZlciksYy5idWZmZXJEYXRhKGMuQVJSQVlfQlVGRkVSLHRoaXMudXZzLGMuU1RBVElDX0RSQVcpLGMudmVydGV4QXR0cmliUG9pbnRlcihmLmFUZXh0dXJlQ29vcmQsMixjLkZMT0FULCExLDAsMCksYy5hY3RpdmVUZXh0dXJlKGMuVEVYVFVSRTApLHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5fZGlydHlbYy5pZF0/YS5yZW5kZXJlci51cGRhdGVUZXh0dXJlKHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZSk6Yy5iaW5kVGV4dHVyZShjLlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlLl9nbFRleHR1cmVzW2MuaWRdKSxjLmJpbmRCdWZmZXIoYy5FTEVNRU5UX0FSUkFZX0JVRkZFUix0aGlzLl9pbmRleEJ1ZmZlciksYy5idWZmZXJEYXRhKGMuRUxFTUVOVF9BUlJBWV9CVUZGRVIsdGhpcy5pbmRpY2VzLGMuU1RBVElDX0RSQVcpKTooYy5iaW5kQnVmZmVyKGMuQVJSQVlfQlVGRkVSLHRoaXMuX3ZlcnRleEJ1ZmZlciksYy5idWZmZXJTdWJEYXRhKGMuQVJSQVlfQlVGRkVSLDAsdGhpcy52ZXJ0aWNlcyksYy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGYuYVZlcnRleFBvc2l0aW9uLDIsYy5GTE9BVCwhMSwwLDApLGMuYmluZEJ1ZmZlcihjLkFSUkFZX0JVRkZFUix0aGlzLl91dkJ1ZmZlciksYy52ZXJ0ZXhBdHRyaWJQb2ludGVyKGYuYVRleHR1cmVDb29yZCwyLGMuRkxPQVQsITEsMCwwKSxjLmFjdGl2ZVRleHR1cmUoYy5URVhUVVJFMCksdGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlLl9kaXJ0eVtjLmlkXT9hLnJlbmRlcmVyLnVwZGF0ZVRleHR1cmUodGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlKTpjLmJpbmRUZXh0dXJlKGMuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUuYmFzZVRleHR1cmUuX2dsVGV4dHVyZXNbYy5pZF0pLGMuYmluZEJ1ZmZlcihjLkVMRU1FTlRfQVJSQVlfQlVGRkVSLHRoaXMuX2luZGV4QnVmZmVyKSksYy5kcmF3RWxlbWVudHMoZyx0aGlzLmluZGljZXMubGVuZ3RoLGMuVU5TSUdORURfU0hPUlQsMCl9LGIuU3RyaXAucHJvdG90eXBlLl9yZW5kZXJDYW52YXM9ZnVuY3Rpb24oYSl7dmFyIGM9YS5jb250ZXh0LGQ9dGhpcy53b3JsZFRyYW5zZm9ybTthLnJvdW5kUGl4ZWxzP2Muc2V0VHJhbnNmb3JtKGQuYSxkLmIsZC5jLGQuZCwwfGQudHgsMHxkLnR5KTpjLnNldFRyYW5zZm9ybShkLmEsZC5iLGQuYyxkLmQsZC50eCxkLnR5KSx0aGlzLmRyYXdNb2RlPT09Yi5TdHJpcC5EcmF3TW9kZXMuVFJJQU5HTEVfU1RSSVA/dGhpcy5fcmVuZGVyQ2FudmFzVHJpYW5nbGVTdHJpcChjKTp0aGlzLl9yZW5kZXJDYW52YXNUcmlhbmdsZXMoYyl9LGIuU3RyaXAucHJvdG90eXBlLl9yZW5kZXJDYW52YXNUcmlhbmdsZVN0cmlwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmVydGljZXMsYz10aGlzLnV2cyxkPWIubGVuZ3RoLzI7dGhpcy5jb3VudCsrO2Zvcih2YXIgZT0wO2QtMj5lO2UrKyl7dmFyIGY9MiplO3RoaXMuX3JlbmRlckNhbnZhc0RyYXdUcmlhbmdsZShhLGIsYyxmLGYrMixmKzQpfX0sYi5TdHJpcC5wcm90b3R5cGUuX3JlbmRlckNhbnZhc1RyaWFuZ2xlcz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZlcnRpY2VzLGM9dGhpcy51dnMsZD10aGlzLmluZGljZXMsZT1kLmxlbmd0aDt0aGlzLmNvdW50Kys7Zm9yKHZhciBmPTA7ZT5mO2YrPTMpe3ZhciBnPTIqZFtmXSxoPTIqZFtmKzFdLGk9MipkW2YrMl07dGhpcy5fcmVuZGVyQ2FudmFzRHJhd1RyaWFuZ2xlKGEsYixjLGcsaCxpKX19LGIuU3RyaXAucHJvdG90eXBlLl9yZW5kZXJDYW52YXNEcmF3VHJpYW5nbGU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPXRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5zb3VyY2UsaD10aGlzLnRleHR1cmUud2lkdGgsaT10aGlzLnRleHR1cmUuaGVpZ2h0LGo9YltkXSxrPWJbZV0sbD1iW2ZdLG09YltkKzFdLG49YltlKzFdLG89YltmKzFdLHA9Y1tkXSpoLHE9Y1tlXSpoLHI9Y1tmXSpoLHM9Y1tkKzFdKmksdD1jW2UrMV0qaSx1PWNbZisxXSppO2lmKHRoaXMuY2FudmFzUGFkZGluZz4wKXt2YXIgdj10aGlzLmNhbnZhc1BhZGRpbmcvdGhpcy53b3JsZFRyYW5zZm9ybS5hLHc9dGhpcy5jYW52YXNQYWRkaW5nL3RoaXMud29ybGRUcmFuc2Zvcm0uZCx4PShqK2srbCkvMyx5PShtK24rbykvMyx6PWoteCxBPW0teSxCPU1hdGguc3FydCh6KnorQSpBKTtqPXgrei9CKihCK3YpLG09eStBL0IqKEIrdyksej1rLXgsQT1uLXksQj1NYXRoLnNxcnQoeip6K0EqQSksaz14K3ovQiooQit2KSxuPXkrQS9CKihCK3cpLHo9bC14LEE9by15LEI9TWF0aC5zcXJ0KHoqeitBKkEpLGw9eCt6L0IqKEIrdiksbz15K0EvQiooQit3KX1hLnNhdmUoKSxhLmJlZ2luUGF0aCgpLGEubW92ZVRvKGosbSksYS5saW5lVG8oayxuKSxhLmxpbmVUbyhsLG8pLGEuY2xvc2VQYXRoKCksYS5jbGlwKCk7dmFyIEM9cCp0K3MqcitxKnUtdCpyLXMqcS1wKnUsRD1qKnQrcypsK2sqdS10KmwtcyprLWoqdSxFPXAqaytqKnIrcSpsLWsqci1qKnEtcCpsLEY9cCp0KmwrcyprKnIraipxKnUtaip0KnItcypxKmwtcCprKnUsRz1tKnQrcypvK24qdS10Km8tcypuLW0qdSxIPXAqbittKnIrcSpvLW4qci1tKnEtcCpvLEk9cCp0Km8rcypuKnIrbSpxKnUtbSp0KnItcypxKm8tcCpuKnU7YS50cmFuc2Zvcm0oRC9DLEcvQyxFL0MsSC9DLEYvQyxJL0MpLGEuZHJhd0ltYWdlKGcsMCwwKSxhLnJlc3RvcmUoKX0sYi5TdHJpcC5wcm90b3R5cGUucmVuZGVyU3RyaXBGbGF0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29udGV4dCxjPWEudmVydGljZXMsZD1jLmxlbmd0aC8yO3RoaXMuY291bnQrKyxiLmJlZ2luUGF0aCgpO2Zvcih2YXIgZT0xO2QtMj5lO2UrKyl7dmFyIGY9MiplLGc9Y1tmXSxoPWNbZisyXSxpPWNbZis0XSxqPWNbZisxXSxrPWNbZiszXSxsPWNbZis1XTtiLm1vdmVUbyhnLGopLGIubGluZVRvKGgsayksYi5saW5lVG8oaSxsKX1iLmZpbGxTdHlsZT1cIiNGRjAwMDBcIixiLmZpbGwoKSxiLmNsb3NlUGF0aCgpfSxiLlN0cmlwLnByb3RvdHlwZS5vblRleHR1cmVVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZUZyYW1lPSEwfSxiLlN0cmlwLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWF8fHRoaXMud29ybGRUcmFuc2Zvcm0sZD1jLmEsZT1jLmIsZj1jLmMsZz1jLmQsaD1jLnR4LGk9Yy50eSxqPS0xLzAsaz0tMS8wLGw9MS8wLG09MS8wLG49dGhpcy52ZXJ0aWNlcyxvPTAscD1uLmxlbmd0aDtwPm87bys9Mil7dmFyIHE9bltvXSxyPW5bbysxXSxzPWQqcStmKnIraCx0PWcqcitlKnEraTtsPWw+cz9zOmwsbT1tPnQ/dDptLGo9cz5qP3M6aixrPXQ+az90Omt9aWYobD09PS0xLzB8fDEvMD09PWspcmV0dXJuIGIuRW1wdHlSZWN0YW5nbGU7dmFyIHU9dGhpcy5fYm91bmRzO3JldHVybiB1Lng9bCx1LndpZHRoPWotbCx1Lnk9bSx1LmhlaWdodD1rLW0sdGhpcy5fY3VycmVudEJvdW5kcz11LHV9LGIuU3RyaXAuRHJhd01vZGVzPXtUUklBTkdMRV9TVFJJUDowLFRSSUFOR0xFUzoxfSxiLlJvcGU9ZnVuY3Rpb24oYSxjKXtiLlN0cmlwLmNhbGwodGhpcyxhKSx0aGlzLnBvaW50cz1jLHRoaXMudmVydGljZXM9bmV3IGIuRmxvYXQzMkFycmF5KDQqYy5sZW5ndGgpLHRoaXMudXZzPW5ldyBiLkZsb2F0MzJBcnJheSg0KmMubGVuZ3RoKSx0aGlzLmNvbG9ycz1uZXcgYi5GbG9hdDMyQXJyYXkoMipjLmxlbmd0aCksdGhpcy5pbmRpY2VzPW5ldyBiLlVpbnQxNkFycmF5KDIqYy5sZW5ndGgpLHRoaXMucmVmcmVzaCgpfSxiLlJvcGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5TdHJpcC5wcm90b3R5cGUpLGIuUm9wZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5Sb3BlLGIuUm9wZS5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucG9pbnRzO2lmKCEoYS5sZW5ndGg8MSkpe3ZhciBiPXRoaXMudXZzLGM9YVswXSxkPXRoaXMuaW5kaWNlcyxlPXRoaXMuY29sb3JzO3RoaXMuY291bnQtPS4yLGJbMF09MCxiWzFdPTAsYlsyXT0wLGJbM109MSxlWzBdPTEsZVsxXT0xLGRbMF09MCxkWzFdPTE7Zm9yKHZhciBmLGcsaCxpPWEubGVuZ3RoLGo9MTtpPmo7aisrKWY9YVtqXSxnPTQqaixoPWovKGktMSksaiUyPyhiW2ddPWgsYltnKzFdPTAsYltnKzJdPWgsYltnKzNdPTEpOihiW2ddPWgsYltnKzFdPTAsYltnKzJdPWgsYltnKzNdPTEpLGc9MipqLGVbZ109MSxlW2crMV09MSxnPTIqaixkW2ddPWcsZFtnKzFdPWcrMSxjPWZ9fSxiLlJvcGUucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucG9pbnRzO2lmKCEoYS5sZW5ndGg8MSkpe3ZhciBjLGQ9YVswXSxlPXt4OjAseTowfTt0aGlzLmNvdW50LT0uMjtmb3IodmFyIGYsZyxoLGksaixrPXRoaXMudmVydGljZXMsbD1hLmxlbmd0aCxtPTA7bD5tO20rKylmPWFbbV0sZz00Km0sYz1tPGEubGVuZ3RoLTE/YVttKzFdOmYsZS55PS0oYy54LWQueCksZS54PWMueS1kLnksaD0xMCooMS1tLyhsLTEpKSxoPjEmJihoPTEpLGk9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSksaj10aGlzLnRleHR1cmUuaGVpZ2h0LzIsZS54Lz1pLGUueS89aSxlLngqPWosZS55Kj1qLGtbZ109Zi54K2UueCxrW2crMV09Zi55K2UueSxrW2crMl09Zi54LWUueCxrW2crM109Zi55LWUueSxkPWY7Yi5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm0uY2FsbCh0aGlzKX19LGIuUm9wZS5wcm90b3R5cGUuc2V0VGV4dHVyZT1mdW5jdGlvbihhKXt0aGlzLnRleHR1cmU9YX0sYi5UaWxpbmdTcHJpdGU9ZnVuY3Rpb24oYSxjLGQpe2IuU3ByaXRlLmNhbGwodGhpcyxhKSx0aGlzLl93aWR0aD1jfHwxMDAsdGhpcy5faGVpZ2h0PWR8fDEwMCx0aGlzLnRpbGVTY2FsZT1uZXcgYi5Qb2ludCgxLDEpLHRoaXMudGlsZVNjYWxlT2Zmc2V0PW5ldyBiLlBvaW50KDEsMSksdGhpcy50aWxlUG9zaXRpb249bmV3IGIuUG9pbnQoMCwwKSx0aGlzLnJlbmRlcmFibGU9ITAsdGhpcy50aW50PTE2Nzc3MjE1LHRoaXMuYmxlbmRNb2RlPWIuYmxlbmRNb2Rlcy5OT1JNQUx9LGIuVGlsaW5nU3ByaXRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuU3ByaXRlLnByb3RvdHlwZSksYi5UaWxpbmdTcHJpdGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuVGlsaW5nU3ByaXRlLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLlRpbGluZ1Nwcml0ZS5wcm90b3R5cGUsXCJ3aWR0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9LHNldDpmdW5jdGlvbihhKXt0aGlzLl93aWR0aD1hfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLlRpbGluZ1Nwcml0ZS5wcm90b3R5cGUsXCJoZWlnaHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlaWdodH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX2hlaWdodD1hfX0pLGIuVGlsaW5nU3ByaXRlLnByb3RvdHlwZS5zZXRUZXh0dXJlPWZ1bmN0aW9uKGEpe3RoaXMudGV4dHVyZSE9PWEmJih0aGlzLnRleHR1cmU9YSx0aGlzLnJlZnJlc2hUZXh0dXJlPSEwLHRoaXMuY2FjaGVkVGludD0xNjc3NzIxNSl9LGIuVGlsaW5nU3ByaXRlLnByb3RvdHlwZS5fcmVuZGVyV2ViR0w9ZnVuY3Rpb24oYSl7aWYodGhpcy52aXNpYmxlIT09ITEmJjAhPT10aGlzLmFscGhhKXt2YXIgYixjO2Zvcih0aGlzLl9tYXNrJiYoYS5zcHJpdGVCYXRjaC5zdG9wKCksYS5tYXNrTWFuYWdlci5wdXNoTWFzayh0aGlzLm1hc2ssYSksYS5zcHJpdGVCYXRjaC5zdGFydCgpKSx0aGlzLl9maWx0ZXJzJiYoYS5zcHJpdGVCYXRjaC5mbHVzaCgpLGEuZmlsdGVyTWFuYWdlci5wdXNoRmlsdGVyKHRoaXMuX2ZpbHRlckJsb2NrKSksIXRoaXMudGlsaW5nVGV4dHVyZXx8dGhpcy5yZWZyZXNoVGV4dHVyZT8odGhpcy5nZW5lcmF0ZVRpbGluZ1RleHR1cmUoITApLHRoaXMudGlsaW5nVGV4dHVyZSYmdGhpcy50aWxpbmdUZXh0dXJlLm5lZWRzVXBkYXRlJiYoYS5yZW5kZXJlci51cGRhdGVUZXh0dXJlKHRoaXMudGlsaW5nVGV4dHVyZS5iYXNlVGV4dHVyZSksdGhpcy50aWxpbmdUZXh0dXJlLm5lZWRzVXBkYXRlPSExKSk6YS5zcHJpdGVCYXRjaC5yZW5kZXJUaWxpbmdTcHJpdGUodGhpcyksYj0wLGM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7Yz5iO2IrKyl0aGlzLmNoaWxkcmVuW2JdLl9yZW5kZXJXZWJHTChhKTthLnNwcml0ZUJhdGNoLnN0b3AoKSx0aGlzLl9maWx0ZXJzJiZhLmZpbHRlck1hbmFnZXIucG9wRmlsdGVyKCksdGhpcy5fbWFzayYmYS5tYXNrTWFuYWdlci5wb3BNYXNrKHRoaXMuX21hc2ssYSksYS5zcHJpdGVCYXRjaC5zdGFydCgpfX0sYi5UaWxpbmdTcHJpdGUucHJvdG90eXBlLl9yZW5kZXJDYW52YXM9ZnVuY3Rpb24oYSl7aWYodGhpcy52aXNpYmxlIT09ITEmJjAhPT10aGlzLmFscGhhKXt2YXIgYz1hLmNvbnRleHQ7dGhpcy5fbWFzayYmYS5tYXNrTWFuYWdlci5wdXNoTWFzayh0aGlzLl9tYXNrLGMpLGMuZ2xvYmFsQWxwaGE9dGhpcy53b3JsZEFscGhhO3ZhciBkLGUsZj10aGlzLndvcmxkVHJhbnNmb3JtLGc9YS5yZXNvbHV0aW9uO2lmKGMuc2V0VHJhbnNmb3JtKGYuYSpnLGYuYipnLGYuYypnLGYuZCpnLGYudHgqZyxmLnR5KmcpLCF0aGlzLl9fdGlsZVBhdHRlcm58fHRoaXMucmVmcmVzaFRleHR1cmUpe2lmKHRoaXMuZ2VuZXJhdGVUaWxpbmdUZXh0dXJlKCExKSwhdGhpcy50aWxpbmdUZXh0dXJlKXJldHVybjt0aGlzLl9fdGlsZVBhdHRlcm49Yy5jcmVhdGVQYXR0ZXJuKHRoaXMudGlsaW5nVGV4dHVyZS5iYXNlVGV4dHVyZS5zb3VyY2UsXCJyZXBlYXRcIil9dGhpcy5ibGVuZE1vZGUhPT1hLmN1cnJlbnRCbGVuZE1vZGUmJihhLmN1cnJlbnRCbGVuZE1vZGU9dGhpcy5ibGVuZE1vZGUsYy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Yi5ibGVuZE1vZGVzQ2FudmFzW2EuY3VycmVudEJsZW5kTW9kZV0pO3ZhciBoPXRoaXMudGlsZVBvc2l0aW9uLGk9dGhpcy50aWxlU2NhbGU7Zm9yKGgueCU9dGhpcy50aWxpbmdUZXh0dXJlLmJhc2VUZXh0dXJlLndpZHRoLGgueSU9dGhpcy50aWxpbmdUZXh0dXJlLmJhc2VUZXh0dXJlLmhlaWdodCxjLnNjYWxlKGkueCxpLnkpLGMudHJhbnNsYXRlKGgueCt0aGlzLmFuY2hvci54Ki10aGlzLl93aWR0aCxoLnkrdGhpcy5hbmNob3IueSotdGhpcy5faGVpZ2h0KSxjLmZpbGxTdHlsZT10aGlzLl9fdGlsZVBhdHRlcm4sYy5maWxsUmVjdCgtaC54LC1oLnksdGhpcy5fd2lkdGgvaS54LHRoaXMuX2hlaWdodC9pLnkpLGMuc2NhbGUoMS9pLngsMS9pLnkpLGMudHJhbnNsYXRlKC1oLngrdGhpcy5hbmNob3IueCp0aGlzLl93aWR0aCwtaC55K3RoaXMuYW5jaG9yLnkqdGhpcy5faGVpZ2h0KSx0aGlzLl9tYXNrJiZhLm1hc2tNYW5hZ2VyLnBvcE1hc2soYS5jb250ZXh0KSxkPTAsZT10aGlzLmNoaWxkcmVuLmxlbmd0aDtlPmQ7ZCsrKXRoaXMuY2hpbGRyZW5bZF0uX3JlbmRlckNhbnZhcyhhKVxufX0sYi5UaWxpbmdTcHJpdGUucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuX3dpZHRoLGI9dGhpcy5faGVpZ2h0LGM9YSooMS10aGlzLmFuY2hvci54KSxkPWEqLXRoaXMuYW5jaG9yLngsZT1iKigxLXRoaXMuYW5jaG9yLnkpLGY9YiotdGhpcy5hbmNob3IueSxnPXRoaXMud29ybGRUcmFuc2Zvcm0saD1nLmEsaT1nLmIsaj1nLmMsaz1nLmQsbD1nLnR4LG09Zy50eSxuPWgqZCtqKmYrbCxvPWsqZitpKmQrbSxwPWgqYytqKmYrbCxxPWsqZitpKmMrbSxyPWgqYytqKmUrbCxzPWsqZStpKmMrbSx0PWgqZCtqKmUrbCx1PWsqZStpKmQrbSx2PS0xLzAsdz0tMS8wLHg9MS8wLHk9MS8wO3g9eD5uP246eCx4PXg+cD9wOngseD14PnI/cjp4LHg9eD50P3Q6eCx5PXk+bz9vOnkseT15PnE/cTp5LHk9eT5zP3M6eSx5PXk+dT91Onksdj1uPnY/bjp2LHY9cD52P3A6dix2PXI+dj9yOnYsdj10PnY/dDp2LHc9bz53P286dyx3PXE+dz9xOncsdz1zPnc/czp3LHc9dT53P3U6dzt2YXIgej10aGlzLl9ib3VuZHM7cmV0dXJuIHoueD14LHoud2lkdGg9di14LHoueT15LHouaGVpZ2h0PXcteSx0aGlzLl9jdXJyZW50Qm91bmRzPXosen0sYi5UaWxpbmdTcHJpdGUucHJvdG90eXBlLm9uVGV4dHVyZVVwZGF0ZT1mdW5jdGlvbigpe30sYi5UaWxpbmdTcHJpdGUucHJvdG90eXBlLmdlbmVyYXRlVGlsaW5nVGV4dHVyZT1mdW5jdGlvbihhKXtpZih0aGlzLnRleHR1cmUuYmFzZVRleHR1cmUuaGFzTG9hZGVkKXt2YXIgYyxkLGU9dGhpcy5vcmlnaW5hbFRleHR1cmV8fHRoaXMudGV4dHVyZSxmPWUuZnJhbWUsZz1mLndpZHRoIT09ZS5iYXNlVGV4dHVyZS53aWR0aHx8Zi5oZWlnaHQhPT1lLmJhc2VUZXh0dXJlLmhlaWdodCxoPSExO2lmKGE/KGM9Yi5nZXROZXh0UG93ZXJPZlR3byhmLndpZHRoKSxkPWIuZ2V0TmV4dFBvd2VyT2ZUd28oZi5oZWlnaHQpLChmLndpZHRoIT09Y3x8Zi5oZWlnaHQhPT1kfHxlLmJhc2VUZXh0dXJlLndpZHRoIT09Y3x8ZS5iYXNlVGV4dHVyZS5oZWlnaHR8fGQpJiYoaD0hMCkpOmcmJihjPWYud2lkdGgsZD1mLmhlaWdodCxoPSEwKSxoKXt2YXIgaTt0aGlzLnRpbGluZ1RleHR1cmUmJnRoaXMudGlsaW5nVGV4dHVyZS5pc1RpbGluZz8oaT10aGlzLnRpbGluZ1RleHR1cmUuY2FudmFzQnVmZmVyLGkucmVzaXplKGMsZCksdGhpcy50aWxpbmdUZXh0dXJlLmJhc2VUZXh0dXJlLndpZHRoPWMsdGhpcy50aWxpbmdUZXh0dXJlLmJhc2VUZXh0dXJlLmhlaWdodD1kLHRoaXMudGlsaW5nVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCk6KGk9bmV3IGIuQ2FudmFzQnVmZmVyKGMsZCksdGhpcy50aWxpbmdUZXh0dXJlPWIuVGV4dHVyZS5mcm9tQ2FudmFzKGkuY2FudmFzKSx0aGlzLnRpbGluZ1RleHR1cmUuY2FudmFzQnVmZmVyPWksdGhpcy50aWxpbmdUZXh0dXJlLmlzVGlsaW5nPSEwKSxpLmNvbnRleHQuZHJhd0ltYWdlKGUuYmFzZVRleHR1cmUuc291cmNlLGUuY3JvcC54LGUuY3JvcC55LGUuY3JvcC53aWR0aCxlLmNyb3AuaGVpZ2h0LDAsMCxjLGQpLHRoaXMudGlsZVNjYWxlT2Zmc2V0Lng9Zi53aWR0aC9jLHRoaXMudGlsZVNjYWxlT2Zmc2V0Lnk9Zi5oZWlnaHQvZH1lbHNlIHRoaXMudGlsaW5nVGV4dHVyZSYmdGhpcy50aWxpbmdUZXh0dXJlLmlzVGlsaW5nJiZ0aGlzLnRpbGluZ1RleHR1cmUuZGVzdHJveSghMCksdGhpcy50aWxlU2NhbGVPZmZzZXQueD0xLHRoaXMudGlsZVNjYWxlT2Zmc2V0Lnk9MSx0aGlzLnRpbGluZ1RleHR1cmU9ZTt0aGlzLnJlZnJlc2hUZXh0dXJlPSExLHRoaXMub3JpZ2luYWxUZXh0dXJlPXRoaXMudGV4dHVyZSx0aGlzLnRleHR1cmU9dGhpcy50aWxpbmdUZXh0dXJlLHRoaXMudGlsaW5nVGV4dHVyZS5iYXNlVGV4dHVyZS5fcG93ZXJPZjI9ITB9fTt2YXIgYz17cmFkRGVnOjE4MC9NYXRoLlBJLGRlZ1JhZDpNYXRoLlBJLzE4MCx0ZW1wOltdLEZsb2F0MzJBcnJheTpcInVuZGVmaW5lZFwiPT10eXBlb2YgRmxvYXQzMkFycmF5P0FycmF5OkZsb2F0MzJBcnJheSxVaW50MTZBcnJheTpcInVuZGVmaW5lZFwiPT10eXBlb2YgVWludDE2QXJyYXk/QXJyYXk6VWludDE2QXJyYXl9O2MuQm9uZURhdGE9ZnVuY3Rpb24oYSxiKXt0aGlzLm5hbWU9YSx0aGlzLnBhcmVudD1ifSxjLkJvbmVEYXRhLnByb3RvdHlwZT17bGVuZ3RoOjAseDowLHk6MCxyb3RhdGlvbjowLHNjYWxlWDoxLHNjYWxlWToxLGluaGVyaXRTY2FsZTohMCxpbmhlcml0Um90YXRpb246ITAsZmxpcFg6ITEsZmxpcFk6ITF9LGMuU2xvdERhdGE9ZnVuY3Rpb24oYSxiKXt0aGlzLm5hbWU9YSx0aGlzLmJvbmVEYXRhPWJ9LGMuU2xvdERhdGEucHJvdG90eXBlPXtyOjEsZzoxLGI6MSxhOjEsYXR0YWNobWVudE5hbWU6bnVsbCxhZGRpdGl2ZUJsZW5kaW5nOiExfSxjLklrQ29uc3RyYWludERhdGE9ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEsdGhpcy5ib25lcz1bXX0sYy5Ja0NvbnN0cmFpbnREYXRhLnByb3RvdHlwZT17dGFyZ2V0Om51bGwsYmVuZERpcmVjdGlvbjoxLG1peDoxfSxjLkJvbmU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZGF0YT1hLHRoaXMuc2tlbGV0b249Yix0aGlzLnBhcmVudD1jLHRoaXMuc2V0VG9TZXR1cFBvc2UoKX0sYy5Cb25lLnlEb3duPSExLGMuQm9uZS5wcm90b3R5cGU9e3g6MCx5OjAscm90YXRpb246MCxyb3RhdGlvbklLOjAsc2NhbGVYOjEsc2NhbGVZOjEsZmxpcFg6ITEsZmxpcFk6ITEsbTAwOjAsbTAxOjAsd29ybGRYOjAsbTEwOjAsbTExOjAsd29ybGRZOjAsd29ybGRSb3RhdGlvbjowLHdvcmxkU2NhbGVYOjEsd29ybGRTY2FsZVk6MSx3b3JsZEZsaXBYOiExLHdvcmxkRmxpcFk6ITEsdXBkYXRlV29ybGRUcmFuc2Zvcm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhcmVudDtpZihhKXRoaXMud29ybGRYPXRoaXMueCphLm0wMCt0aGlzLnkqYS5tMDErYS53b3JsZFgsdGhpcy53b3JsZFk9dGhpcy54KmEubTEwK3RoaXMueSphLm0xMSthLndvcmxkWSx0aGlzLmRhdGEuaW5oZXJpdFNjYWxlPyh0aGlzLndvcmxkU2NhbGVYPWEud29ybGRTY2FsZVgqdGhpcy5zY2FsZVgsdGhpcy53b3JsZFNjYWxlWT1hLndvcmxkU2NhbGVZKnRoaXMuc2NhbGVZKToodGhpcy53b3JsZFNjYWxlWD10aGlzLnNjYWxlWCx0aGlzLndvcmxkU2NhbGVZPXRoaXMuc2NhbGVZKSx0aGlzLndvcmxkUm90YXRpb249dGhpcy5kYXRhLmluaGVyaXRSb3RhdGlvbj9hLndvcmxkUm90YXRpb24rdGhpcy5yb3RhdGlvbklLOnRoaXMucm90YXRpb25JSyx0aGlzLndvcmxkRmxpcFg9YS53b3JsZEZsaXBYIT10aGlzLmZsaXBYLHRoaXMud29ybGRGbGlwWT1hLndvcmxkRmxpcFkhPXRoaXMuZmxpcFk7ZWxzZXt2YXIgYj10aGlzLnNrZWxldG9uLmZsaXBYLGQ9dGhpcy5za2VsZXRvbi5mbGlwWTt0aGlzLndvcmxkWD1iPy10aGlzLng6dGhpcy54LHRoaXMud29ybGRZPWQhPWMuQm9uZS55RG93bj8tdGhpcy55OnRoaXMueSx0aGlzLndvcmxkU2NhbGVYPXRoaXMuc2NhbGVYLHRoaXMud29ybGRTY2FsZVk9dGhpcy5zY2FsZVksdGhpcy53b3JsZFJvdGF0aW9uPXRoaXMucm90YXRpb25JSyx0aGlzLndvcmxkRmxpcFg9YiE9dGhpcy5mbGlwWCx0aGlzLndvcmxkRmxpcFk9ZCE9dGhpcy5mbGlwWX12YXIgZT10aGlzLndvcmxkUm90YXRpb24qYy5kZWdSYWQsZj1NYXRoLmNvcyhlKSxnPU1hdGguc2luKGUpO3RoaXMud29ybGRGbGlwWD8odGhpcy5tMDA9LWYqdGhpcy53b3JsZFNjYWxlWCx0aGlzLm0wMT1nKnRoaXMud29ybGRTY2FsZVkpOih0aGlzLm0wMD1mKnRoaXMud29ybGRTY2FsZVgsdGhpcy5tMDE9LWcqdGhpcy53b3JsZFNjYWxlWSksdGhpcy53b3JsZEZsaXBZIT1jLkJvbmUueURvd24/KHRoaXMubTEwPS1nKnRoaXMud29ybGRTY2FsZVgsdGhpcy5tMTE9LWYqdGhpcy53b3JsZFNjYWxlWSk6KHRoaXMubTEwPWcqdGhpcy53b3JsZFNjYWxlWCx0aGlzLm0xMT1mKnRoaXMud29ybGRTY2FsZVkpfSxzZXRUb1NldHVwUG9zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZGF0YTt0aGlzLng9YS54LHRoaXMueT1hLnksdGhpcy5yb3RhdGlvbj1hLnJvdGF0aW9uLHRoaXMucm90YXRpb25JSz10aGlzLnJvdGF0aW9uLHRoaXMuc2NhbGVYPWEuc2NhbGVYLHRoaXMuc2NhbGVZPWEuc2NhbGVZLHRoaXMuZmxpcFg9YS5mbGlwWCx0aGlzLmZsaXBZPWEuZmxpcFl9LHdvcmxkVG9Mb2NhbDpmdW5jdGlvbihhKXt2YXIgYj1hWzBdLXRoaXMud29ybGRYLGQ9YVsxXS10aGlzLndvcmxkWSxlPXRoaXMubTAwLGY9dGhpcy5tMTAsZz10aGlzLm0wMSxoPXRoaXMubTExO3RoaXMud29ybGRGbGlwWCE9KHRoaXMud29ybGRGbGlwWSE9Yy5Cb25lLnlEb3duKSYmKGU9LWUsaD0taCk7dmFyIGk9MS8oZSpoLWcqZik7YVswXT1iKmUqaS1kKmcqaSxhWzFdPWQqaCppLWIqZippfSxsb2NhbFRvV29ybGQ6ZnVuY3Rpb24oYSl7dmFyIGI9YVswXSxjPWFbMV07YVswXT1iKnRoaXMubTAwK2MqdGhpcy5tMDErdGhpcy53b3JsZFgsYVsxXT1iKnRoaXMubTEwK2MqdGhpcy5tMTErdGhpcy53b3JsZFl9fSxjLlNsb3Q9ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGE9YSx0aGlzLmJvbmU9Yix0aGlzLnNldFRvU2V0dXBQb3NlKCl9LGMuU2xvdC5wcm90b3R5cGU9e3I6MSxnOjEsYjoxLGE6MSxfYXR0YWNobWVudFRpbWU6MCxhdHRhY2htZW50Om51bGwsYXR0YWNobWVudFZlcnRpY2VzOltdLHNldEF0dGFjaG1lbnQ6ZnVuY3Rpb24oYSl7dGhpcy5hdHRhY2htZW50PWEsdGhpcy5fYXR0YWNobWVudFRpbWU9dGhpcy5ib25lLnNrZWxldG9uLnRpbWUsdGhpcy5hdHRhY2htZW50VmVydGljZXMubGVuZ3RoPTB9LHNldEF0dGFjaG1lbnRUaW1lOmZ1bmN0aW9uKGEpe3RoaXMuX2F0dGFjaG1lbnRUaW1lPXRoaXMuYm9uZS5za2VsZXRvbi50aW1lLWF9LGdldEF0dGFjaG1lbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYm9uZS5za2VsZXRvbi50aW1lLXRoaXMuX2F0dGFjaG1lbnRUaW1lfSxzZXRUb1NldHVwUG9zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZGF0YTt0aGlzLnI9YS5yLHRoaXMuZz1hLmcsdGhpcy5iPWEuYix0aGlzLmE9YS5hO2Zvcih2YXIgYj10aGlzLmJvbmUuc2tlbGV0b24uZGF0YS5zbG90cyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWlmKGJbY109PWEpe3RoaXMuc2V0QXR0YWNobWVudChhLmF0dGFjaG1lbnROYW1lP3RoaXMuYm9uZS5za2VsZXRvbi5nZXRBdHRhY2htZW50QnlTbG90SW5kZXgoYyxhLmF0dGFjaG1lbnROYW1lKTpudWxsKTticmVha319fSxjLklrQ29uc3RyYWludD1mdW5jdGlvbihhLGIpe3RoaXMuZGF0YT1hLHRoaXMubWl4PWEubWl4LHRoaXMuYmVuZERpcmVjdGlvbj1hLmJlbmREaXJlY3Rpb24sdGhpcy5ib25lcz1bXTtmb3IodmFyIGM9MCxkPWEuYm9uZXMubGVuZ3RoO2Q+YztjKyspdGhpcy5ib25lcy5wdXNoKGIuZmluZEJvbmUoYS5ib25lc1tjXS5uYW1lKSk7dGhpcy50YXJnZXQ9Yi5maW5kQm9uZShhLnRhcmdldC5uYW1lKX0sYy5Ja0NvbnN0cmFpbnQucHJvdG90eXBlPXthcHBseTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGFyZ2V0LGI9dGhpcy5ib25lcztzd2l0Y2goYi5sZW5ndGgpe2Nhc2UgMTpjLklrQ29uc3RyYWludC5hcHBseTEoYlswXSxhLndvcmxkWCxhLndvcmxkWSx0aGlzLm1peCk7YnJlYWs7Y2FzZSAyOmMuSWtDb25zdHJhaW50LmFwcGx5MihiWzBdLGJbMV0sYS53b3JsZFgsYS53b3JsZFksdGhpcy5iZW5kRGlyZWN0aW9uLHRoaXMubWl4KX19fSxjLklrQ29uc3RyYWludC5hcHBseTE9ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGY9YS5kYXRhLmluaGVyaXRSb3RhdGlvbiYmYS5wYXJlbnQ/YS5wYXJlbnQud29ybGRSb3RhdGlvbjowLGc9YS5yb3RhdGlvbixoPU1hdGguYXRhbjIoZC1hLndvcmxkWSxiLWEud29ybGRYKSpjLnJhZERlZy1mO2Eucm90YXRpb25JSz1nKyhoLWcpKmV9LGMuSWtDb25zdHJhaW50LmFwcGx5Mj1mdW5jdGlvbihhLGIsZCxlLGYsZyl7dmFyIGg9Yi5yb3RhdGlvbixpPWEucm90YXRpb247aWYoIWcpcmV0dXJuIGIucm90YXRpb25JSz1oLHZvaWQoYS5yb3RhdGlvbklLPWkpO3ZhciBqLGssbD1jLnRlbXAsbT1hLnBhcmVudDttPyhsWzBdPWQsbFsxXT1lLG0ud29ybGRUb0xvY2FsKGwpLGQ9KGxbMF0tYS54KSptLndvcmxkU2NhbGVYLGU9KGxbMV0tYS55KSptLndvcmxkU2NhbGVZKTooZC09YS54LGUtPWEueSksYi5wYXJlbnQ9PWE/KGo9Yi54LGs9Yi55KToobFswXT1iLngsbFsxXT1iLnksYi5wYXJlbnQubG9jYWxUb1dvcmxkKGwpLGEud29ybGRUb0xvY2FsKGwpLGo9bFswXSxrPWxbMV0pO3ZhciBuPWoqYS53b3JsZFNjYWxlWCxvPWsqYS53b3JsZFNjYWxlWSxwPU1hdGguYXRhbjIobyxuKSxxPU1hdGguc3FydChuKm4rbypvKSxyPWIuZGF0YS5sZW5ndGgqYi53b3JsZFNjYWxlWCxzPTIqcSpyO2lmKDFlLTQ+cylyZXR1cm4gdm9pZChiLnJvdGF0aW9uSUs9aCsoTWF0aC5hdGFuMihlLGQpKmMucmFkRGVnLWktaCkqZyk7dmFyIHQ9KGQqZCtlKmUtcSpxLXIqcikvczstMT50P3Q9LTE6dD4xJiYodD0xKTt2YXIgdT1NYXRoLmFjb3ModCkqZix2PXErcip0LHc9cipNYXRoLnNpbih1KSx4PU1hdGguYXRhbjIoZSp2LWQqdyxkKnYrZSp3KSx5PSh4LXApKmMucmFkRGVnLWk7eT4xODA/eS09MzYwOi0xODA+eSYmKHkrPTM2MCksYS5yb3RhdGlvbklLPWkreSpnLHk9KHUrcCkqYy5yYWREZWctaCx5PjE4MD95LT0zNjA6LTE4MD55JiYoeSs9MzYwKSxiLnJvdGF0aW9uSUs9aCsoeSthLndvcmxkUm90YXRpb24tYi5wYXJlbnQud29ybGRSb3RhdGlvbikqZ30sYy5Ta2luPWZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLHRoaXMuYXR0YWNobWVudHM9e319LGMuU2tpbi5wcm90b3R5cGU9e2FkZEF0dGFjaG1lbnQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYXR0YWNobWVudHNbYStcIjpcIitiXT1jfSxnZXRBdHRhY2htZW50OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYXR0YWNobWVudHNbYStcIjpcIitiXX0sX2F0dGFjaEFsbDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBiLmF0dGFjaG1lbnRzKXt2YXIgZD1jLmluZGV4T2YoXCI6XCIpLGU9cGFyc2VJbnQoYy5zdWJzdHJpbmcoMCxkKSksZj1jLnN1YnN0cmluZyhkKzEpLGc9YS5zbG90c1tlXTtpZihnLmF0dGFjaG1lbnQmJmcuYXR0YWNobWVudC5uYW1lPT1mKXt2YXIgaD10aGlzLmdldEF0dGFjaG1lbnQoZSxmKTtoJiZnLnNldEF0dGFjaG1lbnQoaCl9fX19LGMuQW5pbWF0aW9uPWZ1bmN0aW9uKGEsYixjKXt0aGlzLm5hbWU9YSx0aGlzLnRpbWVsaW5lcz1iLHRoaXMuZHVyYXRpb249Y30sYy5BbmltYXRpb24ucHJvdG90eXBlPXthcHBseTpmdW5jdGlvbihhLGIsYyxkLGUpe2QmJjAhPXRoaXMuZHVyYXRpb24mJihjJT10aGlzLmR1cmF0aW9uLGIlPXRoaXMuZHVyYXRpb24pO2Zvcih2YXIgZj10aGlzLnRpbWVsaW5lcyxnPTAsaD1mLmxlbmd0aDtoPmc7ZysrKWZbZ10uYXBwbHkoYSxiLGMsZSwxKX0sbWl4OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtkJiYwIT10aGlzLmR1cmF0aW9uJiYoYyU9dGhpcy5kdXJhdGlvbixiJT10aGlzLmR1cmF0aW9uKTtmb3IodmFyIGc9dGhpcy50aW1lbGluZXMsaD0wLGk9Zy5sZW5ndGg7aT5oO2grKylnW2hdLmFwcGx5KGEsYixjLGUsZil9fSxjLkFuaW1hdGlvbi5iaW5hcnlTZWFyY2g9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTAsZT1NYXRoLmZsb29yKGEubGVuZ3RoL2MpLTI7aWYoIWUpcmV0dXJuIGM7Zm9yKHZhciBmPWU+Pj4xOzspe2lmKGFbKGYrMSkqY108PWI/ZD1mKzE6ZT1mLGQ9PWUpcmV0dXJuKGQrMSkqYztmPWQrZT4+PjF9fSxjLkFuaW1hdGlvbi5iaW5hcnlTZWFyY2gxPWZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkPWEubGVuZ3RoLTI7aWYoIWQpcmV0dXJuIDE7Zm9yKHZhciBlPWQ+Pj4xOzspe2lmKGFbZSsxXTw9Yj9jPWUrMTpkPWUsYz09ZClyZXR1cm4gYysxO2U9YytkPj4+MX19LGMuQW5pbWF0aW9uLmxpbmVhclNlYXJjaD1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aC1jO2U+PWQ7ZCs9YylpZihhW2RdPmIpcmV0dXJuIGQ7cmV0dXJuLTF9LGMuQ3VydmVzPWZ1bmN0aW9uKCl7dGhpcy5jdXJ2ZXM9W119LGMuQ3VydmVzLnByb3RvdHlwZT17c2V0TGluZWFyOmZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzWzE5KmFdPTB9LHNldFN0ZXBwZWQ6ZnVuY3Rpb24oYSl7dGhpcy5jdXJ2ZXNbMTkqYV09MX0sc2V0Q3VydmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0uMSxnPWYqZixoPWcqZixpPTMqZixqPTMqZyxrPTYqZyxsPTYqaCxtPTIqLWIrZCxuPTIqLWMrZSxvPTMqKGItZCkrMSxwPTMqKGMtZSkrMSxxPWIqaSttKmorbypoLHI9YyppK24qaitwKmgscz1tKmsrbypsLHQ9biprK3AqbCx1PW8qbCx2PXAqbCx3PTE5KmEseD10aGlzLmN1cnZlczt4W3crK109Mjtmb3IodmFyIHk9cSx6PXIsQT13KzE5LTE7QT53O3crPTIpeFt3XT15LHhbdysxXT16LHErPXMscis9dCxzKz11LHQrPXYseSs9cSx6Kz1yfSxnZXRDdXJ2ZVBlcmNlbnQ6ZnVuY3Rpb24oYSxiKXtiPTA+Yj8wOmI+MT8xOmI7dmFyIGM9dGhpcy5jdXJ2ZXMsZD0xOSphLGU9Y1tkXTtpZigwPT09ZSlyZXR1cm4gYjtpZigxPT1lKXJldHVybiAwO2QrKztmb3IodmFyIGY9MCxnPWQsaD1kKzE5LTE7aD5kO2QrPTIpaWYoZj1jW2RdLGY+PWIpe3ZhciBpLGo7cmV0dXJuIGQ9PWc/KGk9MCxqPTApOihpPWNbZC0yXSxqPWNbZC0xXSksaisoY1tkKzFdLWopKihiLWkpLyhmLWkpfXZhciBrPWNbZC0xXTtyZXR1cm4gaysoMS1rKSooYi1mKS8oMS1mKX19LGMuUm90YXRlVGltZWxpbmU9ZnVuY3Rpb24oYSl7dGhpcy5jdXJ2ZXM9bmV3IGMuQ3VydmVzKGEpLHRoaXMuZnJhbWVzPVtdLHRoaXMuZnJhbWVzLmxlbmd0aD0yKmF9LGMuUm90YXRlVGltZWxpbmUucHJvdG90eXBlPXtib25lSW5kZXg6MCxnZXRGcmFtZUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aC8yfSxzZXRGcmFtZTpmdW5jdGlvbihhLGIsYyl7YSo9Mix0aGlzLmZyYW1lc1thXT1iLHRoaXMuZnJhbWVzW2ErMV09Y30sYXBwbHk6ZnVuY3Rpb24oYSxiLGQsZSxmKXt2YXIgZz10aGlzLmZyYW1lcztpZighKGQ8Z1swXSkpe3ZhciBoPWEuYm9uZXNbdGhpcy5ib25lSW5kZXhdO2lmKGQ+PWdbZy5sZW5ndGgtMl0pe2Zvcih2YXIgaT1oLmRhdGEucm90YXRpb24rZ1tnLmxlbmd0aC0xXS1oLnJvdGF0aW9uO2k+MTgwOylpLT0zNjA7Zm9yKDstMTgwPmk7KWkrPTM2MDtyZXR1cm4gdm9pZChoLnJvdGF0aW9uKz1pKmYpfXZhciBqPWMuQW5pbWF0aW9uLmJpbmFyeVNlYXJjaChnLGQsMiksaz1nW2otMV0sbD1nW2pdLG09MS0oZC1sKS8oZ1tqLTJdLWwpO209dGhpcy5jdXJ2ZXMuZ2V0Q3VydmVQZXJjZW50KGovMi0xLG0pO2Zvcih2YXIgaT1nW2orMV0taztpPjE4MDspaS09MzYwO2Zvcig7LTE4MD5pOylpKz0zNjA7Zm9yKGk9aC5kYXRhLnJvdGF0aW9uKyhrK2kqbSktaC5yb3RhdGlvbjtpPjE4MDspaS09MzYwO2Zvcig7LTE4MD5pOylpKz0zNjA7aC5yb3RhdGlvbis9aSpmfX19LGMuVHJhbnNsYXRlVGltZWxpbmU9ZnVuY3Rpb24oYSl7dGhpcy5jdXJ2ZXM9bmV3IGMuQ3VydmVzKGEpLHRoaXMuZnJhbWVzPVtdLHRoaXMuZnJhbWVzLmxlbmd0aD0zKmF9LGMuVHJhbnNsYXRlVGltZWxpbmUucHJvdG90eXBlPXtib25lSW5kZXg6MCxnZXRGcmFtZUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aC8zfSxzZXRGcmFtZTpmdW5jdGlvbihhLGIsYyxkKXthKj0zLHRoaXMuZnJhbWVzW2FdPWIsdGhpcy5mcmFtZXNbYSsxXT1jLHRoaXMuZnJhbWVzW2ErMl09ZH0sYXBwbHk6ZnVuY3Rpb24oYSxiLGQsZSxmKXt2YXIgZz10aGlzLmZyYW1lcztpZighKGQ8Z1swXSkpe3ZhciBoPWEuYm9uZXNbdGhpcy5ib25lSW5kZXhdO2lmKGQ+PWdbZy5sZW5ndGgtM10pcmV0dXJuIGgueCs9KGguZGF0YS54K2dbZy5sZW5ndGgtMl0taC54KSpmLHZvaWQoaC55Kz0oaC5kYXRhLnkrZ1tnLmxlbmd0aC0xXS1oLnkpKmYpO3ZhciBpPWMuQW5pbWF0aW9uLmJpbmFyeVNlYXJjaChnLGQsMyksaj1nW2ktMl0saz1nW2ktMV0sbD1nW2ldLG09MS0oZC1sKS8oZ1tpKy0zXS1sKTttPXRoaXMuY3VydmVzLmdldEN1cnZlUGVyY2VudChpLzMtMSxtKSxoLngrPShoLmRhdGEueCtqKyhnW2krMV0taikqbS1oLngpKmYsaC55Kz0oaC5kYXRhLnkraysoZ1tpKzJdLWspKm0taC55KSpmfX19LGMuU2NhbGVUaW1lbGluZT1mdW5jdGlvbihhKXt0aGlzLmN1cnZlcz1uZXcgYy5DdXJ2ZXMoYSksdGhpcy5mcmFtZXM9W10sdGhpcy5mcmFtZXMubGVuZ3RoPTMqYX0sYy5TY2FsZVRpbWVsaW5lLnByb3RvdHlwZT17Ym9uZUluZGV4OjAsZ2V0RnJhbWVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lcy5sZW5ndGgvM30sc2V0RnJhbWU6ZnVuY3Rpb24oYSxiLGMsZCl7YSo9Myx0aGlzLmZyYW1lc1thXT1iLHRoaXMuZnJhbWVzW2ErMV09Yyx0aGlzLmZyYW1lc1thKzJdPWR9LGFwcGx5OmZ1bmN0aW9uKGEsYixkLGUsZil7dmFyIGc9dGhpcy5mcmFtZXM7aWYoIShkPGdbMF0pKXt2YXIgaD1hLmJvbmVzW3RoaXMuYm9uZUluZGV4XTtpZihkPj1nW2cubGVuZ3RoLTNdKXJldHVybiBoLnNjYWxlWCs9KGguZGF0YS5zY2FsZVgqZ1tnLmxlbmd0aC0yXS1oLnNjYWxlWCkqZix2b2lkKGguc2NhbGVZKz0oaC5kYXRhLnNjYWxlWSpnW2cubGVuZ3RoLTFdLWguc2NhbGVZKSpmKTt2YXIgaT1jLkFuaW1hdGlvbi5iaW5hcnlTZWFyY2goZyxkLDMpLGo9Z1tpLTJdLGs9Z1tpLTFdLGw9Z1tpXSxtPTEtKGQtbCkvKGdbaSstM10tbCk7bT10aGlzLmN1cnZlcy5nZXRDdXJ2ZVBlcmNlbnQoaS8zLTEsbSksaC5zY2FsZVgrPShoLmRhdGEuc2NhbGVYKihqKyhnW2krMV0taikqbSktaC5zY2FsZVgpKmYsaC5zY2FsZVkrPShoLmRhdGEuc2NhbGVZKihrKyhnW2krMl0taykqbSktaC5zY2FsZVkpKmZ9fX0sYy5Db2xvclRpbWVsaW5lPWZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzPW5ldyBjLkN1cnZlcyhhKSx0aGlzLmZyYW1lcz1bXSx0aGlzLmZyYW1lcy5sZW5ndGg9NSphfSxjLkNvbG9yVGltZWxpbmUucHJvdG90eXBlPXtzbG90SW5kZXg6MCxnZXRGcmFtZUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aC81fSxzZXRGcmFtZTpmdW5jdGlvbihhLGIsYyxkLGUsZil7YSo9NSx0aGlzLmZyYW1lc1thXT1iLHRoaXMuZnJhbWVzW2ErMV09Yyx0aGlzLmZyYW1lc1thKzJdPWQsdGhpcy5mcmFtZXNbYSszXT1lLHRoaXMuZnJhbWVzW2ErNF09Zn0sYXBwbHk6ZnVuY3Rpb24oYSxiLGQsZSxmKXt2YXIgZz10aGlzLmZyYW1lcztpZighKGQ8Z1swXSkpe3ZhciBoLGksaixrO2lmKGQ+PWdbZy5sZW5ndGgtNV0pe3ZhciBsPWcubGVuZ3RoLTE7aD1nW2wtM10saT1nW2wtMl0saj1nW2wtMV0saz1nW2xdfWVsc2V7dmFyIG09Yy5BbmltYXRpb24uYmluYXJ5U2VhcmNoKGcsZCw1KSxuPWdbbS00XSxvPWdbbS0zXSxwPWdbbS0yXSxxPWdbbS0xXSxyPWdbbV0scz0xLShkLXIpLyhnW20tNV0tcik7cz10aGlzLmN1cnZlcy5nZXRDdXJ2ZVBlcmNlbnQobS81LTEscyksaD1uKyhnW20rMV0tbikqcyxpPW8rKGdbbSsyXS1vKSpzLGo9cCsoZ1ttKzNdLXApKnMsaz1xKyhnW20rNF0tcSkqc312YXIgdD1hLnNsb3RzW3RoaXMuc2xvdEluZGV4XTsxPmY/KHQucis9KGgtdC5yKSpmLHQuZys9KGktdC5nKSpmLHQuYis9KGotdC5iKSpmLHQuYSs9KGstdC5hKSpmKToodC5yPWgsdC5nPWksdC5iPWosdC5hPWspfX19LGMuQXR0YWNobWVudFRpbWVsaW5lPWZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzPW5ldyBjLkN1cnZlcyhhKSx0aGlzLmZyYW1lcz1bXSx0aGlzLmZyYW1lcy5sZW5ndGg9YSx0aGlzLmF0dGFjaG1lbnROYW1lcz1bXSx0aGlzLmF0dGFjaG1lbnROYW1lcy5sZW5ndGg9YX0sYy5BdHRhY2htZW50VGltZWxpbmUucHJvdG90eXBlPXtzbG90SW5kZXg6MCxnZXRGcmFtZUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aH0sc2V0RnJhbWU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZnJhbWVzW2FdPWIsdGhpcy5hdHRhY2htZW50TmFtZXNbYV09Y30sYXBwbHk6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXRoaXMuZnJhbWVzO2lmKGQ8ZVswXSlyZXR1cm4gdm9pZChiPmQmJnRoaXMuYXBwbHkoYSxiLE51bWJlci5NQVhfVkFMVUUsbnVsbCwwKSk7Yj5kJiYoYj0tMSk7dmFyIGY9ZD49ZVtlLmxlbmd0aC0xXT9lLmxlbmd0aC0xOmMuQW5pbWF0aW9uLmJpbmFyeVNlYXJjaDEoZSxkKS0xO2lmKCEoZVtmXTxiKSl7dmFyIGc9dGhpcy5hdHRhY2htZW50TmFtZXNbZl07YS5zbG90c1t0aGlzLnNsb3RJbmRleF0uc2V0QXR0YWNobWVudChnP2EuZ2V0QXR0YWNobWVudEJ5U2xvdEluZGV4KHRoaXMuc2xvdEluZGV4LGcpOm51bGwpfX19LGMuRXZlbnRUaW1lbGluZT1mdW5jdGlvbihhKXt0aGlzLmZyYW1lcz1bXSx0aGlzLmZyYW1lcy5sZW5ndGg9YSx0aGlzLmV2ZW50cz1bXSx0aGlzLmV2ZW50cy5sZW5ndGg9YX0sYy5FdmVudFRpbWVsaW5lLnByb3RvdHlwZT17Z2V0RnJhbWVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lcy5sZW5ndGh9LHNldEZyYW1lOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmZyYW1lc1thXT1iLHRoaXMuZXZlbnRzW2FdPWN9LGFwcGx5OmZ1bmN0aW9uKGEsYixkLGUsZil7aWYoZSl7dmFyIGc9dGhpcy5mcmFtZXMsaD1nLmxlbmd0aDtpZihiPmQpdGhpcy5hcHBseShhLGIsTnVtYmVyLk1BWF9WQUxVRSxlLGYpLGI9LTE7ZWxzZSBpZihiPj1nW2gtMV0pcmV0dXJuO2lmKCEoZDxnWzBdKSl7dmFyIGk7aWYoYjxnWzBdKWk9MDtlbHNle2k9Yy5BbmltYXRpb24uYmluYXJ5U2VhcmNoMShnLGIpO2Zvcih2YXIgaj1nW2ldO2k+MCYmZ1tpLTFdPT1qOylpLS19Zm9yKHZhciBrPXRoaXMuZXZlbnRzO2g+aSYmZD49Z1tpXTtpKyspZS5wdXNoKGtbaV0pfX19fSxjLkRyYXdPcmRlclRpbWVsaW5lPWZ1bmN0aW9uKGEpe3RoaXMuZnJhbWVzPVtdLHRoaXMuZnJhbWVzLmxlbmd0aD1hLHRoaXMuZHJhd09yZGVycz1bXSx0aGlzLmRyYXdPcmRlcnMubGVuZ3RoPWF9LGMuRHJhd09yZGVyVGltZWxpbmUucHJvdG90eXBlPXtnZXRGcmFtZUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aH0sc2V0RnJhbWU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZnJhbWVzW2FdPWIsdGhpcy5kcmF3T3JkZXJzW2FdPWN9LGFwcGx5OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT10aGlzLmZyYW1lcztpZighKGQ8ZVswXSkpe3ZhciBmO2Y9ZD49ZVtlLmxlbmd0aC0xXT9lLmxlbmd0aC0xOmMuQW5pbWF0aW9uLmJpbmFyeVNlYXJjaDEoZSxkKS0xO3ZhciBnPWEuZHJhd09yZGVyLGg9YS5zbG90cyxpPXRoaXMuZHJhd09yZGVyc1tmXTtpZihpKWZvcih2YXIgaj0wLGs9aS5sZW5ndGg7az5qO2orKylnW2pdPWEuc2xvdHNbaVtqXV07ZWxzZSBmb3IodmFyIGo9MCxrPWgubGVuZ3RoO2s+ajtqKyspZ1tqXT1oW2pdfX19LGMuRmZkVGltZWxpbmU9ZnVuY3Rpb24oYSl7dGhpcy5jdXJ2ZXM9bmV3IGMuQ3VydmVzKGEpLHRoaXMuZnJhbWVzPVtdLHRoaXMuZnJhbWVzLmxlbmd0aD1hLHRoaXMuZnJhbWVWZXJ0aWNlcz1bXSx0aGlzLmZyYW1lVmVydGljZXMubGVuZ3RoPWF9LGMuRmZkVGltZWxpbmUucHJvdG90eXBlPXtzbG90SW5kZXg6MCxhdHRhY2htZW50OjAsZ2V0RnJhbWVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lcy5sZW5ndGh9LHNldEZyYW1lOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmZyYW1lc1thXT1iLHRoaXMuZnJhbWVWZXJ0aWNlc1thXT1jfSxhcHBseTpmdW5jdGlvbihhLGIsZCxlLGYpe3ZhciBnPWEuc2xvdHNbdGhpcy5zbG90SW5kZXhdO2lmKGcuYXR0YWNobWVudD09dGhpcy5hdHRhY2htZW50KXt2YXIgaD10aGlzLmZyYW1lcztpZighKGQ8aFswXSkpe3ZhciBpPXRoaXMuZnJhbWVWZXJ0aWNlcyxqPWlbMF0ubGVuZ3RoLGs9Zy5hdHRhY2htZW50VmVydGljZXM7aWYoay5sZW5ndGghPWomJihmPTEpLGsubGVuZ3RoPWosZD49aFtoLmxlbmd0aC0xXSl7dmFyIGw9aVtoLmxlbmd0aC0xXTtpZigxPmYpZm9yKHZhciBtPTA7aj5tO20rKylrW21dKz0obFttXS1rW21dKSpmO2Vsc2UgZm9yKHZhciBtPTA7aj5tO20rKylrW21dPWxbbV19ZWxzZXt2YXIgbj1jLkFuaW1hdGlvbi5iaW5hcnlTZWFyY2gxKGgsZCksbz1oW25dLHA9MS0oZC1vKS8oaFtuLTFdLW8pO3A9dGhpcy5jdXJ2ZXMuZ2V0Q3VydmVQZXJjZW50KG4tMSwwPnA/MDpwPjE/MTpwKTt2YXIgcT1pW24tMV0scj1pW25dO2lmKDE+Zilmb3IodmFyIG09MDtqPm07bSsrKXt2YXIgcz1xW21dO2tbbV0rPShzKyhyW21dLXMpKnAta1ttXSkqZn1lbHNlIGZvcih2YXIgbT0wO2o+bTttKyspe3ZhciBzPXFbbV07a1ttXT1zKyhyW21dLXMpKnB9fX19fX0sYy5Ja0NvbnN0cmFpbnRUaW1lbGluZT1mdW5jdGlvbihhKXt0aGlzLmN1cnZlcz1uZXcgYy5DdXJ2ZXMoYSksdGhpcy5mcmFtZXM9W10sdGhpcy5mcmFtZXMubGVuZ3RoPTMqYX0sYy5Ja0NvbnN0cmFpbnRUaW1lbGluZS5wcm90b3R5cGU9e2lrQ29uc3RyYWludEluZGV4OjAsZ2V0RnJhbWVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lcy5sZW5ndGgvM30sc2V0RnJhbWU6ZnVuY3Rpb24oYSxiLGMsZCl7YSo9Myx0aGlzLmZyYW1lc1thXT1iLHRoaXMuZnJhbWVzW2ErMV09Yyx0aGlzLmZyYW1lc1thKzJdPWR9LGFwcGx5OmZ1bmN0aW9uKGEsYixkLGUsZil7dmFyIGc9dGhpcy5mcmFtZXM7aWYoIShkPGdbMF0pKXt2YXIgaD1hLmlrQ29uc3RyYWludHNbdGhpcy5pa0NvbnN0cmFpbnRJbmRleF07aWYoZD49Z1tnLmxlbmd0aC0zXSlyZXR1cm4gaC5taXgrPShnW2cubGVuZ3RoLTJdLWgubWl4KSpmLHZvaWQoaC5iZW5kRGlyZWN0aW9uPWdbZy5sZW5ndGgtMV0pO3ZhciBpPWMuQW5pbWF0aW9uLmJpbmFyeVNlYXJjaChnLGQsMyksaj1nW2krLTJdLGs9Z1tpXSxsPTEtKGQtaykvKGdbaSstM10tayk7bD10aGlzLmN1cnZlcy5nZXRDdXJ2ZVBlcmNlbnQoaS8zLTEsbCk7dmFyIG09aisoZ1tpKzFdLWopKmw7aC5taXgrPShtLWgubWl4KSpmLGguYmVuZERpcmVjdGlvbj1nW2krLTFdfX19LGMuRmxpcFhUaW1lbGluZT1mdW5jdGlvbihhKXt0aGlzLmN1cnZlcz1uZXcgYy5DdXJ2ZXMoYSksdGhpcy5mcmFtZXM9W10sdGhpcy5mcmFtZXMubGVuZ3RoPTIqYX0sYy5GbGlwWFRpbWVsaW5lLnByb3RvdHlwZT17Ym9uZUluZGV4OjAsZ2V0RnJhbWVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lcy5sZW5ndGgvMn0sc2V0RnJhbWU6ZnVuY3Rpb24oYSxiLGMpe2EqPTIsdGhpcy5mcmFtZXNbYV09Yix0aGlzLmZyYW1lc1thKzFdPWM/MTowfSxhcHBseTpmdW5jdGlvbihhLGIsZCl7dmFyIGU9dGhpcy5mcmFtZXM7aWYoZDxlWzBdKXJldHVybiB2b2lkKGI+ZCYmdGhpcy5hcHBseShhLGIsTnVtYmVyLk1BWF9WQUxVRSxudWxsLDApKTtiPmQmJihiPS0xKTt2YXIgZj0oZD49ZVtlLmxlbmd0aC0yXT9lLmxlbmd0aDpjLkFuaW1hdGlvbi5iaW5hcnlTZWFyY2goZSxkLDIpKS0yO2VbZl08Ynx8KGEuYm9uZXNbYm9uZUluZGV4XS5mbGlwWD0wIT1lW2YrMV0pfX0sYy5GbGlwWVRpbWVsaW5lPWZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzPW5ldyBjLkN1cnZlcyhhKSx0aGlzLmZyYW1lcz1bXSx0aGlzLmZyYW1lcy5sZW5ndGg9MiphfSxjLkZsaXBZVGltZWxpbmUucHJvdG90eXBlPXtib25lSW5kZXg6MCxnZXRGcmFtZUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aC8yfSxzZXRGcmFtZTpmdW5jdGlvbihhLGIsYyl7YSo9Mix0aGlzLmZyYW1lc1thXT1iLHRoaXMuZnJhbWVzW2ErMV09Yz8xOjB9LGFwcGx5OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT10aGlzLmZyYW1lcztpZihkPGVbMF0pcmV0dXJuIHZvaWQoYj5kJiZ0aGlzLmFwcGx5KGEsYixOdW1iZXIuTUFYX1ZBTFVFLG51bGwsMCkpO2I+ZCYmKGI9LTEpO3ZhciBmPShkPj1lW2UubGVuZ3RoLTJdP2UubGVuZ3RoOmMuQW5pbWF0aW9uLmJpbmFyeVNlYXJjaChlLGQsMikpLTI7ZVtmXTxifHwoYS5ib25lc1tib25lSW5kZXhdLmZsaXBZPTAhPWVbZisxXSl9fSxjLlNrZWxldG9uRGF0YT1mdW5jdGlvbigpe3RoaXMuYm9uZXM9W10sdGhpcy5zbG90cz1bXSx0aGlzLnNraW5zPVtdLHRoaXMuZXZlbnRzPVtdLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLmlrQ29uc3RyYWludHM9W119LGMuU2tlbGV0b25EYXRhLnByb3RvdHlwZT17bmFtZTpudWxsLGRlZmF1bHRTa2luOm51bGwsd2lkdGg6MCxoZWlnaHQ6MCx2ZXJzaW9uOm51bGwsaGFzaDpudWxsLGZpbmRCb25lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmJvbmVzLGM9MCxkPWIubGVuZ3RoO2Q+YztjKyspaWYoYltjXS5uYW1lPT1hKXJldHVybiBiW2NdO3JldHVybiBudWxsfSxmaW5kQm9uZUluZGV4OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmJvbmVzLGM9MCxkPWIubGVuZ3RoO2Q+YztjKyspaWYoYltjXS5uYW1lPT1hKXJldHVybiBjO3JldHVybi0xfSxmaW5kU2xvdDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5zbG90cyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWlmKGJbY10ubmFtZT09YSlyZXR1cm4gc2xvdFtjXTtyZXR1cm4gbnVsbH0sZmluZFNsb3RJbmRleDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5zbG90cyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWlmKGJbY10ubmFtZT09YSlyZXR1cm4gYztyZXR1cm4tMX0sZmluZFNraW46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuc2tpbnMsYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKylpZihiW2NdLm5hbWU9PWEpcmV0dXJuIGJbY107cmV0dXJuIG51bGx9LGZpbmRFdmVudDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5ldmVudHMsYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKylpZihiW2NdLm5hbWU9PWEpcmV0dXJuIGJbY107cmV0dXJuIG51bGx9LGZpbmRBbmltYXRpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuYW5pbWF0aW9ucyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWlmKGJbY10ubmFtZT09YSlyZXR1cm4gYltjXTtyZXR1cm4gbnVsbH0sZmluZElrQ29uc3RyYWludDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5pa0NvbnN0cmFpbnRzLGM9MCxkPWIubGVuZ3RoO2Q+YztjKyspaWYoYltjXS5uYW1lPT1hKXJldHVybiBiW2NdO3JldHVybiBudWxsfX0sYy5Ta2VsZXRvbj1mdW5jdGlvbihhKXt0aGlzLmRhdGE9YSx0aGlzLmJvbmVzPVtdO2Zvcih2YXIgYj0wLGQ9YS5ib25lcy5sZW5ndGg7ZD5iO2IrKyl7dmFyIGU9YS5ib25lc1tiXSxmPWUucGFyZW50P3RoaXMuYm9uZXNbYS5ib25lcy5pbmRleE9mKGUucGFyZW50KV06bnVsbDt0aGlzLmJvbmVzLnB1c2gobmV3IGMuQm9uZShlLHRoaXMsZikpfXRoaXMuc2xvdHM9W10sdGhpcy5kcmF3T3JkZXI9W107Zm9yKHZhciBiPTAsZD1hLnNsb3RzLmxlbmd0aDtkPmI7YisrKXt2YXIgZz1hLnNsb3RzW2JdLGg9dGhpcy5ib25lc1thLmJvbmVzLmluZGV4T2YoZy5ib25lRGF0YSldLGk9bmV3IGMuU2xvdChnLGgpO3RoaXMuc2xvdHMucHVzaChpKSx0aGlzLmRyYXdPcmRlci5wdXNoKGkpfXRoaXMuaWtDb25zdHJhaW50cz1bXTtmb3IodmFyIGI9MCxkPWEuaWtDb25zdHJhaW50cy5sZW5ndGg7ZD5iO2IrKyl0aGlzLmlrQ29uc3RyYWludHMucHVzaChuZXcgYy5Ja0NvbnN0cmFpbnQoYS5pa0NvbnN0cmFpbnRzW2JdLHRoaXMpKTt0aGlzLmJvbmVDYWNoZT1bXSx0aGlzLnVwZGF0ZUNhY2hlKCl9LGMuU2tlbGV0b24ucHJvdG90eXBlPXt4OjAseTowLHNraW46bnVsbCxyOjEsZzoxLGI6MSxhOjEsdGltZTowLGZsaXBYOiExLGZsaXBZOiExLHVwZGF0ZUNhY2hlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pa0NvbnN0cmFpbnRzLGI9YS5sZW5ndGgsYz1iKzEsZD10aGlzLmJvbmVDYWNoZTtkLmxlbmd0aD5jJiYoZC5sZW5ndGg9Yyk7Zm9yKHZhciBlPTAsZj1kLmxlbmd0aDtmPmU7ZSsrKWRbZV0ubGVuZ3RoPTA7Zm9yKDtkLmxlbmd0aDxjOylkW2QubGVuZ3RoXT1bXTt2YXIgZz1kWzBdLGg9dGhpcy5ib25lczthOmZvcih2YXIgZT0wLGY9aC5sZW5ndGg7Zj5lO2UrKyl7dmFyIGk9aFtlXSxqPWk7ZG97Zm9yKHZhciBrPTA7Yj5rO2srKylmb3IodmFyIGw9YVtrXSxtPWwuYm9uZXNbMF0sbj1sLmJvbmVzW2wuYm9uZXMubGVuZ3RoLTFdOzspe2lmKGo9PW4pe2Rba10ucHVzaChpKSxkW2srMV0ucHVzaChpKTtjb250aW51ZSBhfWlmKG49PW0pYnJlYWs7bj1uLnBhcmVudH1qPWoucGFyZW50fXdoaWxlKGopO2dbZy5sZW5ndGhdPWl9fSx1cGRhdGVXb3JsZFRyYW5zZm9ybTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmJvbmVzLGI9MCxjPWEubGVuZ3RoO2M+YjtiKyspe3ZhciBkPWFbYl07ZC5yb3RhdGlvbklLPWQucm90YXRpb259Zm9yKHZhciBiPTAsZT10aGlzLmJvbmVDYWNoZS5sZW5ndGgtMTs7KXtmb3IodmFyIGY9dGhpcy5ib25lQ2FjaGVbYl0sZz0wLGg9Zi5sZW5ndGg7aD5nO2crKylmW2ddLnVwZGF0ZVdvcmxkVHJhbnNmb3JtKCk7aWYoYj09ZSlicmVhazt0aGlzLmlrQ29uc3RyYWludHNbYl0uYXBwbHkoKSxiKyt9fSxzZXRUb1NldHVwUG9zZTpmdW5jdGlvbigpe3RoaXMuc2V0Qm9uZXNUb1NldHVwUG9zZSgpLHRoaXMuc2V0U2xvdHNUb1NldHVwUG9zZSgpfSxzZXRCb25lc1RvU2V0dXBQb3NlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuYm9uZXMsYj0wLGM9YS5sZW5ndGg7Yz5iO2IrKylhW2JdLnNldFRvU2V0dXBQb3NlKCk7Zm9yKHZhciBkPXRoaXMuaWtDb25zdHJhaW50cyxiPTAsYz1kLmxlbmd0aDtjPmI7YisrKXt2YXIgZT1kW2JdO2UuYmVuZERpcmVjdGlvbj1lLmRhdGEuYmVuZERpcmVjdGlvbixlLm1peD1lLmRhdGEubWl4fX0sc2V0U2xvdHNUb1NldHVwUG9zZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnNsb3RzLGI9dGhpcy5kcmF3T3JkZXIsYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKyliW2NdPWFbY10sYVtjXS5zZXRUb1NldHVwUG9zZShjKX0sZ2V0Um9vdEJvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ib25lcy5sZW5ndGg/dGhpcy5ib25lc1swXTpudWxsfSxmaW5kQm9uZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5ib25lcyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWlmKGJbY10uZGF0YS5uYW1lPT1hKXJldHVybiBiW2NdO3JldHVybiBudWxsfSxmaW5kQm9uZUluZGV4OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmJvbmVzLGM9MCxkPWIubGVuZ3RoO2Q+YztjKyspaWYoYltjXS5kYXRhLm5hbWU9PWEpcmV0dXJuIGM7cmV0dXJuLTF9LGZpbmRTbG90OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLnNsb3RzLGM9MCxkPWIubGVuZ3RoO2Q+YztjKyspaWYoYltjXS5kYXRhLm5hbWU9PWEpcmV0dXJuIGJbY107cmV0dXJuIG51bGx9LGZpbmRTbG90SW5kZXg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuc2xvdHMsYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKylpZihiW2NdLmRhdGEubmFtZT09YSlyZXR1cm4gYztyZXR1cm4tMX0sc2V0U2tpbkJ5TmFtZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmRhdGEuZmluZFNraW4oYSk7aWYoIWIpdGhyb3dcIlNraW4gbm90IGZvdW5kOiBcIithO3RoaXMuc2V0U2tpbihiKX0sc2V0U2tpbjpmdW5jdGlvbihhKXtpZihhKWlmKHRoaXMuc2tpbilhLl9hdHRhY2hBbGwodGhpcyx0aGlzLnNraW4pO2Vsc2UgZm9yKHZhciBiPXRoaXMuc2xvdHMsYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKyl7dmFyIGU9YltjXSxmPWUuZGF0YS5hdHRhY2htZW50TmFtZTtpZihmKXt2YXIgZz1hLmdldEF0dGFjaG1lbnQoYyxmKTtnJiZlLnNldEF0dGFjaG1lbnQoZyl9fXRoaXMuc2tpbj1hfSxnZXRBdHRhY2htZW50QnlTbG90TmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmdldEF0dGFjaG1lbnRCeVNsb3RJbmRleCh0aGlzLmRhdGEuZmluZFNsb3RJbmRleChhKSxiKX0sZ2V0QXR0YWNobWVudEJ5U2xvdEluZGV4OmZ1bmN0aW9uKGEsYil7aWYodGhpcy5za2luKXt2YXIgYz10aGlzLnNraW4uZ2V0QXR0YWNobWVudChhLGIpO2lmKGMpcmV0dXJuIGN9cmV0dXJuIHRoaXMuZGF0YS5kZWZhdWx0U2tpbj90aGlzLmRhdGEuZGVmYXVsdFNraW4uZ2V0QXR0YWNobWVudChhLGIpOm51bGx9LHNldEF0dGFjaG1lbnQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy5zbG90cyxkPTAsZT1jLmxlbmd0aDtlPmQ7ZCsrKXt2YXIgZj1jW2RdO2lmKGYuZGF0YS5uYW1lPT1hKXt2YXIgZz1udWxsO2lmKGImJihnPXRoaXMuZ2V0QXR0YWNobWVudEJ5U2xvdEluZGV4KGQsYiksIWcpKXRocm93XCJBdHRhY2htZW50IG5vdCBmb3VuZDogXCIrYitcIiwgZm9yIHNsb3Q6IFwiK2E7cmV0dXJuIHZvaWQgZi5zZXRBdHRhY2htZW50KGcpfX10aHJvd1wiU2xvdCBub3QgZm91bmQ6IFwiK2F9LGZpbmRJa0NvbnN0cmFpbnQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuaWtDb25zdHJhaW50cyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWlmKGJbY10uZGF0YS5uYW1lPT1hKXJldHVybiBiW2NdO3JldHVybiBudWxsfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dGhpcy50aW1lKz1hfX0sYy5FdmVudERhdGE9ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWF9LGMuRXZlbnREYXRhLnByb3RvdHlwZT17aW50VmFsdWU6MCxmbG9hdFZhbHVlOjAsc3RyaW5nVmFsdWU6bnVsbH0sYy5FdmVudD1mdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sYy5FdmVudC5wcm90b3R5cGU9e2ludFZhbHVlOjAsZmxvYXRWYWx1ZTowLHN0cmluZ1ZhbHVlOm51bGx9LGMuQXR0YWNobWVudFR5cGU9e3JlZ2lvbjowLGJvdW5kaW5nYm94OjEsbWVzaDoyLHNraW5uZWRtZXNoOjN9LGMuUmVnaW9uQXR0YWNobWVudD1mdW5jdGlvbihhKXt0aGlzLm5hbWU9YSx0aGlzLm9mZnNldD1bXSx0aGlzLm9mZnNldC5sZW5ndGg9OCx0aGlzLnV2cz1bXSx0aGlzLnV2cy5sZW5ndGg9OH0sYy5SZWdpb25BdHRhY2htZW50LnByb3RvdHlwZT17dHlwZTpjLkF0dGFjaG1lbnRUeXBlLnJlZ2lvbix4OjAseTowLHJvdGF0aW9uOjAsc2NhbGVYOjEsc2NhbGVZOjEsd2lkdGg6MCxoZWlnaHQ6MCxyOjEsZzoxLGI6MSxhOjEscGF0aDpudWxsLHJlbmRlcmVyT2JqZWN0Om51bGwscmVnaW9uT2Zmc2V0WDowLHJlZ2lvbk9mZnNldFk6MCxyZWdpb25XaWR0aDowLHJlZ2lvbkhlaWdodDowLHJlZ2lvbk9yaWdpbmFsV2lkdGg6MCxyZWdpb25PcmlnaW5hbEhlaWdodDowLHNldFVWczpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXMudXZzO2U/KGZbMl09YSxmWzNdPWQsZls0XT1hLGZbNV09YixmWzZdPWMsZls3XT1iLGZbMF09YyxmWzFdPWQpOihmWzBdPWEsZlsxXT1kLGZbMl09YSxmWzNdPWIsZls0XT1jLGZbNV09YixmWzZdPWMsZls3XT1kKX0sdXBkYXRlT2Zmc2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy53aWR0aC90aGlzLnJlZ2lvbk9yaWdpbmFsV2lkdGgqdGhpcy5zY2FsZVgsYj10aGlzLmhlaWdodC90aGlzLnJlZ2lvbk9yaWdpbmFsSGVpZ2h0KnRoaXMuc2NhbGVZLGQ9LXRoaXMud2lkdGgvMip0aGlzLnNjYWxlWCt0aGlzLnJlZ2lvbk9mZnNldFgqYSxlPS10aGlzLmhlaWdodC8yKnRoaXMuc2NhbGVZK3RoaXMucmVnaW9uT2Zmc2V0WSpiLGY9ZCt0aGlzLnJlZ2lvbldpZHRoKmEsZz1lK3RoaXMucmVnaW9uSGVpZ2h0KmIsaD10aGlzLnJvdGF0aW9uKmMuZGVnUmFkLGk9TWF0aC5jb3MoaCksaj1NYXRoLnNpbihoKSxrPWQqaSt0aGlzLngsbD1kKmosbT1lKmkrdGhpcy55LG49ZSpqLG89ZippK3RoaXMueCxwPWYqaixxPWcqaSt0aGlzLnkscj1nKmoscz10aGlzLm9mZnNldDtzWzBdPWstbixzWzFdPW0rbCxzWzJdPWstcixzWzNdPXErbCxzWzRdPW8tcixzWzVdPXErcCxzWzZdPW8tbixzWzddPW0rcH0sY29tcHV0ZVZlcnRpY2VzOmZ1bmN0aW9uKGEsYixjLGQpe2ErPWMud29ybGRYLGIrPWMud29ybGRZO3ZhciBlPWMubTAwLGY9Yy5tMDEsZz1jLm0xMCxoPWMubTExLGk9dGhpcy5vZmZzZXQ7ZFswXT1pWzBdKmUraVsxXSpmK2EsZFsxXT1pWzBdKmcraVsxXSpoK2IsZFsyXT1pWzJdKmUraVszXSpmK2EsZFszXT1pWzJdKmcraVszXSpoK2IsZFs0XT1pWzRdKmUraVs1XSpmK2EsZFs1XT1pWzRdKmcraVs1XSpoK2IsZFs2XT1pWzZdKmUraVs3XSpmK2EsZFs3XT1pWzZdKmcraVs3XSpoK2J9fSxjLk1lc2hBdHRhY2htZW50PWZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hfSxjLk1lc2hBdHRhY2htZW50LnByb3RvdHlwZT17dHlwZTpjLkF0dGFjaG1lbnRUeXBlLm1lc2gsdmVydGljZXM6bnVsbCx1dnM6bnVsbCxyZWdpb25VVnM6bnVsbCx0cmlhbmdsZXM6bnVsbCxodWxsTGVuZ3RoOjAscjoxLGc6MSxiOjEsYToxLHBhdGg6bnVsbCxyZW5kZXJlck9iamVjdDpudWxsLHJlZ2lvblU6MCxyZWdpb25WOjAscmVnaW9uVTI6MCxyZWdpb25WMjowLHJlZ2lvblJvdGF0ZTohMSxyZWdpb25PZmZzZXRYOjAscmVnaW9uT2Zmc2V0WTowLHJlZ2lvbldpZHRoOjAscmVnaW9uSGVpZ2h0OjAscmVnaW9uT3JpZ2luYWxXaWR0aDowLHJlZ2lvbk9yaWdpbmFsSGVpZ2h0OjAsZWRnZXM6bnVsbCx3aWR0aDowLGhlaWdodDowLHVwZGF0ZVVWczpmdW5jdGlvbigpe3ZhciBhPXRoaXMucmVnaW9uVTItdGhpcy5yZWdpb25VLGI9dGhpcy5yZWdpb25WMi10aGlzLnJlZ2lvblYsZD10aGlzLnJlZ2lvblVWcy5sZW5ndGg7aWYodGhpcy51dnMmJnRoaXMudXZzLmxlbmd0aD09ZHx8KHRoaXMudXZzPW5ldyBjLkZsb2F0MzJBcnJheShkKSksdGhpcy5yZWdpb25Sb3RhdGUpZm9yKHZhciBlPTA7ZD5lO2UrPTIpdGhpcy51dnNbZV09dGhpcy5yZWdpb25VK3RoaXMucmVnaW9uVVZzW2UrMV0qYSx0aGlzLnV2c1tlKzFdPXRoaXMucmVnaW9uVitiLXRoaXMucmVnaW9uVVZzW2VdKmI7ZWxzZSBmb3IodmFyIGU9MDtkPmU7ZSs9Mil0aGlzLnV2c1tlXT10aGlzLnJlZ2lvblUrdGhpcy5yZWdpb25VVnNbZV0qYSx0aGlzLnV2c1tlKzFdPXRoaXMucmVnaW9uVit0aGlzLnJlZ2lvblVWc1tlKzFdKmJ9LGNvbXB1dGVXb3JsZFZlcnRpY2VzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWMuYm9uZTthKz1lLndvcmxkWCxiKz1lLndvcmxkWTt2YXIgZj1lLm0wMCxnPWUubTAxLGg9ZS5tMTAsaT1lLm0xMSxqPXRoaXMudmVydGljZXMsaz1qLmxlbmd0aDtjLmF0dGFjaG1lbnRWZXJ0aWNlcy5sZW5ndGg9PWsmJihqPWMuYXR0YWNobWVudFZlcnRpY2VzKTtmb3IodmFyIGw9MDtrPmw7bCs9Mil7dmFyIG09altsXSxuPWpbbCsxXTtkW2xdPW0qZituKmcrYSxkW2wrMV09bSpoK24qaStifX19LGMuU2tpbm5lZE1lc2hBdHRhY2htZW50PWZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hfSxjLlNraW5uZWRNZXNoQXR0YWNobWVudC5wcm90b3R5cGU9e3R5cGU6Yy5BdHRhY2htZW50VHlwZS5za2lubmVkbWVzaCxib25lczpudWxsLHdlaWdodHM6bnVsbCx1dnM6bnVsbCxyZWdpb25VVnM6bnVsbCx0cmlhbmdsZXM6bnVsbCxodWxsTGVuZ3RoOjAscjoxLGc6MSxiOjEsYToxLHBhdGg6bnVsbCxyZW5kZXJlck9iamVjdDpudWxsLHJlZ2lvblU6MCxyZWdpb25WOjAscmVnaW9uVTI6MCxyZWdpb25WMjowLHJlZ2lvblJvdGF0ZTohMSxyZWdpb25PZmZzZXRYOjAscmVnaW9uT2Zmc2V0WTowLHJlZ2lvbldpZHRoOjAscmVnaW9uSGVpZ2h0OjAscmVnaW9uT3JpZ2luYWxXaWR0aDowLHJlZ2lvbk9yaWdpbmFsSGVpZ2h0OjAsZWRnZXM6bnVsbCx3aWR0aDowLGhlaWdodDowLHVwZGF0ZVVWczpmdW5jdGlvbigpe3ZhciBhPXRoaXMucmVnaW9uVTItdGhpcy5yZWdpb25VLGI9dGhpcy5yZWdpb25WMi10aGlzLnJlZ2lvblYsZD10aGlzLnJlZ2lvblVWcy5sZW5ndGg7aWYodGhpcy51dnMmJnRoaXMudXZzLmxlbmd0aD09ZHx8KHRoaXMudXZzPW5ldyBjLkZsb2F0MzJBcnJheShkKSksdGhpcy5yZWdpb25Sb3RhdGUpZm9yKHZhciBlPTA7ZD5lO2UrPTIpdGhpcy51dnNbZV09dGhpcy5yZWdpb25VK3RoaXMucmVnaW9uVVZzW2UrMV0qYSx0aGlzLnV2c1tlKzFdPXRoaXMucmVnaW9uVitiLXRoaXMucmVnaW9uVVZzW2VdKmI7ZWxzZSBmb3IodmFyIGU9MDtkPmU7ZSs9Mil0aGlzLnV2c1tlXT10aGlzLnJlZ2lvblUrdGhpcy5yZWdpb25VVnNbZV0qYSx0aGlzLnV2c1tlKzFdPXRoaXMucmVnaW9uVit0aGlzLnJlZ2lvblVWc1tlKzFdKmJ9LGNvbXB1dGVXb3JsZFZlcnRpY2VzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGw9Yy5ib25lLnNrZWxldG9uLmJvbmVzLG09dGhpcy53ZWlnaHRzLG49dGhpcy5ib25lcyxvPTAscD0wLHE9MCxyPTAscz1uLmxlbmd0aDtpZihjLmF0dGFjaG1lbnRWZXJ0aWNlcy5sZW5ndGgpZm9yKHZhciB0PWMuYXR0YWNobWVudFZlcnRpY2VzO3M+cDtvKz0yKXtmb3IoZj0wLGc9MCxlPW5bcCsrXStwO2U+cDtwKysscSs9MyxyKz0yKWg9bFtuW3BdXSxpPW1bcV0rdFtyXSxqPW1bcSsxXSt0W3IrMV0saz1tW3ErMl0sZis9KGkqaC5tMDAraipoLm0wMStoLndvcmxkWCkqayxnKz0oaSpoLm0xMCtqKmgubTExK2gud29ybGRZKSprO2Rbb109ZithLGRbbysxXT1nK2J9ZWxzZSBmb3IoO3M+cDtvKz0yKXtmb3IoZj0wLGc9MCxlPW5bcCsrXStwO2U+cDtwKysscSs9MyloPWxbbltwXV0saT1tW3FdLGo9bVtxKzFdLGs9bVtxKzJdLGYrPShpKmgubTAwK2oqaC5tMDEraC53b3JsZFgpKmssZys9KGkqaC5tMTAraipoLm0xMStoLndvcmxkWSkqaztkW29dPWYrYSxkW28rMV09ZytifX19LGMuQm91bmRpbmdCb3hBdHRhY2htZW50PWZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLHRoaXMudmVydGljZXM9W119LGMuQm91bmRpbmdCb3hBdHRhY2htZW50LnByb3RvdHlwZT17dHlwZTpjLkF0dGFjaG1lbnRUeXBlLmJvdW5kaW5nYm94LGNvbXB1dGVXb3JsZFZlcnRpY2VzOmZ1bmN0aW9uKGEsYixjLGQpe2ErPWMud29ybGRYLGIrPWMud29ybGRZO2Zvcih2YXIgZT1jLm0wMCxmPWMubTAxLGc9Yy5tMTAsaD1jLm0xMSxpPXRoaXMudmVydGljZXMsaj0wLGs9aS5sZW5ndGg7az5qO2orPTIpe3ZhciBsPWlbal0sbT1pW2orMV07ZFtqXT1sKmUrbSpmK2EsZFtqKzFdPWwqZyttKmgrYn19fSxjLkFuaW1hdGlvblN0YXRlRGF0YT1mdW5jdGlvbihhKXt0aGlzLnNrZWxldG9uRGF0YT1hLHRoaXMuYW5pbWF0aW9uVG9NaXhUaW1lPXt9fSxjLkFuaW1hdGlvblN0YXRlRGF0YS5wcm90b3R5cGU9e2RlZmF1bHRNaXg6MCxzZXRNaXhCeU5hbWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuc2tlbGV0b25EYXRhLmZpbmRBbmltYXRpb24oYSk7aWYoIWQpdGhyb3dcIkFuaW1hdGlvbiBub3QgZm91bmQ6IFwiK2E7dmFyIGU9dGhpcy5za2VsZXRvbkRhdGEuZmluZEFuaW1hdGlvbihiKTtpZighZSl0aHJvd1wiQW5pbWF0aW9uIG5vdCBmb3VuZDogXCIrYjt0aGlzLnNldE1peChkLGUsYyl9LHNldE1peDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hbmltYXRpb25Ub01peFRpbWVbYS5uYW1lK1wiOlwiK2IubmFtZV09Y30sZ2V0TWl4OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5uYW1lK1wiOlwiK2IubmFtZTtyZXR1cm4gdGhpcy5hbmltYXRpb25Ub01peFRpbWUuaGFzT3duUHJvcGVydHkoYyk/dGhpcy5hbmltYXRpb25Ub01peFRpbWVbY106dGhpcy5kZWZhdWx0TWl4fX0sYy5UcmFja0VudHJ5PWZ1bmN0aW9uKCl7fSxjLlRyYWNrRW50cnkucHJvdG90eXBlPXtuZXh0Om51bGwscHJldmlvdXM6bnVsbCxhbmltYXRpb246bnVsbCxsb29wOiExLGRlbGF5OjAsdGltZTowLGxhc3RUaW1lOi0xLGVuZFRpbWU6MCx0aW1lU2NhbGU6MSxtaXhUaW1lOjAsbWl4RHVyYXRpb246MCxtaXg6MSxvblN0YXJ0Om51bGwsb25FbmQ6bnVsbCxvbkNvbXBsZXRlOm51bGwsb25FdmVudDpudWxsfSxjLkFuaW1hdGlvblN0YXRlPWZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hLHRoaXMudHJhY2tzPVtdLHRoaXMuZXZlbnRzPVtdfSxjLkFuaW1hdGlvblN0YXRlLnByb3RvdHlwZT17b25TdGFydDpudWxsLG9uRW5kOm51bGwsb25Db21wbGV0ZTpudWxsLG9uRXZlbnQ6bnVsbCx0aW1lU2NhbGU6MSx1cGRhdGU6ZnVuY3Rpb24oYSl7YSo9dGhpcy50aW1lU2NhbGU7Zm9yKHZhciBiPTA7Yjx0aGlzLnRyYWNrcy5sZW5ndGg7YisrKXt2YXIgYz10aGlzLnRyYWNrc1tiXTtpZihjKXtpZihjLnRpbWUrPWEqYy50aW1lU2NhbGUsYy5wcmV2aW91cyl7dmFyIGQ9YSpjLnByZXZpb3VzLnRpbWVTY2FsZTtjLnByZXZpb3VzLnRpbWUrPWQsYy5taXhUaW1lKz1kfXZhciBlPWMubmV4dDtlPyhlLnRpbWU9Yy5sYXN0VGltZS1lLmRlbGF5LGUudGltZT49MCYmdGhpcy5zZXRDdXJyZW50KGIsZSkpOiFjLmxvb3AmJmMubGFzdFRpbWU+PWMuZW5kVGltZSYmdGhpcy5jbGVhclRyYWNrKGIpfX19LGFwcGx5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy50cmFja3MubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy50cmFja3NbYl07aWYoYyl7dGhpcy5ldmVudHMubGVuZ3RoPTA7dmFyIGQ9Yy50aW1lLGU9Yy5sYXN0VGltZSxmPWMuZW5kVGltZSxnPWMubG9vcDshZyYmZD5mJiYoZD1mKTt2YXIgaD1jLnByZXZpb3VzO2lmKGgpe3ZhciBpPWgudGltZTshaC5sb29wJiZpPmguZW5kVGltZSYmKGk9aC5lbmRUaW1lKSxoLmFuaW1hdGlvbi5hcHBseShhLGksaSxoLmxvb3AsbnVsbCk7dmFyIGo9Yy5taXhUaW1lL2MubWl4RHVyYXRpb24qYy5taXg7aj49MSYmKGo9MSxjLnByZXZpb3VzPW51bGwpLGMuYW5pbWF0aW9uLm1peChhLGMubGFzdFRpbWUsZCxnLHRoaXMuZXZlbnRzLGopfWVsc2UgMT09Yy5taXg/Yy5hbmltYXRpb24uYXBwbHkoYSxjLmxhc3RUaW1lLGQsZyx0aGlzLmV2ZW50cyk6Yy5hbmltYXRpb24ubWl4KGEsYy5sYXN0VGltZSxkLGcsdGhpcy5ldmVudHMsYy5taXgpO2Zvcih2YXIgaz0wLGw9dGhpcy5ldmVudHMubGVuZ3RoO2w+aztrKyspe3ZhciBtPXRoaXMuZXZlbnRzW2tdO2Mub25FdmVudCYmYy5vbkV2ZW50KGIsbSksdGhpcy5vbkV2ZW50JiZ0aGlzLm9uRXZlbnQoYixtKX1pZihnP2UlZj5kJWY6Zj5lJiZkPj1mKXt2YXIgbj1NYXRoLmZsb29yKGQvZik7Yy5vbkNvbXBsZXRlJiZjLm9uQ29tcGxldGUoYixuKSx0aGlzLm9uQ29tcGxldGUmJnRoaXMub25Db21wbGV0ZShiLG4pfWMubGFzdFRpbWU9Yy50aW1lfX19LGNsZWFyVHJhY2tzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYj10aGlzLnRyYWNrcy5sZW5ndGg7Yj5hO2ErKyl0aGlzLmNsZWFyVHJhY2soYSk7dGhpcy50cmFja3MubGVuZ3RoPTB9LGNsZWFyVHJhY2s6ZnVuY3Rpb24oYSl7aWYoIShhPj10aGlzLnRyYWNrcy5sZW5ndGgpKXt2YXIgYj10aGlzLnRyYWNrc1thXTtiJiYoYi5vbkVuZCYmYi5vbkVuZChhKSx0aGlzLm9uRW5kJiZ0aGlzLm9uRW5kKGEpLHRoaXMudHJhY2tzW2FdPW51bGwpfX0sX2V4cGFuZFRvSW5kZXg6ZnVuY3Rpb24oYSl7aWYoYTx0aGlzLnRyYWNrcy5sZW5ndGgpcmV0dXJuIHRoaXMudHJhY2tzW2FdO2Zvcig7YT49dGhpcy50cmFja3MubGVuZ3RoOyl0aGlzLnRyYWNrcy5wdXNoKG51bGwpO3JldHVybiBudWxsfSxzZXRDdXJyZW50OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZXhwYW5kVG9JbmRleChhKTtpZihjKXt2YXIgZD1jLnByZXZpb3VzO2MucHJldmlvdXM9bnVsbCxjLm9uRW5kJiZjLm9uRW5kKGEpLHRoaXMub25FbmQmJnRoaXMub25FbmQoYSksYi5taXhEdXJhdGlvbj10aGlzLmRhdGEuZ2V0TWl4KGMuYW5pbWF0aW9uLGIuYW5pbWF0aW9uKSxiLm1peER1cmF0aW9uPjAmJihiLm1peFRpbWU9MCxiLnByZXZpb3VzPWQmJmMubWl4VGltZS9jLm1peER1cmF0aW9uPC41P2Q6Yyl9dGhpcy50cmFja3NbYV09YixiLm9uU3RhcnQmJmIub25TdGFydChhKSx0aGlzLm9uU3RhcnQmJnRoaXMub25TdGFydChhKX0sc2V0QW5pbWF0aW9uQnlOYW1lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmRhdGEuc2tlbGV0b25EYXRhLmZpbmRBbmltYXRpb24oYik7aWYoIWQpdGhyb3dcIkFuaW1hdGlvbiBub3QgZm91bmQ6IFwiK2I7cmV0dXJuIHRoaXMuc2V0QW5pbWF0aW9uKGEsZCxjKX0sc2V0QW5pbWF0aW9uOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1uZXcgYy5UcmFja0VudHJ5O3JldHVybiBlLmFuaW1hdGlvbj1iLGUubG9vcD1kLGUuZW5kVGltZT1iLmR1cmF0aW9uLHRoaXMuc2V0Q3VycmVudChhLGUpLGV9LGFkZEFuaW1hdGlvbkJ5TmFtZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmRhdGEuc2tlbGV0b25EYXRhLmZpbmRBbmltYXRpb24oYik7aWYoIWUpdGhyb3dcIkFuaW1hdGlvbiBub3QgZm91bmQ6IFwiK2I7cmV0dXJuIHRoaXMuYWRkQW5pbWF0aW9uKGEsZSxjLGQpfSxhZGRBbmltYXRpb246ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGY9bmV3IGMuVHJhY2tFbnRyeTtmLmFuaW1hdGlvbj1iLGYubG9vcD1kLGYuZW5kVGltZT1iLmR1cmF0aW9uO3ZhciBnPXRoaXMuX2V4cGFuZFRvSW5kZXgoYSk7aWYoZyl7Zm9yKDtnLm5leHQ7KWc9Zy5uZXh0O2cubmV4dD1mfWVsc2UgdGhpcy50cmFja3NbYV09ZjtyZXR1cm4gMD49ZSYmKGc/ZSs9Zy5lbmRUaW1lLXRoaXMuZGF0YS5nZXRNaXgoZy5hbmltYXRpb24sYik6ZT0wKSxmLmRlbGF5PWUsZn0sZ2V0Q3VycmVudDpmdW5jdGlvbihhKXtyZXR1cm4gYT49dGhpcy50cmFja3MubGVuZ3RoP251bGw6dGhpcy50cmFja3NbYV19fSxjLlNrZWxldG9uSnNvbj1mdW5jdGlvbihhKXt0aGlzLmF0dGFjaG1lbnRMb2FkZXI9YX0sYy5Ta2VsZXRvbkpzb24ucHJvdG90eXBlPXtzY2FsZToxLHJlYWRTa2VsZXRvbkRhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgYy5Ta2VsZXRvbkRhdGE7ZC5uYW1lPWI7dmFyIGU9YS5za2VsZXRvbjtlJiYoZC5oYXNoPWUuaGFzaCxkLnZlcnNpb249ZS5zcGluZSxkLndpZHRoPWUud2lkdGh8fDAsZC5oZWlnaHQ9ZS5oZWlnaHR8fDApO2Zvcih2YXIgZj1hLmJvbmVzLGc9MCxoPWYubGVuZ3RoO2g+ZztnKyspe3ZhciBpPWZbZ10saj1udWxsO2lmKGkucGFyZW50JiYoaj1kLmZpbmRCb25lKGkucGFyZW50KSwhaikpdGhyb3dcIlBhcmVudCBib25lIG5vdCBmb3VuZDogXCIraS5wYXJlbnQ7dmFyIGs9bmV3IGMuQm9uZURhdGEoaS5uYW1lLGopO2subGVuZ3RoPShpLmxlbmd0aHx8MCkqdGhpcy5zY2FsZSxrLng9KGkueHx8MCkqdGhpcy5zY2FsZSxrLnk9KGkueXx8MCkqdGhpcy5zY2FsZSxrLnJvdGF0aW9uPWkucm90YXRpb258fDAsay5zY2FsZVg9aS5oYXNPd25Qcm9wZXJ0eShcInNjYWxlWFwiKT9pLnNjYWxlWDoxLGsuc2NhbGVZPWkuaGFzT3duUHJvcGVydHkoXCJzY2FsZVlcIik/aS5zY2FsZVk6MSxrLmluaGVyaXRTY2FsZT1pLmhhc093blByb3BlcnR5KFwiaW5oZXJpdFNjYWxlXCIpP2kuaW5oZXJpdFNjYWxlOiEwLGsuaW5oZXJpdFJvdGF0aW9uPWkuaGFzT3duUHJvcGVydHkoXCJpbmhlcml0Um90YXRpb25cIik/aS5pbmhlcml0Um90YXRpb246ITAsZC5ib25lcy5wdXNoKGspfXZhciBsPWEuaWs7aWYobClmb3IodmFyIGc9MCxoPWwubGVuZ3RoO2g+ZztnKyspe2Zvcih2YXIgbT1sW2ddLG49bmV3IGMuSWtDb25zdHJhaW50RGF0YShtLm5hbWUpLGY9bS5ib25lcyxvPTAscD1mLmxlbmd0aDtwPm87bysrKXt2YXIgcT1kLmZpbmRCb25lKGZbb10pO2lmKCFxKXRocm93XCJJSyBib25lIG5vdCBmb3VuZDogXCIrZltvXTtuLmJvbmVzLnB1c2gocSl9aWYobi50YXJnZXQ9ZC5maW5kQm9uZShtLnRhcmdldCksIW4udGFyZ2V0KXRocm93XCJUYXJnZXQgYm9uZSBub3QgZm91bmQ6IFwiK20udGFyZ2V0O24uYmVuZERpcmVjdGlvbj0hbS5oYXNPd25Qcm9wZXJ0eShcImJlbmRQb3NpdGl2ZVwiKXx8bS5iZW5kUG9zaXRpdmU/MTotMSxuLm1peD1tLmhhc093blByb3BlcnR5KFwibWl4XCIpP20ubWl4OjEsZC5pa0NvbnN0cmFpbnRzLnB1c2gobil9Zm9yKHZhciByPWEuc2xvdHMsZz0wLGg9ci5sZW5ndGg7aD5nO2crKyl7dmFyIHM9cltnXSxrPWQuZmluZEJvbmUocy5ib25lKTtpZighayl0aHJvd1wiU2xvdCBib25lIG5vdCBmb3VuZDogXCIrcy5ib25lO3ZhciB0PW5ldyBjLlNsb3REYXRhKHMubmFtZSxrKSx1PXMuY29sb3I7dSYmKHQucj10aGlzLnRvQ29sb3IodSwwKSx0Lmc9dGhpcy50b0NvbG9yKHUsMSksdC5iPXRoaXMudG9Db2xvcih1LDIpLHQuYT10aGlzLnRvQ29sb3IodSwzKSksdC5hdHRhY2htZW50TmFtZT1zLmF0dGFjaG1lbnQsdC5hZGRpdGl2ZUJsZW5kaW5nPXMuYWRkaXRpdmUmJlwidHJ1ZVwiPT1zLmFkZGl0aXZlLGQuc2xvdHMucHVzaCh0KX12YXIgdj1hLnNraW5zO2Zvcih2YXIgdyBpbiB2KWlmKHYuaGFzT3duUHJvcGVydHkodykpe3ZhciB4PXZbd10seT1uZXcgYy5Ta2luKHcpO2Zvcih2YXIgeiBpbiB4KWlmKHguaGFzT3duUHJvcGVydHkoeikpe3ZhciBBPWQuZmluZFNsb3RJbmRleCh6KSxCPXhbel07Zm9yKHZhciBDIGluIEIpaWYoQi5oYXNPd25Qcm9wZXJ0eShDKSl7dmFyIEQ9dGhpcy5yZWFkQXR0YWNobWVudCh5LEMsQltDXSk7RCYmeS5hZGRBdHRhY2htZW50KEEsQyxEKX19ZC5za2lucy5wdXNoKHkpLFwiZGVmYXVsdFwiPT15Lm5hbWUmJihkLmRlZmF1bHRTa2luPXkpfXZhciBFPWEuZXZlbnRzO2Zvcih2YXIgRiBpbiBFKWlmKEUuaGFzT3duUHJvcGVydHkoRikpe3ZhciBHPUVbRl0sSD1uZXcgYy5FdmVudERhdGEoRik7SC5pbnRWYWx1ZT1HW1wiaW50XCJdfHwwLEguZmxvYXRWYWx1ZT1HW1wiZmxvYXRcIl18fDAsSC5zdHJpbmdWYWx1ZT1HLnN0cmluZ3x8bnVsbCxkLmV2ZW50cy5wdXNoKEgpfXZhciBJPWEuYW5pbWF0aW9ucztmb3IodmFyIEogaW4gSSlJLmhhc093blByb3BlcnR5KEopJiZ0aGlzLnJlYWRBbmltYXRpb24oSixJW0pdLGQpO3JldHVybiBkfSxyZWFkQXR0YWNobWVudDpmdW5jdGlvbihhLGIsZCl7Yj1kLm5hbWV8fGI7dmFyIGU9Yy5BdHRhY2htZW50VHlwZVtkLnR5cGV8fFwicmVnaW9uXCJdLGY9ZC5wYXRofHxiLGc9dGhpcy5zY2FsZTtpZihlPT1jLkF0dGFjaG1lbnRUeXBlLnJlZ2lvbil7dmFyIGg9dGhpcy5hdHRhY2htZW50TG9hZGVyLm5ld1JlZ2lvbkF0dGFjaG1lbnQoYSxiLGYpO2lmKCFoKXJldHVybiBudWxsO2gucGF0aD1mLGgueD0oZC54fHwwKSpnLGgueT0oZC55fHwwKSpnLGguc2NhbGVYPWQuaGFzT3duUHJvcGVydHkoXCJzY2FsZVhcIik/ZC5zY2FsZVg6MSxoLnNjYWxlWT1kLmhhc093blByb3BlcnR5KFwic2NhbGVZXCIpP2Quc2NhbGVZOjEsaC5yb3RhdGlvbj1kLnJvdGF0aW9ufHwwLGgud2lkdGg9KGQud2lkdGh8fDApKmcsaC5oZWlnaHQ9KGQuaGVpZ2h0fHwwKSpnO3ZhciBpPWQuY29sb3I7cmV0dXJuIGkmJihoLnI9dGhpcy50b0NvbG9yKGksMCksaC5nPXRoaXMudG9Db2xvcihpLDEpLGguYj10aGlzLnRvQ29sb3IoaSwyKSxoLmE9dGhpcy50b0NvbG9yKGksMykpLGgudXBkYXRlT2Zmc2V0KCksaH1pZihlPT1jLkF0dGFjaG1lbnRUeXBlLm1lc2gpe3ZhciBqPXRoaXMuYXR0YWNobWVudExvYWRlci5uZXdNZXNoQXR0YWNobWVudChhLGIsZik7cmV0dXJuIGo/KGoucGF0aD1mLGoudmVydGljZXM9dGhpcy5nZXRGbG9hdEFycmF5KGQsXCJ2ZXJ0aWNlc1wiLGcpLGoudHJpYW5nbGVzPXRoaXMuZ2V0SW50QXJyYXkoZCxcInRyaWFuZ2xlc1wiKSxqLnJlZ2lvblVWcz10aGlzLmdldEZsb2F0QXJyYXkoZCxcInV2c1wiLDEpLGoudXBkYXRlVVZzKCksaT1kLmNvbG9yLGkmJihqLnI9dGhpcy50b0NvbG9yKGksMCksai5nPXRoaXMudG9Db2xvcihpLDEpLGouYj10aGlzLnRvQ29sb3IoaSwyKSxqLmE9dGhpcy50b0NvbG9yKGksMykpLGouaHVsbExlbmd0aD0yKihkLmh1bGx8fDApLGQuZWRnZXMmJihqLmVkZ2VzPXRoaXMuZ2V0SW50QXJyYXkoZCxcImVkZ2VzXCIpKSxqLndpZHRoPShkLndpZHRofHwwKSpnLGouaGVpZ2h0PShkLmhlaWdodHx8MCkqZyxqKTpudWxsfWlmKGU9PWMuQXR0YWNobWVudFR5cGUuc2tpbm5lZG1lc2gpe3ZhciBqPXRoaXMuYXR0YWNobWVudExvYWRlci5uZXdTa2lubmVkTWVzaEF0dGFjaG1lbnQoYSxiLGYpO2lmKCFqKXJldHVybiBudWxsO2oucGF0aD1mO2Zvcih2YXIgaz10aGlzLmdldEZsb2F0QXJyYXkoZCxcInV2c1wiLDEpLGw9dGhpcy5nZXRGbG9hdEFycmF5KGQsXCJ2ZXJ0aWNlc1wiLDEpLG09W10sbj1bXSxvPTAscD1sLmxlbmd0aDtwPm87KXt2YXIgcT0wfGxbbysrXTtuW24ubGVuZ3RoXT1xO2Zvcih2YXIgcj1vKzQqcTtyPm87KW5bbi5sZW5ndGhdPWxbb10sbVttLmxlbmd0aF09bFtvKzFdKmcsbVttLmxlbmd0aF09bFtvKzJdKmcsbVttLmxlbmd0aF09bFtvKzNdLG8rPTR9cmV0dXJuIGouYm9uZXM9bixqLndlaWdodHM9bSxqLnRyaWFuZ2xlcz10aGlzLmdldEludEFycmF5KGQsXCJ0cmlhbmdsZXNcIiksai5yZWdpb25VVnM9ayxqLnVwZGF0ZVVWcygpLGk9ZC5jb2xvcixpJiYoai5yPXRoaXMudG9Db2xvcihpLDApLGouZz10aGlzLnRvQ29sb3IoaSwxKSxqLmI9dGhpcy50b0NvbG9yKGksMiksai5hPXRoaXMudG9Db2xvcihpLDMpKSxqLmh1bGxMZW5ndGg9MiooZC5odWxsfHwwKSxkLmVkZ2VzJiYoai5lZGdlcz10aGlzLmdldEludEFycmF5KGQsXCJlZGdlc1wiKSksai53aWR0aD0oZC53aWR0aHx8MCkqZyxqLmhlaWdodD0oZC5oZWlnaHR8fDApKmcsalxufWlmKGU9PWMuQXR0YWNobWVudFR5cGUuYm91bmRpbmdib3gpe2Zvcih2YXIgcz10aGlzLmF0dGFjaG1lbnRMb2FkZXIubmV3Qm91bmRpbmdCb3hBdHRhY2htZW50KGEsYiksbD1kLnZlcnRpY2VzLG89MCxwPWwubGVuZ3RoO3A+bztvKyspcy52ZXJ0aWNlcy5wdXNoKGxbb10qZyk7cmV0dXJuIHN9dGhyb3dcIlVua25vd24gYXR0YWNobWVudCB0eXBlOiBcIitlfSxyZWFkQW5pbWF0aW9uOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1bXSxmPTAsZz1iLnNsb3RzO2Zvcih2YXIgaCBpbiBnKWlmKGcuaGFzT3duUHJvcGVydHkoaCkpe3ZhciBpPWdbaF0saj1kLmZpbmRTbG90SW5kZXgoaCk7Zm9yKHZhciBrIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShrKSl7dmFyIGw9aVtrXTtpZihcImNvbG9yXCI9PWspe3ZhciBtPW5ldyBjLkNvbG9yVGltZWxpbmUobC5sZW5ndGgpO20uc2xvdEluZGV4PWo7Zm9yKHZhciBuPTAsbz0wLHA9bC5sZW5ndGg7cD5vO28rKyl7dmFyIHE9bFtvXSxyPXEuY29sb3Iscz10aGlzLnRvQ29sb3IociwwKSx0PXRoaXMudG9Db2xvcihyLDEpLHU9dGhpcy50b0NvbG9yKHIsMiksdj10aGlzLnRvQ29sb3IociwzKTttLnNldEZyYW1lKG4scS50aW1lLHMsdCx1LHYpLHRoaXMucmVhZEN1cnZlKG0sbixxKSxuKyt9ZS5wdXNoKG0pLGY9TWF0aC5tYXgoZixtLmZyYW1lc1s1Km0uZ2V0RnJhbWVDb3VudCgpLTVdKX1lbHNle2lmKFwiYXR0YWNobWVudFwiIT1rKXRocm93XCJJbnZhbGlkIHRpbWVsaW5lIHR5cGUgZm9yIGEgc2xvdDogXCIraytcIiAoXCIraCtcIilcIjt2YXIgbT1uZXcgYy5BdHRhY2htZW50VGltZWxpbmUobC5sZW5ndGgpO20uc2xvdEluZGV4PWo7Zm9yKHZhciBuPTAsbz0wLHA9bC5sZW5ndGg7cD5vO28rKyl7dmFyIHE9bFtvXTttLnNldEZyYW1lKG4rKyxxLnRpbWUscS5uYW1lKX1lLnB1c2gobSksZj1NYXRoLm1heChmLG0uZnJhbWVzW20uZ2V0RnJhbWVDb3VudCgpLTFdKX19fXZhciB3PWIuYm9uZXM7Zm9yKHZhciB4IGluIHcpaWYody5oYXNPd25Qcm9wZXJ0eSh4KSl7dmFyIHk9ZC5maW5kQm9uZUluZGV4KHgpO2lmKC0xPT15KXRocm93XCJCb25lIG5vdCBmb3VuZDogXCIreDt2YXIgej13W3hdO2Zvcih2YXIgayBpbiB6KWlmKHouaGFzT3duUHJvcGVydHkoaykpe3ZhciBsPXpba107aWYoXCJyb3RhdGVcIj09ayl7dmFyIG09bmV3IGMuUm90YXRlVGltZWxpbmUobC5sZW5ndGgpO20uYm9uZUluZGV4PXk7Zm9yKHZhciBuPTAsbz0wLHA9bC5sZW5ndGg7cD5vO28rKyl7dmFyIHE9bFtvXTttLnNldEZyYW1lKG4scS50aW1lLHEuYW5nbGUpLHRoaXMucmVhZEN1cnZlKG0sbixxKSxuKyt9ZS5wdXNoKG0pLGY9TWF0aC5tYXgoZixtLmZyYW1lc1syKm0uZ2V0RnJhbWVDb3VudCgpLTJdKX1lbHNlIGlmKFwidHJhbnNsYXRlXCI9PWt8fFwic2NhbGVcIj09ayl7dmFyIG0sQT0xO1wic2NhbGVcIj09az9tPW5ldyBjLlNjYWxlVGltZWxpbmUobC5sZW5ndGgpOihtPW5ldyBjLlRyYW5zbGF0ZVRpbWVsaW5lKGwubGVuZ3RoKSxBPXRoaXMuc2NhbGUpLG0uYm9uZUluZGV4PXk7Zm9yKHZhciBuPTAsbz0wLHA9bC5sZW5ndGg7cD5vO28rKyl7dmFyIHE9bFtvXSxCPShxLnh8fDApKkEsQz0ocS55fHwwKSpBO20uc2V0RnJhbWUobixxLnRpbWUsQixDKSx0aGlzLnJlYWRDdXJ2ZShtLG4scSksbisrfWUucHVzaChtKSxmPU1hdGgubWF4KGYsbS5mcmFtZXNbMyptLmdldEZyYW1lQ291bnQoKS0zXSl9ZWxzZXtpZihcImZsaXBYXCIhPWsmJlwiZmxpcFlcIiE9ayl0aHJvd1wiSW52YWxpZCB0aW1lbGluZSB0eXBlIGZvciBhIGJvbmU6IFwiK2srXCIgKFwiK3grXCIpXCI7dmFyIEI9XCJmbGlwWFwiPT1rLG09Qj9uZXcgYy5GbGlwWFRpbWVsaW5lKGwubGVuZ3RoKTpuZXcgYy5GbGlwWVRpbWVsaW5lKGwubGVuZ3RoKTttLmJvbmVJbmRleD15O2Zvcih2YXIgRD1CP1wieFwiOlwieVwiLG49MCxvPTAscD1sLmxlbmd0aDtwPm87bysrKXt2YXIgcT1sW29dO20uc2V0RnJhbWUobixxLnRpbWUscVtEXXx8ITEpLG4rK31lLnB1c2gobSksZj1NYXRoLm1heChmLG0uZnJhbWVzWzIqbS5nZXRGcmFtZUNvdW50KCktMl0pfX19dmFyIEU9Yi5paztmb3IodmFyIEYgaW4gRSlpZihFLmhhc093blByb3BlcnR5KEYpKXt2YXIgRz1kLmZpbmRJa0NvbnN0cmFpbnQoRiksbD1FW0ZdLG09bmV3IGMuSWtDb25zdHJhaW50VGltZWxpbmUobC5sZW5ndGgpO20uaWtDb25zdHJhaW50SW5kZXg9ZC5pa0NvbnN0cmFpbnRzLmluZGV4T2YoRyk7Zm9yKHZhciBuPTAsbz0wLHA9bC5sZW5ndGg7cD5vO28rKyl7dmFyIHE9bFtvXSxIPXEuaGFzT3duUHJvcGVydHkoXCJtaXhcIik/cS5taXg6MSxJPSFxLmhhc093blByb3BlcnR5KFwiYmVuZFBvc2l0aXZlXCIpfHxxLmJlbmRQb3NpdGl2ZT8xOi0xO20uc2V0RnJhbWUobixxLnRpbWUsSCxJKSx0aGlzLnJlYWRDdXJ2ZShtLG4scSksbisrfWUucHVzaChtKSxmPU1hdGgubWF4KGYsbS5mcmFtZXNbMyptLmZyYW1lQ291bnQtM10pfXZhciBKPWIuZmZkO2Zvcih2YXIgSyBpbiBKKXt2YXIgTD1kLmZpbmRTa2luKEspLGk9SltLXTtmb3IoaCBpbiBpKXt2YXIgaj1kLmZpbmRTbG90SW5kZXgoaCksTT1pW2hdO2Zvcih2YXIgTiBpbiBNKXt2YXIgbD1NW05dLG09bmV3IGMuRmZkVGltZWxpbmUobC5sZW5ndGgpLE89TC5nZXRBdHRhY2htZW50KGosTik7aWYoIU8pdGhyb3dcIkZGRCBhdHRhY2htZW50IG5vdCBmb3VuZDogXCIrTjttLnNsb3RJbmRleD1qLG0uYXR0YWNobWVudD1PO3ZhciBQLFE9Ty50eXBlPT1jLkF0dGFjaG1lbnRUeXBlLm1lc2g7UD1RP08udmVydGljZXMubGVuZ3RoOk8ud2VpZ2h0cy5sZW5ndGgvMyoyO2Zvcih2YXIgbj0wLG89MCxwPWwubGVuZ3RoO3A+bztvKyspe3ZhciBSLHE9bFtvXTtpZihxLnZlcnRpY2VzKXt2YXIgUz1xLnZlcnRpY2VzLFI9W107Ui5sZW5ndGg9UDt2YXIgVD1xLm9mZnNldHx8MCxVPVMubGVuZ3RoO2lmKDE9PXRoaXMuc2NhbGUpZm9yKHZhciBWPTA7VT5WO1YrKylSW1YrVF09U1tWXTtlbHNlIGZvcih2YXIgVj0wO1U+VjtWKyspUltWK1RdPVNbVl0qdGhpcy5zY2FsZTtpZihRKWZvcih2YXIgVz1PLnZlcnRpY2VzLFY9MCxVPVIubGVuZ3RoO1U+VjtWKyspUltWXSs9V1tWXX1lbHNlIFE/Uj1PLnZlcnRpY2VzOihSPVtdLFIubGVuZ3RoPVApO20uc2V0RnJhbWUobixxLnRpbWUsUiksdGhpcy5yZWFkQ3VydmUobSxuLHEpLG4rK31lW2UubGVuZ3RoXT1tLGY9TWF0aC5tYXgoZixtLmZyYW1lc1ttLmZyYW1lQ291bnQtMV0pfX19dmFyIFg9Yi5kcmF3T3JkZXI7aWYoWHx8KFg9Yi5kcmF3b3JkZXIpLFgpe2Zvcih2YXIgbT1uZXcgYy5EcmF3T3JkZXJUaW1lbGluZShYLmxlbmd0aCksWT1kLnNsb3RzLmxlbmd0aCxuPTAsbz0wLHA9WC5sZW5ndGg7cD5vO28rKyl7dmFyIFo9WFtvXSwkPW51bGw7aWYoWi5vZmZzZXRzKXskPVtdLCQubGVuZ3RoPVk7Zm9yKHZhciBWPVktMTtWPj0wO1YtLSkkW1ZdPS0xO3ZhciBfPVoub2Zmc2V0cyxhYj1bXTthYi5sZW5ndGg9WS1fLmxlbmd0aDtmb3IodmFyIGJiPTAsY2I9MCxWPTAsVT1fLmxlbmd0aDtVPlY7VisrKXt2YXIgZGI9X1tWXSxqPWQuZmluZFNsb3RJbmRleChkYi5zbG90KTtpZigtMT09ail0aHJvd1wiU2xvdCBub3QgZm91bmQ6IFwiK2RiLnNsb3Q7Zm9yKDtiYiE9ajspYWJbY2IrK109YmIrKzskW2JiK2RiLm9mZnNldF09YmIrK31mb3IoO1k+YmI7KWFiW2NiKytdPWJiKys7Zm9yKHZhciBWPVktMTtWPj0wO1YtLSktMT09JFtWXSYmKCRbVl09YWJbLS1jYl0pfW0uc2V0RnJhbWUobisrLFoudGltZSwkKX1lLnB1c2gobSksZj1NYXRoLm1heChmLG0uZnJhbWVzW20uZ2V0RnJhbWVDb3VudCgpLTFdKX12YXIgZWI9Yi5ldmVudHM7aWYoZWIpe2Zvcih2YXIgbT1uZXcgYy5FdmVudFRpbWVsaW5lKGViLmxlbmd0aCksbj0wLG89MCxwPWViLmxlbmd0aDtwPm87bysrKXt2YXIgZmI9ZWJbb10sZ2I9ZC5maW5kRXZlbnQoZmIubmFtZSk7aWYoIWdiKXRocm93XCJFdmVudCBub3QgZm91bmQ6IFwiK2ZiLm5hbWU7dmFyIGhiPW5ldyBjLkV2ZW50KGdiKTtoYi5pbnRWYWx1ZT1mYi5oYXNPd25Qcm9wZXJ0eShcImludFwiKT9mYltcImludFwiXTpnYi5pbnRWYWx1ZSxoYi5mbG9hdFZhbHVlPWZiLmhhc093blByb3BlcnR5KFwiZmxvYXRcIik/ZmJbXCJmbG9hdFwiXTpnYi5mbG9hdFZhbHVlLGhiLnN0cmluZ1ZhbHVlPWZiLmhhc093blByb3BlcnR5KFwic3RyaW5nXCIpP2ZiLnN0cmluZzpnYi5zdHJpbmdWYWx1ZSxtLnNldEZyYW1lKG4rKyxmYi50aW1lLGhiKX1lLnB1c2gobSksZj1NYXRoLm1heChmLG0uZnJhbWVzW20uZ2V0RnJhbWVDb3VudCgpLTFdKX1kLmFuaW1hdGlvbnMucHVzaChuZXcgYy5BbmltYXRpb24oYSxlLGYpKX0scmVhZEN1cnZlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jLmN1cnZlO2Q/XCJzdGVwcGVkXCI9PWQ/YS5jdXJ2ZXMuc2V0U3RlcHBlZChiKTpkIGluc3RhbmNlb2YgQXJyYXkmJmEuY3VydmVzLnNldEN1cnZlKGIsZFswXSxkWzFdLGRbMl0sZFszXSk6YS5jdXJ2ZXMuc2V0TGluZWFyKGIpfSx0b0NvbG9yOmZ1bmN0aW9uKGEsYil7aWYoOCE9YS5sZW5ndGgpdGhyb3dcIkNvbG9yIGhleGlkZWNpbWFsIGxlbmd0aCBtdXN0IGJlIDgsIHJlY2lldmVkOiBcIithO3JldHVybiBwYXJzZUludChhLnN1YnN0cmluZygyKmIsMipiKzIpLDE2KS8yNTV9LGdldEZsb2F0QXJyYXk6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWFbYl0sZj1uZXcgYy5GbG9hdDMyQXJyYXkoZS5sZW5ndGgpLGc9MCxoPWUubGVuZ3RoO2lmKDE9PWQpZm9yKDtoPmc7ZysrKWZbZ109ZVtnXTtlbHNlIGZvcig7aD5nO2crKylmW2ddPWVbZ10qZDtyZXR1cm4gZn0sZ2V0SW50QXJyYXk6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9YVtiXSxlPW5ldyBjLlVpbnQxNkFycmF5KGQubGVuZ3RoKSxmPTAsZz1kLmxlbmd0aDtnPmY7ZisrKWVbZl09MHxkW2ZdO3JldHVybiBlfX0sYy5BdGxhcz1mdW5jdGlvbihhLGIpe3RoaXMudGV4dHVyZUxvYWRlcj1iLHRoaXMucGFnZXM9W10sdGhpcy5yZWdpb25zPVtdO3ZhciBkPW5ldyBjLkF0bGFzUmVhZGVyKGEpLGU9W107ZS5sZW5ndGg9NDtmb3IodmFyIGY9bnVsbDs7KXt2YXIgZz1kLnJlYWRMaW5lKCk7aWYobnVsbD09PWcpYnJlYWs7aWYoZz1kLnRyaW0oZyksZy5sZW5ndGgpaWYoZil7dmFyIGg9bmV3IGMuQXRsYXNSZWdpb247aC5uYW1lPWcsaC5wYWdlPWYsaC5yb3RhdGU9XCJ0cnVlXCI9PWQucmVhZFZhbHVlKCksZC5yZWFkVHVwbGUoZSk7dmFyIGk9cGFyc2VJbnQoZVswXSksaj1wYXJzZUludChlWzFdKTtkLnJlYWRUdXBsZShlKTt2YXIgaz1wYXJzZUludChlWzBdKSxsPXBhcnNlSW50KGVbMV0pO2gudT1pL2Yud2lkdGgsaC52PWovZi5oZWlnaHQsaC5yb3RhdGU/KGgudTI9KGkrbCkvZi53aWR0aCxoLnYyPShqK2spL2YuaGVpZ2h0KTooaC51Mj0oaStrKS9mLndpZHRoLGgudjI9KGorbCkvZi5oZWlnaHQpLGgueD1pLGgueT1qLGgud2lkdGg9TWF0aC5hYnMoayksaC5oZWlnaHQ9TWF0aC5hYnMobCksND09ZC5yZWFkVHVwbGUoZSkmJihoLnNwbGl0cz1bcGFyc2VJbnQoZVswXSkscGFyc2VJbnQoZVsxXSkscGFyc2VJbnQoZVsyXSkscGFyc2VJbnQoZVszXSldLDQ9PWQucmVhZFR1cGxlKGUpJiYoaC5wYWRzPVtwYXJzZUludChlWzBdKSxwYXJzZUludChlWzFdKSxwYXJzZUludChlWzJdKSxwYXJzZUludChlWzNdKV0sZC5yZWFkVHVwbGUoZSkpKSxoLm9yaWdpbmFsV2lkdGg9cGFyc2VJbnQoZVswXSksaC5vcmlnaW5hbEhlaWdodD1wYXJzZUludChlWzFdKSxkLnJlYWRUdXBsZShlKSxoLm9mZnNldFg9cGFyc2VJbnQoZVswXSksaC5vZmZzZXRZPXBhcnNlSW50KGVbMV0pLGguaW5kZXg9cGFyc2VJbnQoZC5yZWFkVmFsdWUoKSksdGhpcy5yZWdpb25zLnB1c2goaCl9ZWxzZXtmPW5ldyBjLkF0bGFzUGFnZSxmLm5hbWU9ZywyPT1kLnJlYWRUdXBsZShlKSYmKGYud2lkdGg9cGFyc2VJbnQoZVswXSksZi5oZWlnaHQ9cGFyc2VJbnQoZVsxXSksZC5yZWFkVHVwbGUoZSkpLGYuZm9ybWF0PWMuQXRsYXMuRm9ybWF0W2VbMF1dLGQucmVhZFR1cGxlKGUpLGYubWluRmlsdGVyPWMuQXRsYXMuVGV4dHVyZUZpbHRlcltlWzBdXSxmLm1hZ0ZpbHRlcj1jLkF0bGFzLlRleHR1cmVGaWx0ZXJbZVsxXV07dmFyIG09ZC5yZWFkVmFsdWUoKTtmLnVXcmFwPWMuQXRsYXMuVGV4dHVyZVdyYXAuY2xhbXBUb0VkZ2UsZi52V3JhcD1jLkF0bGFzLlRleHR1cmVXcmFwLmNsYW1wVG9FZGdlLFwieFwiPT1tP2YudVdyYXA9Yy5BdGxhcy5UZXh0dXJlV3JhcC5yZXBlYXQ6XCJ5XCI9PW0/Zi52V3JhcD1jLkF0bGFzLlRleHR1cmVXcmFwLnJlcGVhdDpcInh5XCI9PW0mJihmLnVXcmFwPWYudldyYXA9Yy5BdGxhcy5UZXh0dXJlV3JhcC5yZXBlYXQpLGIubG9hZChmLGcsdGhpcyksdGhpcy5wYWdlcy5wdXNoKGYpfWVsc2UgZj1udWxsfX0sYy5BdGxhcy5wcm90b3R5cGU9e2ZpbmRSZWdpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMucmVnaW9ucyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWlmKGJbY10ubmFtZT09YSlyZXR1cm4gYltjXTtyZXR1cm4gbnVsbH0sZGlzcG9zZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnBhZ2VzLGI9MCxjPWEubGVuZ3RoO2M+YjtiKyspdGhpcy50ZXh0dXJlTG9hZGVyLnVubG9hZChhW2JdLnJlbmRlcmVyT2JqZWN0KX0sdXBkYXRlVVZzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLnJlZ2lvbnMsYz0wLGQ9Yi5sZW5ndGg7ZD5jO2MrKyl7dmFyIGU9YltjXTtlLnBhZ2U9PWEmJihlLnU9ZS54L2Eud2lkdGgsZS52PWUueS9hLmhlaWdodCxlLnJvdGF0ZT8oZS51Mj0oZS54K2UuaGVpZ2h0KS9hLndpZHRoLGUudjI9KGUueStlLndpZHRoKS9hLmhlaWdodCk6KGUudTI9KGUueCtlLndpZHRoKS9hLndpZHRoLGUudjI9KGUueStlLmhlaWdodCkvYS5oZWlnaHQpKX19fSxjLkF0bGFzLkZvcm1hdD17YWxwaGE6MCxpbnRlbnNpdHk6MSxsdW1pbmFuY2VBbHBoYToyLHJnYjU2NTozLHJnYmE0NDQ0OjQscmdiODg4OjUscmdiYTg4ODg6Nn0sYy5BdGxhcy5UZXh0dXJlRmlsdGVyPXtuZWFyZXN0OjAsbGluZWFyOjEsbWlwTWFwOjIsbWlwTWFwTmVhcmVzdE5lYXJlc3Q6MyxtaXBNYXBMaW5lYXJOZWFyZXN0OjQsbWlwTWFwTmVhcmVzdExpbmVhcjo1LG1pcE1hcExpbmVhckxpbmVhcjo2fSxjLkF0bGFzLlRleHR1cmVXcmFwPXttaXJyb3JlZFJlcGVhdDowLGNsYW1wVG9FZGdlOjEscmVwZWF0OjJ9LGMuQXRsYXNQYWdlPWZ1bmN0aW9uKCl7fSxjLkF0bGFzUGFnZS5wcm90b3R5cGU9e25hbWU6bnVsbCxmb3JtYXQ6bnVsbCxtaW5GaWx0ZXI6bnVsbCxtYWdGaWx0ZXI6bnVsbCx1V3JhcDpudWxsLHZXcmFwOm51bGwscmVuZGVyZXJPYmplY3Q6bnVsbCx3aWR0aDowLGhlaWdodDowfSxjLkF0bGFzUmVnaW9uPWZ1bmN0aW9uKCl7fSxjLkF0bGFzUmVnaW9uLnByb3RvdHlwZT17cGFnZTpudWxsLG5hbWU6bnVsbCx4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjAsdTowLHY6MCx1MjowLHYyOjAsb2Zmc2V0WDowLG9mZnNldFk6MCxvcmlnaW5hbFdpZHRoOjAsb3JpZ2luYWxIZWlnaHQ6MCxpbmRleDowLHJvdGF0ZTohMSxzcGxpdHM6bnVsbCxwYWRzOm51bGx9LGMuQXRsYXNSZWFkZXI9ZnVuY3Rpb24oYSl7dGhpcy5saW5lcz1hLnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pfSxjLkF0bGFzUmVhZGVyLnByb3RvdHlwZT17aW5kZXg6MCx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIil9LHJlYWRMaW5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXg+PXRoaXMubGluZXMubGVuZ3RoP251bGw6dGhpcy5saW5lc1t0aGlzLmluZGV4KytdfSxyZWFkVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRMaW5lKCksYj1hLmluZGV4T2YoXCI6XCIpO2lmKC0xPT1iKXRocm93XCJJbnZhbGlkIGxpbmU6IFwiK2E7cmV0dXJuIHRoaXMudHJpbShhLnN1YnN0cmluZyhiKzEpKX0scmVhZFR1cGxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucmVhZExpbmUoKSxjPWIuaW5kZXhPZihcIjpcIik7aWYoLTE9PWMpdGhyb3dcIkludmFsaWQgbGluZTogXCIrYjtmb3IodmFyIGQ9MCxlPWMrMTszPmQ7ZCsrKXt2YXIgZj1iLmluZGV4T2YoXCIsXCIsZSk7aWYoLTE9PWYpYnJlYWs7YVtkXT10aGlzLnRyaW0oYi5zdWJzdHIoZSxmLWUpKSxlPWYrMX1yZXR1cm4gYVtkXT10aGlzLnRyaW0oYi5zdWJzdHJpbmcoZSkpLGQrMX19LGMuQXRsYXNBdHRhY2htZW50TG9hZGVyPWZ1bmN0aW9uKGEpe3RoaXMuYXRsYXM9YX0sYy5BdGxhc0F0dGFjaG1lbnRMb2FkZXIucHJvdG90eXBlPXtuZXdSZWdpb25BdHRhY2htZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT10aGlzLmF0bGFzLmZpbmRSZWdpb24oZCk7aWYoIWUpdGhyb3dcIlJlZ2lvbiBub3QgZm91bmQgaW4gYXRsYXM6IFwiK2QrXCIgKHJlZ2lvbiBhdHRhY2htZW50OiBcIitiK1wiKVwiO3ZhciBmPW5ldyBjLlJlZ2lvbkF0dGFjaG1lbnQoYik7cmV0dXJuIGYucmVuZGVyZXJPYmplY3Q9ZSxmLnNldFVWcyhlLnUsZS52LGUudTIsZS52MixlLnJvdGF0ZSksZi5yZWdpb25PZmZzZXRYPWUub2Zmc2V0WCxmLnJlZ2lvbk9mZnNldFk9ZS5vZmZzZXRZLGYucmVnaW9uV2lkdGg9ZS53aWR0aCxmLnJlZ2lvbkhlaWdodD1lLmhlaWdodCxmLnJlZ2lvbk9yaWdpbmFsV2lkdGg9ZS5vcmlnaW5hbFdpZHRoLGYucmVnaW9uT3JpZ2luYWxIZWlnaHQ9ZS5vcmlnaW5hbEhlaWdodCxmfSxuZXdNZXNoQXR0YWNobWVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9dGhpcy5hdGxhcy5maW5kUmVnaW9uKGQpO2lmKCFlKXRocm93XCJSZWdpb24gbm90IGZvdW5kIGluIGF0bGFzOiBcIitkK1wiIChtZXNoIGF0dGFjaG1lbnQ6IFwiK2IrXCIpXCI7dmFyIGY9bmV3IGMuTWVzaEF0dGFjaG1lbnQoYik7cmV0dXJuIGYucmVuZGVyZXJPYmplY3Q9ZSxmLnJlZ2lvblU9ZS51LGYucmVnaW9uVj1lLnYsZi5yZWdpb25VMj1lLnUyLGYucmVnaW9uVjI9ZS52MixmLnJlZ2lvblJvdGF0ZT1lLnJvdGF0ZSxmLnJlZ2lvbk9mZnNldFg9ZS5vZmZzZXRYLGYucmVnaW9uT2Zmc2V0WT1lLm9mZnNldFksZi5yZWdpb25XaWR0aD1lLndpZHRoLGYucmVnaW9uSGVpZ2h0PWUuaGVpZ2h0LGYucmVnaW9uT3JpZ2luYWxXaWR0aD1lLm9yaWdpbmFsV2lkdGgsZi5yZWdpb25PcmlnaW5hbEhlaWdodD1lLm9yaWdpbmFsSGVpZ2h0LGZ9LG5ld1NraW5uZWRNZXNoQXR0YWNobWVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9dGhpcy5hdGxhcy5maW5kUmVnaW9uKGQpO2lmKCFlKXRocm93XCJSZWdpb24gbm90IGZvdW5kIGluIGF0bGFzOiBcIitkK1wiIChza2lubmVkIG1lc2ggYXR0YWNobWVudDogXCIrYitcIilcIjt2YXIgZj1uZXcgYy5Ta2lubmVkTWVzaEF0dGFjaG1lbnQoYik7cmV0dXJuIGYucmVuZGVyZXJPYmplY3Q9ZSxmLnJlZ2lvblU9ZS51LGYucmVnaW9uVj1lLnYsZi5yZWdpb25VMj1lLnUyLGYucmVnaW9uVjI9ZS52MixmLnJlZ2lvblJvdGF0ZT1lLnJvdGF0ZSxmLnJlZ2lvbk9mZnNldFg9ZS5vZmZzZXRYLGYucmVnaW9uT2Zmc2V0WT1lLm9mZnNldFksZi5yZWdpb25XaWR0aD1lLndpZHRoLGYucmVnaW9uSGVpZ2h0PWUuaGVpZ2h0LGYucmVnaW9uT3JpZ2luYWxXaWR0aD1lLm9yaWdpbmFsV2lkdGgsZi5yZWdpb25PcmlnaW5hbEhlaWdodD1lLm9yaWdpbmFsSGVpZ2h0LGZ9LG5ld0JvdW5kaW5nQm94QXR0YWNobWVudDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgYy5Cb3VuZGluZ0JveEF0dGFjaG1lbnQoYil9fSxjLlNrZWxldG9uQm91bmRzPWZ1bmN0aW9uKCl7dGhpcy5wb2x5Z29uUG9vbD1bXSx0aGlzLnBvbHlnb25zPVtdLHRoaXMuYm91bmRpbmdCb3hlcz1bXX0sYy5Ta2VsZXRvbkJvdW5kcy5wcm90b3R5cGU9e21pblg6MCxtaW5ZOjAsbWF4WDowLG1heFk6MCx1cGRhdGU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnNsb3RzLGU9ZC5sZW5ndGgsZj1hLngsZz1hLnksaD10aGlzLmJvdW5kaW5nQm94ZXMsaT10aGlzLnBvbHlnb25Qb29sLGo9dGhpcy5wb2x5Z29ucztoLmxlbmd0aD0wO2Zvcih2YXIgaz0wLGw9ai5sZW5ndGg7bD5rO2srKylpLnB1c2goaltrXSk7ai5sZW5ndGg9MDtmb3IodmFyIGs9MDtlPms7aysrKXt2YXIgbT1kW2tdLG49bS5hdHRhY2htZW50O2lmKG4udHlwZT09Yy5BdHRhY2htZW50VHlwZS5ib3VuZGluZ2JveCl7aC5wdXNoKG4pO3ZhciBvLHA9aS5sZW5ndGg7cD4wPyhvPWlbcC0xXSxpLnNwbGljZShwLTEsMSkpOm89W10sai5wdXNoKG8pLG8ubGVuZ3RoPW4udmVydGljZXMubGVuZ3RoLG4uY29tcHV0ZVdvcmxkVmVydGljZXMoZixnLG0uYm9uZSxvKX19YiYmdGhpcy5hYWJiQ29tcHV0ZSgpfSxhYWJiQ29tcHV0ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnBvbHlnb25zLGI9TnVtYmVyLk1BWF9WQUxVRSxjPU51bWJlci5NQVhfVkFMVUUsZD1OdW1iZXIuTUlOX1ZBTFVFLGU9TnVtYmVyLk1JTl9WQUxVRSxmPTAsZz1hLmxlbmd0aDtnPmY7ZisrKWZvcih2YXIgaD1hW2ZdLGk9MCxqPWgubGVuZ3RoO2o+aTtpKz0yKXt2YXIgaz1oW2ldLGw9aFtpKzFdO2I9TWF0aC5taW4oYixrKSxjPU1hdGgubWluKGMsbCksZD1NYXRoLm1heChkLGspLGU9TWF0aC5tYXgoZSxsKX10aGlzLm1pblg9Yix0aGlzLm1pblk9Yyx0aGlzLm1heFg9ZCx0aGlzLm1heFk9ZX0sYWFiYkNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT49dGhpcy5taW5YJiZhPD10aGlzLm1heFgmJmI+PXRoaXMubWluWSYmYjw9dGhpcy5tYXhZfSxhYWJiSW50ZXJzZWN0c1NlZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy5taW5YLGY9dGhpcy5taW5ZLGc9dGhpcy5tYXhYLGg9dGhpcy5tYXhZO2lmKGU+PWEmJmU+PWN8fGY+PWImJmY+PWR8fGE+PWcmJmM+PWd8fGI+PWgmJmQ+PWgpcmV0dXJuITE7dmFyIGk9KGQtYikvKGMtYSksaj1pKihlLWEpK2I7aWYoaj5mJiZoPmopcmV0dXJuITA7aWYoaj1pKihnLWEpK2Isaj5mJiZoPmopcmV0dXJuITA7dmFyIGs9KGYtYikvaSthO3JldHVybiBrPmUmJmc+az8hMDooaz0oaC1iKS9pK2Esaz5lJiZnPms/ITA6ITEpfSxhYWJiSW50ZXJzZWN0c1NrZWxldG9uOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pblg8YS5tYXhYJiZ0aGlzLm1heFg+YS5taW5YJiZ0aGlzLm1pblk8YS5tYXhZJiZ0aGlzLm1heFk+YS5taW5ZfSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPXRoaXMucG9seWdvbnMsZD0wLGU9Yy5sZW5ndGg7ZT5kO2QrKylpZih0aGlzLnBvbHlnb25Db250YWluc1BvaW50KGNbZF0sYSxiKSlyZXR1cm4gdGhpcy5ib3VuZGluZ0JveGVzW2RdO3JldHVybiBudWxsfSxpbnRlcnNlY3RzU2VnbWVudDpmdW5jdGlvbihhLGIsYyxkKXtmb3IodmFyIGU9dGhpcy5wb2x5Z29ucyxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGVbZl0uaW50ZXJzZWN0c1NlZ21lbnQoYSxiLGMsZCkpcmV0dXJuIHRoaXMuYm91bmRpbmdCb3hlc1tmXTtyZXR1cm4gbnVsbH0scG9seWdvbkNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1hLmxlbmd0aCxlPWQtMixmPSExLGc9MDtkPmc7Zys9Mil7dmFyIGg9YVtnKzFdLGk9YVtlKzFdO2lmKGM+aCYmaT49Y3x8Yz5pJiZoPj1jKXt2YXIgaj1hW2ddO2orKGMtaCkvKGktaCkqKGFbZV0taik8YiYmKGY9IWYpfWU9Z31yZXR1cm4gZn0scG9seWdvbkludGVyc2VjdHNTZWdtZW50OmZ1bmN0aW9uKGEsYixjLGQsZSl7Zm9yKHZhciBmPWEubGVuZ3RoLGc9Yi1kLGg9Yy1lLGk9YiplLWMqZCxqPWFbZi0yXSxrPWFbZi0xXSxsPTA7Zj5sO2wrPTIpe3ZhciBtPWFbbF0sbj1hW2wrMV0sbz1qKm4tayptLHA9ai1tLHE9ay1uLHI9ZypxLWgqcCxzPShpKnAtZypvKS9yO2lmKChzPj1qJiZtPj1zfHxzPj1tJiZqPj1zKSYmKHM+PWImJmQ+PXN8fHM+PWQmJmI+PXMpKXt2YXIgdD0oaSpxLWgqbykvcjtpZigodD49ayYmbj49dHx8dD49biYmaz49dCkmJih0Pj1jJiZlPj10fHx0Pj1lJiZjPj10KSlyZXR1cm4hMH1qPW0saz1ufXJldHVybiExfSxnZXRQb2x5Z29uOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYm91bmRpbmdCb3hlcy5pbmRleE9mKGEpO3JldHVybi0xPT1iP251bGw6dGhpcy5wb2x5Z29uc1tiXX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXhYLXRoaXMubWluWH0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4WS10aGlzLm1pbll9fSxjLkJvbmUueURvd249ITAsYi5BbmltQ2FjaGU9e30sYi5TcGluZVRleHR1cmVMb2FkZXI9ZnVuY3Rpb24oYSxjKXtiLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyksdGhpcy5iYXNlUGF0aD1hLHRoaXMuY3Jvc3NvcmlnaW49Yyx0aGlzLmxvYWRpbmdDb3VudD0wfSxiLlNwaW5lVGV4dHVyZUxvYWRlci5wcm90b3R5cGU9Yi5TcGluZVRleHR1cmVMb2FkZXIsYi5TcGluZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSxjKXtpZihhLnJlbmRlcmVyT2JqZWN0PWIuQmFzZVRleHR1cmUuZnJvbUltYWdlKHRoaXMuYmFzZVBhdGgrXCIvXCIrYyx0aGlzLmNyb3Nzb3JpZ2luKSwhYS5yZW5kZXJlck9iamVjdC5oYXNMb2FkZWQpe3ZhciBkPXRoaXM7KytkLmxvYWRpbmdDb3VudCxhLnJlbmRlcmVyT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkZWRcIixmdW5jdGlvbigpey0tZC5sb2FkaW5nQ291bnQsZC5kaXNwYXRjaEV2ZW50KHt0eXBlOlwibG9hZGVkQmFzZVRleHR1cmVcIixjb250ZW50OmR9KX0pfX0sYi5TcGluZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLnVubG9hZD1mdW5jdGlvbihhKXthLmRlc3Ryb3koITApfSxiLlNwaW5lPWZ1bmN0aW9uKGEpe2lmKGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5jYWxsKHRoaXMpLHRoaXMuc3BpbmVEYXRhPWIuQW5pbUNhY2hlW2FdLCF0aGlzLnNwaW5lRGF0YSl0aHJvdyBuZXcgRXJyb3IoXCJTcGluZSBkYXRhIG11c3QgYmUgcHJlbG9hZGVkIHVzaW5nIFBJWEkuU3BpbmVMb2FkZXIgb3IgUElYSS5Bc3NldExvYWRlcjogXCIrYSk7dGhpcy5za2VsZXRvbj1uZXcgYy5Ta2VsZXRvbih0aGlzLnNwaW5lRGF0YSksdGhpcy5za2VsZXRvbi51cGRhdGVXb3JsZFRyYW5zZm9ybSgpLHRoaXMuc3RhdGVEYXRhPW5ldyBjLkFuaW1hdGlvblN0YXRlRGF0YSh0aGlzLnNwaW5lRGF0YSksdGhpcy5zdGF0ZT1uZXcgYy5BbmltYXRpb25TdGF0ZSh0aGlzLnN0YXRlRGF0YSksdGhpcy5zbG90Q29udGFpbmVycz1bXTtmb3IodmFyIGQ9MCxlPXRoaXMuc2tlbGV0b24uZHJhd09yZGVyLmxlbmd0aDtlPmQ7ZCsrKXt2YXIgZj10aGlzLnNrZWxldG9uLmRyYXdPcmRlcltkXSxnPWYuYXR0YWNobWVudCxoPW5ldyBiLkRpc3BsYXlPYmplY3RDb250YWluZXI7aWYodGhpcy5zbG90Q29udGFpbmVycy5wdXNoKGgpLHRoaXMuYWRkQ2hpbGQoaCksZyBpbnN0YW5jZW9mIGMuUmVnaW9uQXR0YWNobWVudCl7dmFyIGk9Zy5yZW5kZXJlck9iamVjdC5uYW1lLGo9dGhpcy5jcmVhdGVTcHJpdGUoZixnKTtmLmN1cnJlbnRTcHJpdGU9aixmLmN1cnJlbnRTcHJpdGVOYW1lPWksaC5hZGRDaGlsZChqKX1lbHNle2lmKCEoZyBpbnN0YW5jZW9mIGMuTWVzaEF0dGFjaG1lbnQpKWNvbnRpbnVlO3ZhciBrPXRoaXMuY3JlYXRlTWVzaChmLGcpO2YuY3VycmVudE1lc2g9ayxmLmN1cnJlbnRNZXNoTmFtZT1nLm5hbWUsaC5hZGRDaGlsZChrKX19dGhpcy5hdXRvVXBkYXRlPSEwfSxiLlNwaW5lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUpLGIuU3BpbmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuU3BpbmUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuU3BpbmUucHJvdG90eXBlLFwiYXV0b1VwZGF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVUcmFuc2Zvcm09PT1iLlNwaW5lLnByb3RvdHlwZS5hdXRvVXBkYXRlVHJhbnNmb3JtfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVUcmFuc2Zvcm09YT9iLlNwaW5lLnByb3RvdHlwZS5hdXRvVXBkYXRlVHJhbnNmb3JtOmIuRGlzcGxheU9iamVjdENvbnRhaW5lci5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtfX0pLGIuU3BpbmUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnN0YXRlLnVwZGF0ZShhKSx0aGlzLnN0YXRlLmFwcGx5KHRoaXMuc2tlbGV0b24pLHRoaXMuc2tlbGV0b24udXBkYXRlV29ybGRUcmFuc2Zvcm0oKTtmb3IodmFyIGQ9dGhpcy5za2VsZXRvbi5kcmF3T3JkZXIsZT0wLGY9ZC5sZW5ndGg7Zj5lO2UrKyl7dmFyIGc9ZFtlXSxoPWcuYXR0YWNobWVudCxpPXRoaXMuc2xvdENvbnRhaW5lcnNbZV07aWYoaCl7dmFyIGo9aC50eXBlO2lmKGo9PT1jLkF0dGFjaG1lbnRUeXBlLnJlZ2lvbil7aWYoaC5yZW5kZXJlck9iamVjdCYmKCFnLmN1cnJlbnRTcHJpdGVOYW1lfHxnLmN1cnJlbnRTcHJpdGVOYW1lIT09aC5uYW1lKSl7dmFyIGs9aC5yZW5kZXJlck9iamVjdC5uYW1lO2lmKHZvaWQgMCE9PWcuY3VycmVudFNwcml0ZSYmKGcuY3VycmVudFNwcml0ZS52aXNpYmxlPSExKSxnLnNwcml0ZXM9Zy5zcHJpdGVzfHx7fSx2b2lkIDAhPT1nLnNwcml0ZXNba10pZy5zcHJpdGVzW2tdLnZpc2libGU9ITA7ZWxzZXt2YXIgbD10aGlzLmNyZWF0ZVNwcml0ZShnLGgpO2kuYWRkQ2hpbGQobCl9Zy5jdXJyZW50U3ByaXRlPWcuc3ByaXRlc1trXSxnLmN1cnJlbnRTcHJpdGVOYW1lPWt9dmFyIG09Zy5ib25lO2kucG9zaXRpb24ueD1tLndvcmxkWCtoLngqbS5tMDAraC55Km0ubTAxLGkucG9zaXRpb24ueT1tLndvcmxkWStoLngqbS5tMTAraC55Km0ubTExLGkuc2NhbGUueD1tLndvcmxkU2NhbGVYLGkuc2NhbGUueT1tLndvcmxkU2NhbGVZLGkucm90YXRpb249LShnLmJvbmUud29ybGRSb3RhdGlvbipjLmRlZ1JhZCksZy5jdXJyZW50U3ByaXRlLnRpbnQ9Yi5yZ2IyaGV4KFtnLnIsZy5nLGcuYl0pfWVsc2V7aWYoaiE9PWMuQXR0YWNobWVudFR5cGUuc2tpbm5lZG1lc2gpe2kudmlzaWJsZT0hMTtjb250aW51ZX1pZighZy5jdXJyZW50TWVzaE5hbWV8fGcuY3VycmVudE1lc2hOYW1lIT09aC5uYW1lKXt2YXIgbj1oLm5hbWU7aWYodm9pZCAwIT09Zy5jdXJyZW50TWVzaCYmKGcuY3VycmVudE1lc2gudmlzaWJsZT0hMSksZy5tZXNoZXM9Zy5tZXNoZXN8fHt9LHZvaWQgMCE9PWcubWVzaGVzW25dKWcubWVzaGVzW25dLnZpc2libGU9ITA7ZWxzZXt2YXIgbz10aGlzLmNyZWF0ZU1lc2goZyxoKTtpLmFkZENoaWxkKG8pfWcuY3VycmVudE1lc2g9Zy5tZXNoZXNbbl0sZy5jdXJyZW50TWVzaE5hbWU9bn1oLmNvbXB1dGVXb3JsZFZlcnRpY2VzKGcuYm9uZS5za2VsZXRvbi54LGcuYm9uZS5za2VsZXRvbi55LGcsZy5jdXJyZW50TWVzaC52ZXJ0aWNlcyl9aS52aXNpYmxlPSEwLGkuYWxwaGE9Zy5hfWVsc2UgaS52aXNpYmxlPSExfX0sYi5TcGluZS5wcm90b3R5cGUuYXV0b1VwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMubGFzdFRpbWU9dGhpcy5sYXN0VGltZXx8RGF0ZS5ub3coKTt2YXIgYT0uMDAxKihEYXRlLm5vdygpLXRoaXMubGFzdFRpbWUpO3RoaXMubGFzdFRpbWU9RGF0ZS5ub3coKSx0aGlzLnVwZGF0ZShhKSxiLkRpc3BsYXlPYmplY3RDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybS5jYWxsKHRoaXMpfSxiLlNwaW5lLnByb3RvdHlwZS5jcmVhdGVTcHJpdGU9ZnVuY3Rpb24oYSxkKXt2YXIgZT1kLnJlbmRlcmVyT2JqZWN0LGY9ZS5wYWdlLnJlbmRlcmVyT2JqZWN0LGc9bmV3IGIuUmVjdGFuZ2xlKGUueCxlLnksZS5yb3RhdGU/ZS5oZWlnaHQ6ZS53aWR0aCxlLnJvdGF0ZT9lLndpZHRoOmUuaGVpZ2h0KSxoPW5ldyBiLlRleHR1cmUoZixnKSxpPW5ldyBiLlNwcml0ZShoKSxqPWUucm90YXRlPy41Kk1hdGguUEk6MDtyZXR1cm4gaS5zY2FsZS5zZXQoZS53aWR0aC9lLm9yaWdpbmFsV2lkdGgsZS5oZWlnaHQvZS5vcmlnaW5hbEhlaWdodCksaS5yb3RhdGlvbj1qLWQucm90YXRpb24qYy5kZWdSYWQsaS5hbmNob3IueD1pLmFuY2hvci55PS41LGEuc3ByaXRlcz1hLnNwcml0ZXN8fHt9LGEuc3ByaXRlc1tlLm5hbWVdPWksaX0sYi5TcGluZS5wcm90b3R5cGUuY3JlYXRlTWVzaD1mdW5jdGlvbihhLGMpe3ZhciBkPWMucmVuZGVyZXJPYmplY3QsZT1kLnBhZ2UucmVuZGVyZXJPYmplY3QsZj1uZXcgYi5UZXh0dXJlKGUpLGc9bmV3IGIuU3RyaXAoZik7cmV0dXJuIGcuZHJhd01vZGU9Yi5TdHJpcC5EcmF3TW9kZXMuVFJJQU5HTEVTLGcuY2FudmFzUGFkZGluZz0xLjUsZy52ZXJ0aWNlcz1uZXcgYi5GbG9hdDMyQXJyYXkoYy51dnMubGVuZ3RoKSxnLnV2cz1jLnV2cyxnLmluZGljZXM9Yy50cmlhbmdsZXMsYS5tZXNoZXM9YS5tZXNoZXN8fHt9LGEubWVzaGVzW2MubmFtZV09ZyxnfSxiLkJhc2VUZXh0dXJlQ2FjaGU9e30sYi5CYXNlVGV4dHVyZUNhY2hlSWRHZW5lcmF0b3I9MCxiLkJhc2VUZXh0dXJlPWZ1bmN0aW9uKGEsYyl7aWYodGhpcy5yZXNvbHV0aW9uPTEsdGhpcy53aWR0aD0xMDAsdGhpcy5oZWlnaHQ9MTAwLHRoaXMuc2NhbGVNb2RlPWN8fGIuc2NhbGVNb2Rlcy5ERUZBVUxULHRoaXMuaGFzTG9hZGVkPSExLHRoaXMuc291cmNlPWEsdGhpcy5fVUlEPWIuX1VJRCsrLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSEwLHRoaXMuX2dsVGV4dHVyZXM9W10sdGhpcy5taXBtYXA9ITEsdGhpcy5fZGlydHk9WyEwLCEwLCEwLCEwXSxhKXtpZigodGhpcy5zb3VyY2UuY29tcGxldGV8fHRoaXMuc291cmNlLmdldENvbnRleHQpJiZ0aGlzLnNvdXJjZS53aWR0aCYmdGhpcy5zb3VyY2UuaGVpZ2h0KXRoaXMuaGFzTG9hZGVkPSEwLHRoaXMud2lkdGg9dGhpcy5zb3VyY2UubmF0dXJhbFdpZHRofHx0aGlzLnNvdXJjZS53aWR0aCx0aGlzLmhlaWdodD10aGlzLnNvdXJjZS5uYXR1cmFsSGVpZ2h0fHx0aGlzLnNvdXJjZS5oZWlnaHQsdGhpcy5kaXJ0eSgpO2Vsc2V7dmFyIGQ9dGhpczt0aGlzLnNvdXJjZS5vbmxvYWQ9ZnVuY3Rpb24oKXtkLmhhc0xvYWRlZD0hMCxkLndpZHRoPWQuc291cmNlLm5hdHVyYWxXaWR0aHx8ZC5zb3VyY2Uud2lkdGgsZC5oZWlnaHQ9ZC5zb3VyY2UubmF0dXJhbEhlaWdodHx8ZC5zb3VyY2UuaGVpZ2h0LGQuZGlydHkoKSxkLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJsb2FkZWRcIixjb250ZW50OmR9KX0sdGhpcy5zb3VyY2Uub25lcnJvcj1mdW5jdGlvbigpe2QuZGlzcGF0Y2hFdmVudCh7dHlwZTpcImVycm9yXCIsY29udGVudDpkfSl9fXRoaXMuaW1hZ2VVcmw9bnVsbCx0aGlzLl9wb3dlck9mMj0hMX19LGIuQmFzZVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuQmFzZVRleHR1cmUsYi5FdmVudFRhcmdldC5taXhpbihiLkJhc2VUZXh0dXJlLnByb3RvdHlwZSksYi5CYXNlVGV4dHVyZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaW1hZ2VVcmw/KGRlbGV0ZSBiLkJhc2VUZXh0dXJlQ2FjaGVbdGhpcy5pbWFnZVVybF0sZGVsZXRlIGIuVGV4dHVyZUNhY2hlW3RoaXMuaW1hZ2VVcmxdLHRoaXMuaW1hZ2VVcmw9bnVsbCxuYXZpZ2F0b3IuaXNDb2Nvb25KU3x8KHRoaXMuc291cmNlLnNyYz1cIlwiKSk6dGhpcy5zb3VyY2UmJnRoaXMuc291cmNlLl9waXhpSWQmJmRlbGV0ZSBiLkJhc2VUZXh0dXJlQ2FjaGVbdGhpcy5zb3VyY2UuX3BpeGlJZF0sdGhpcy5zb3VyY2U9bnVsbCx0aGlzLnVubG9hZEZyb21HUFUoKX0sYi5CYXNlVGV4dHVyZS5wcm90b3R5cGUudXBkYXRlU291cmNlSW1hZ2U9ZnVuY3Rpb24oYSl7dGhpcy5oYXNMb2FkZWQ9ITEsdGhpcy5zb3VyY2Uuc3JjPW51bGwsdGhpcy5zb3VyY2Uuc3JjPWF9LGIuQmFzZVRleHR1cmUucHJvdG90eXBlLmRpcnR5PWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLl9nbFRleHR1cmVzLmxlbmd0aDthKyspdGhpcy5fZGlydHlbYV09ITB9LGIuQmFzZVRleHR1cmUucHJvdG90eXBlLnVubG9hZEZyb21HUFU9ZnVuY3Rpb24oKXt0aGlzLmRpcnR5KCk7Zm9yKHZhciBhPXRoaXMuX2dsVGV4dHVyZXMubGVuZ3RoLTE7YT49MDthLS0pe3ZhciBjPXRoaXMuX2dsVGV4dHVyZXNbYV0sZD1iLmdsQ29udGV4dHNbYV07ZCYmYyYmZC5kZWxldGVUZXh0dXJlKGMpfXRoaXMuX2dsVGV4dHVyZXMubGVuZ3RoPTAsdGhpcy5kaXJ0eSgpfSxiLkJhc2VUZXh0dXJlLmZyb21JbWFnZT1mdW5jdGlvbihhLGMsZCl7dmFyIGU9Yi5CYXNlVGV4dHVyZUNhY2hlW2FdO2lmKHZvaWQgMD09PWMmJi0xPT09YS5pbmRleE9mKFwiZGF0YTpcIikmJihjPSEwKSwhZSl7dmFyIGY9bmV3IEltYWdlO2MmJihmLmNyb3NzT3JpZ2luPVwiXCIpLGYuc3JjPWEsZT1uZXcgYi5CYXNlVGV4dHVyZShmLGQpLGUuaW1hZ2VVcmw9YSxiLkJhc2VUZXh0dXJlQ2FjaGVbYV09ZSwtMSE9PWEuaW5kZXhPZihiLlJFVElOQV9QUkVGSVgrXCIuXCIpJiYoZS5yZXNvbHV0aW9uPTIpfXJldHVybiBlfSxiLkJhc2VUZXh0dXJlLmZyb21DYW52YXM9ZnVuY3Rpb24oYSxjKXthLl9waXhpSWR8fChhLl9waXhpSWQ9XCJjYW52YXNfXCIrYi5UZXh0dXJlQ2FjaGVJZEdlbmVyYXRvcisrKTt2YXIgZD1iLkJhc2VUZXh0dXJlQ2FjaGVbYS5fcGl4aUlkXTtyZXR1cm4gZHx8KGQ9bmV3IGIuQmFzZVRleHR1cmUoYSxjKSxiLkJhc2VUZXh0dXJlQ2FjaGVbYS5fcGl4aUlkXT1kKSxkfSxiLlRleHR1cmVDYWNoZT17fSxiLkZyYW1lQ2FjaGU9e30sYi5UZXh0dXJlQ2FjaGVJZEdlbmVyYXRvcj0wLGIuVGV4dHVyZT1mdW5jdGlvbihhLGMsZCxlKXt0aGlzLm5vRnJhbWU9ITEsY3x8KHRoaXMubm9GcmFtZT0hMCxjPW5ldyBiLlJlY3RhbmdsZSgwLDAsMSwxKSksYSBpbnN0YW5jZW9mIGIuVGV4dHVyZSYmKGE9YS5iYXNlVGV4dHVyZSksdGhpcy5iYXNlVGV4dHVyZT1hLHRoaXMuZnJhbWU9Yyx0aGlzLnRyaW09ZSx0aGlzLnZhbGlkPSExLHRoaXMucmVxdWlyZXNVcGRhdGU9ITEsdGhpcy5fdXZzPW51bGwsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5jcm9wPWR8fG5ldyBiLlJlY3RhbmdsZSgwLDAsMSwxKSxhLmhhc0xvYWRlZD8odGhpcy5ub0ZyYW1lJiYoYz1uZXcgYi5SZWN0YW5nbGUoMCwwLGEud2lkdGgsYS5oZWlnaHQpKSx0aGlzLnNldEZyYW1lKGMpKTphLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkZWRcIix0aGlzLm9uQmFzZVRleHR1cmVMb2FkZWQuYmluZCh0aGlzKSl9LGIuVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5UZXh0dXJlLGIuRXZlbnRUYXJnZXQubWl4aW4oYi5UZXh0dXJlLnByb3RvdHlwZSksYi5UZXh0dXJlLnByb3RvdHlwZS5vbkJhc2VUZXh0dXJlTG9hZGVkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5iYXNlVGV4dHVyZTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkZWRcIix0aGlzLm9uTG9hZGVkKSx0aGlzLm5vRnJhbWUmJih0aGlzLmZyYW1lPW5ldyBiLlJlY3RhbmdsZSgwLDAsYS53aWR0aCxhLmhlaWdodCkpLHRoaXMuc2V0RnJhbWUodGhpcy5mcmFtZSksdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwidXBkYXRlXCIsY29udGVudDp0aGlzfSl9LGIuVGV4dHVyZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihhKXthJiZ0aGlzLmJhc2VUZXh0dXJlLmRlc3Ryb3koKSx0aGlzLnZhbGlkPSExfSxiLlRleHR1cmUucHJvdG90eXBlLnNldEZyYW1lPWZ1bmN0aW9uKGEpe2lmKHRoaXMubm9GcmFtZT0hMSx0aGlzLmZyYW1lPWEsdGhpcy53aWR0aD1hLndpZHRoLHRoaXMuaGVpZ2h0PWEuaGVpZ2h0LHRoaXMuY3JvcC54PWEueCx0aGlzLmNyb3AueT1hLnksdGhpcy5jcm9wLndpZHRoPWEud2lkdGgsdGhpcy5jcm9wLmhlaWdodD1hLmhlaWdodCwhdGhpcy50cmltJiYoYS54K2Eud2lkdGg+dGhpcy5iYXNlVGV4dHVyZS53aWR0aHx8YS55K2EuaGVpZ2h0PnRoaXMuYmFzZVRleHR1cmUuaGVpZ2h0KSl0aHJvdyBuZXcgRXJyb3IoXCJUZXh0dXJlIEVycm9yOiBmcmFtZSBkb2VzIG5vdCBmaXQgaW5zaWRlIHRoZSBiYXNlIFRleHR1cmUgZGltZW5zaW9ucyBcIit0aGlzKTt0aGlzLnZhbGlkPWEmJmEud2lkdGgmJmEuaGVpZ2h0JiZ0aGlzLmJhc2VUZXh0dXJlLnNvdXJjZSYmdGhpcy5iYXNlVGV4dHVyZS5oYXNMb2FkZWQsdGhpcy50cmltJiYodGhpcy53aWR0aD10aGlzLnRyaW0ud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy50cmltLmhlaWdodCx0aGlzLmZyYW1lLndpZHRoPXRoaXMudHJpbS53aWR0aCx0aGlzLmZyYW1lLmhlaWdodD10aGlzLnRyaW0uaGVpZ2h0KSx0aGlzLnZhbGlkJiZ0aGlzLl91cGRhdGVVdnMoKX0sYi5UZXh0dXJlLnByb3RvdHlwZS5fdXBkYXRlVXZzPWZ1bmN0aW9uKCl7dGhpcy5fdXZzfHwodGhpcy5fdXZzPW5ldyBiLlRleHR1cmVVdnMpO3ZhciBhPXRoaXMuY3JvcCxjPXRoaXMuYmFzZVRleHR1cmUud2lkdGgsZD10aGlzLmJhc2VUZXh0dXJlLmhlaWdodDt0aGlzLl91dnMueDA9YS54L2MsdGhpcy5fdXZzLnkwPWEueS9kLHRoaXMuX3V2cy54MT0oYS54K2Eud2lkdGgpL2MsdGhpcy5fdXZzLnkxPWEueS9kLHRoaXMuX3V2cy54Mj0oYS54K2Eud2lkdGgpL2MsdGhpcy5fdXZzLnkyPShhLnkrYS5oZWlnaHQpL2QsdGhpcy5fdXZzLngzPWEueC9jLHRoaXMuX3V2cy55Mz0oYS55K2EuaGVpZ2h0KS9kfSxiLlRleHR1cmUuZnJvbUltYWdlPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1iLlRleHR1cmVDYWNoZVthXTtyZXR1cm4gZXx8KGU9bmV3IGIuVGV4dHVyZShiLkJhc2VUZXh0dXJlLmZyb21JbWFnZShhLGMsZCkpLGIuVGV4dHVyZUNhY2hlW2FdPWUpLGV9LGIuVGV4dHVyZS5mcm9tRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGM9Yi5UZXh0dXJlQ2FjaGVbYV07aWYoIWMpdGhyb3cgbmV3IEVycm9yKCdUaGUgZnJhbWVJZCBcIicrYSsnXCIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHRleHR1cmUgY2FjaGUgJyk7cmV0dXJuIGN9LGIuVGV4dHVyZS5mcm9tQ2FudmFzPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yi5CYXNlVGV4dHVyZS5mcm9tQ2FudmFzKGEsYyk7cmV0dXJuIG5ldyBiLlRleHR1cmUoZCl9LGIuVGV4dHVyZS5hZGRUZXh0dXJlVG9DYWNoZT1mdW5jdGlvbihhLGMpe2IuVGV4dHVyZUNhY2hlW2NdPWF9LGIuVGV4dHVyZS5yZW1vdmVUZXh0dXJlRnJvbUNhY2hlPWZ1bmN0aW9uKGEpe3ZhciBjPWIuVGV4dHVyZUNhY2hlW2FdO3JldHVybiBkZWxldGUgYi5UZXh0dXJlQ2FjaGVbYV0sZGVsZXRlIGIuQmFzZVRleHR1cmVDYWNoZVthXSxjfSxiLlRleHR1cmVVdnM9ZnVuY3Rpb24oKXt0aGlzLngwPTAsdGhpcy55MD0wLHRoaXMueDE9MCx0aGlzLnkxPTAsdGhpcy54Mj0wLHRoaXMueTI9MCx0aGlzLngzPTAsdGhpcy55Mz0wfSxiLlRleHR1cmUuZW1wdHlUZXh0dXJlPW5ldyBiLlRleHR1cmUobmV3IGIuQmFzZVRleHR1cmUpLGIuUmVuZGVyVGV4dHVyZT1mdW5jdGlvbihhLGMsZCxlLGYpe2lmKHRoaXMud2lkdGg9YXx8MTAwLHRoaXMuaGVpZ2h0PWN8fDEwMCx0aGlzLnJlc29sdXRpb249Znx8MSx0aGlzLmZyYW1lPW5ldyBiLlJlY3RhbmdsZSgwLDAsdGhpcy53aWR0aCp0aGlzLnJlc29sdXRpb24sdGhpcy5oZWlnaHQqdGhpcy5yZXNvbHV0aW9uKSx0aGlzLmNyb3A9bmV3IGIuUmVjdGFuZ2xlKDAsMCx0aGlzLndpZHRoKnRoaXMucmVzb2x1dGlvbix0aGlzLmhlaWdodCp0aGlzLnJlc29sdXRpb24pLHRoaXMuYmFzZVRleHR1cmU9bmV3IGIuQmFzZVRleHR1cmUsdGhpcy5iYXNlVGV4dHVyZS53aWR0aD10aGlzLndpZHRoKnRoaXMucmVzb2x1dGlvbix0aGlzLmJhc2VUZXh0dXJlLmhlaWdodD10aGlzLmhlaWdodCp0aGlzLnJlc29sdXRpb24sdGhpcy5iYXNlVGV4dHVyZS5fZ2xUZXh0dXJlcz1bXSx0aGlzLmJhc2VUZXh0dXJlLnJlc29sdXRpb249dGhpcy5yZXNvbHV0aW9uLHRoaXMuYmFzZVRleHR1cmUuc2NhbGVNb2RlPWV8fGIuc2NhbGVNb2Rlcy5ERUZBVUxULHRoaXMuYmFzZVRleHR1cmUuaGFzTG9hZGVkPSEwLGIuVGV4dHVyZS5jYWxsKHRoaXMsdGhpcy5iYXNlVGV4dHVyZSxuZXcgYi5SZWN0YW5nbGUoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpKSx0aGlzLnJlbmRlcmVyPWR8fGIuZGVmYXVsdFJlbmRlcmVyLHRoaXMucmVuZGVyZXIudHlwZT09PWIuV0VCR0xfUkVOREVSRVIpe3ZhciBnPXRoaXMucmVuZGVyZXIuZ2w7dGhpcy5iYXNlVGV4dHVyZS5fZGlydHlbZy5pZF09ITEsdGhpcy50ZXh0dXJlQnVmZmVyPW5ldyBiLkZpbHRlclRleHR1cmUoZyx0aGlzLndpZHRoKnRoaXMucmVzb2x1dGlvbix0aGlzLmhlaWdodCp0aGlzLnJlc29sdXRpb24sdGhpcy5iYXNlVGV4dHVyZS5zY2FsZU1vZGUpLHRoaXMuYmFzZVRleHR1cmUuX2dsVGV4dHVyZXNbZy5pZF09dGhpcy50ZXh0dXJlQnVmZmVyLnRleHR1cmUsdGhpcy5yZW5kZXI9dGhpcy5yZW5kZXJXZWJHTCx0aGlzLnByb2plY3Rpb249bmV3IGIuUG9pbnQoLjUqdGhpcy53aWR0aCwuNSotdGhpcy5oZWlnaHQpfWVsc2UgdGhpcy5yZW5kZXI9dGhpcy5yZW5kZXJDYW52YXMsdGhpcy50ZXh0dXJlQnVmZmVyPW5ldyBiLkNhbnZhc0J1ZmZlcih0aGlzLndpZHRoKnRoaXMucmVzb2x1dGlvbix0aGlzLmhlaWdodCp0aGlzLnJlc29sdXRpb24pLHRoaXMuYmFzZVRleHR1cmUuc291cmNlPXRoaXMudGV4dHVyZUJ1ZmZlci5jYW52YXM7dGhpcy52YWxpZD0hMCx0aGlzLl91cGRhdGVVdnMoKX0sYi5SZW5kZXJUZXh0dXJlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuVGV4dHVyZS5wcm90b3R5cGUpLGIuUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5SZW5kZXJUZXh0dXJlLGIuUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEsYyxkKXsoYSE9PXRoaXMud2lkdGh8fGMhPT10aGlzLmhlaWdodCkmJih0aGlzLnZhbGlkPWE+MCYmYz4wLHRoaXMud2lkdGg9dGhpcy5mcmFtZS53aWR0aD10aGlzLmNyb3Aud2lkdGg9YSx0aGlzLmhlaWdodD10aGlzLmZyYW1lLmhlaWdodD10aGlzLmNyb3AuaGVpZ2h0PWMsZCYmKHRoaXMuYmFzZVRleHR1cmUud2lkdGg9dGhpcy53aWR0aCx0aGlzLmJhc2VUZXh0dXJlLmhlaWdodD10aGlzLmhlaWdodCksdGhpcy5yZW5kZXJlci50eXBlPT09Yi5XRUJHTF9SRU5ERVJFUiYmKHRoaXMucHJvamVjdGlvbi54PXRoaXMud2lkdGgvMix0aGlzLnByb2plY3Rpb24ueT0tdGhpcy5oZWlnaHQvMiksdGhpcy52YWxpZCYmdGhpcy50ZXh0dXJlQnVmZmVyLnJlc2l6ZSh0aGlzLndpZHRoKnRoaXMucmVzb2x1dGlvbix0aGlzLmhlaWdodCp0aGlzLnJlc29sdXRpb24pKX0sYi5SZW5kZXJUZXh0dXJlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMudmFsaWQmJih0aGlzLnJlbmRlcmVyLnR5cGU9PT1iLldFQkdMX1JFTkRFUkVSJiZ0aGlzLnJlbmRlcmVyLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLnJlbmRlcmVyLmdsLkZSQU1FQlVGRkVSLHRoaXMudGV4dHVyZUJ1ZmZlci5mcmFtZUJ1ZmZlciksdGhpcy50ZXh0dXJlQnVmZmVyLmNsZWFyKCkpfSxiLlJlbmRlclRleHR1cmUucHJvdG90eXBlLnJlbmRlcldlYkdMPWZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLnZhbGlkKXt2YXIgZD1hLndvcmxkVHJhbnNmb3JtO2QuaWRlbnRpdHkoKSxkLnRyYW5zbGF0ZSgwLDIqdGhpcy5wcm9qZWN0aW9uLnkpLGImJmQuYXBwZW5kKGIpLGQuc2NhbGUoMSwtMSksYS53b3JsZEFscGhhPTE7Zm9yKHZhciBlPWEuY2hpbGRyZW4sZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKyllW2ZdLnVwZGF0ZVRyYW5zZm9ybSgpO3ZhciBoPXRoaXMucmVuZGVyZXIuZ2w7aC52aWV3cG9ydCgwLDAsdGhpcy53aWR0aCp0aGlzLnJlc29sdXRpb24sdGhpcy5oZWlnaHQqdGhpcy5yZXNvbHV0aW9uKSxoLmJpbmRGcmFtZWJ1ZmZlcihoLkZSQU1FQlVGRkVSLHRoaXMudGV4dHVyZUJ1ZmZlci5mcmFtZUJ1ZmZlciksYyYmdGhpcy50ZXh0dXJlQnVmZmVyLmNsZWFyKCksdGhpcy5yZW5kZXJlci5zcHJpdGVCYXRjaC5kaXJ0eT0hMCx0aGlzLnJlbmRlcmVyLnJlbmRlckRpc3BsYXlPYmplY3QoYSx0aGlzLnByb2plY3Rpb24sdGhpcy50ZXh0dXJlQnVmZmVyLmZyYW1lQnVmZmVyKSx0aGlzLnJlbmRlcmVyLnNwcml0ZUJhdGNoLmRpcnR5PSEwfX0sYi5SZW5kZXJUZXh0dXJlLnByb3RvdHlwZS5yZW5kZXJDYW52YXM9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMudmFsaWQpe3ZhciBkPWEud29ybGRUcmFuc2Zvcm07ZC5pZGVudGl0eSgpLGImJmQuYXBwZW5kKGIpLGEud29ybGRBbHBoYT0xO2Zvcih2YXIgZT1hLmNoaWxkcmVuLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspZVtmXS51cGRhdGVUcmFuc2Zvcm0oKTtjJiZ0aGlzLnRleHR1cmVCdWZmZXIuY2xlYXIoKTt2YXIgaD10aGlzLnRleHR1cmVCdWZmZXIuY29udGV4dCxpPXRoaXMucmVuZGVyZXIucmVzb2x1dGlvbjt0aGlzLnJlbmRlcmVyLnJlc29sdXRpb249dGhpcy5yZXNvbHV0aW9uLHRoaXMucmVuZGVyZXIucmVuZGVyRGlzcGxheU9iamVjdChhLGgpLHRoaXMucmVuZGVyZXIucmVzb2x1dGlvbj1pfX0sYi5SZW5kZXJUZXh0dXJlLnByb3RvdHlwZS5nZXRJbWFnZT1mdW5jdGlvbigpe3ZhciBhPW5ldyBJbWFnZTtyZXR1cm4gYS5zcmM9dGhpcy5nZXRCYXNlNjQoKSxhfSxiLlJlbmRlclRleHR1cmUucHJvdG90eXBlLmdldEJhc2U2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENhbnZhcygpLnRvRGF0YVVSTCgpfSxiLlJlbmRlclRleHR1cmUucHJvdG90eXBlLmdldENhbnZhcz1mdW5jdGlvbigpe2lmKHRoaXMucmVuZGVyZXIudHlwZT09PWIuV0VCR0xfUkVOREVSRVIpe3ZhciBhPXRoaXMucmVuZGVyZXIuZ2wsYz10aGlzLnRleHR1cmVCdWZmZXIud2lkdGgsZD10aGlzLnRleHR1cmVCdWZmZXIuaGVpZ2h0LGU9bmV3IFVpbnQ4QXJyYXkoNCpjKmQpO2EuYmluZEZyYW1lYnVmZmVyKGEuRlJBTUVCVUZGRVIsdGhpcy50ZXh0dXJlQnVmZmVyLmZyYW1lQnVmZmVyKSxhLnJlYWRQaXhlbHMoMCwwLGMsZCxhLlJHQkEsYS5VTlNJR05FRF9CWVRFLGUpLGEuYmluZEZyYW1lYnVmZmVyKGEuRlJBTUVCVUZGRVIsbnVsbCk7dmFyIGY9bmV3IGIuQ2FudmFzQnVmZmVyKGMsZCksZz1mLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsMCxjLGQpO3JldHVybiBnLmRhdGEuc2V0KGUpLGYuY29udGV4dC5wdXRJbWFnZURhdGEoZywwLDApLGYuY2FudmFzfXJldHVybiB0aGlzLnRleHR1cmVCdWZmZXIuY2FudmFzfSxiLlJlbmRlclRleHR1cmUudGVtcE1hdHJpeD1uZXcgYi5NYXRyaXgsYi5WaWRlb1RleHR1cmU9ZnVuY3Rpb24oYSxjKXtpZighYSl0aHJvdyBuZXcgRXJyb3IoXCJObyB2aWRlbyBzb3VyY2UgZWxlbWVudCBzcGVjaWZpZWQuXCIpOyhhLnJlYWR5U3RhdGU9PT1hLkhBVkVfRU5PVUdIX0RBVEF8fGEucmVhZHlTdGF0ZT09PWEuSEFWRV9GVVRVUkVfREFUQSkmJmEud2lkdGgmJmEuaGVpZ2h0JiYoYS5jb21wbGV0ZT0hMCksYi5CYXNlVGV4dHVyZS5jYWxsKHRoaXMsYSxjKSx0aGlzLmF1dG9VcGRhdGU9ITEsdGhpcy51cGRhdGVCb3VuZD10aGlzLl9vblVwZGF0ZS5iaW5kKHRoaXMpLGEuY29tcGxldGV8fCh0aGlzLl9vbkNhblBsYXk9dGhpcy5vbkNhblBsYXkuYmluZCh0aGlzKSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJjYW5wbGF5XCIsdGhpcy5fb25DYW5QbGF5KSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJjYW5wbGF5dGhyb3VnaFwiLHRoaXMuX29uQ2FuUGxheSksYS5hZGRFdmVudExpc3RlbmVyKFwicGxheVwiLHRoaXMub25QbGF5U3RhcnQuYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKFwicGF1c2VcIix0aGlzLm9uUGxheVN0b3AuYmluZCh0aGlzKSkpfSxiLlZpZGVvVGV4dHVyZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLkJhc2VUZXh0dXJlLnByb3RvdHlwZSksYi5WaWRlb1RleHR1cmUuY29uc3RydWN0b3I9Yi5WaWRlb1RleHR1cmUsYi5WaWRlb1RleHR1cmUucHJvdG90eXBlLl9vblVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYXV0b1VwZGF0ZSYmKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVCb3VuZCksdGhpcy5kaXJ0eSgpKX0sYi5WaWRlb1RleHR1cmUucHJvdG90eXBlLm9uUGxheVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5hdXRvVXBkYXRlfHwod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZUJvdW5kKSx0aGlzLmF1dG9VcGRhdGU9ITApfSxiLlZpZGVvVGV4dHVyZS5wcm90b3R5cGUub25QbGF5U3RvcD1mdW5jdGlvbigpe3RoaXMuYXV0b1VwZGF0ZT0hMX0sYi5WaWRlb1RleHR1cmUucHJvdG90eXBlLm9uQ2FuUGxheT1mdW5jdGlvbigpe1wiY2FucGxheXRocm91Z2hcIj09PWV2ZW50LnR5cGUmJih0aGlzLmhhc0xvYWRlZD0hMCx0aGlzLnNvdXJjZSYmKHRoaXMuc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjYW5wbGF5XCIsdGhpcy5fb25DYW5QbGF5KSx0aGlzLnNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2FucGxheXRocm91Z2hcIix0aGlzLl9vbkNhblBsYXkpLHRoaXMud2lkdGg9dGhpcy5zb3VyY2UudmlkZW9XaWR0aCx0aGlzLmhlaWdodD10aGlzLnNvdXJjZS52aWRlb0hlaWdodCx0aGlzLl9fbG9hZGVkfHwodGhpcy5fX2xvYWRlZD0hMCx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJsb2FkZWRcIixjb250ZW50OnRoaXN9KSkpKX0sYi5WaWRlb1RleHR1cmUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnNvdXJjZSYmdGhpcy5zb3VyY2UuX3BpeGlJZCYmKGIuQmFzZVRleHR1cmVDYWNoZVt0aGlzLnNvdXJjZS5fcGl4aUlkXT1udWxsLGRlbGV0ZSBiLkJhc2VUZXh0dXJlQ2FjaGVbdGhpcy5zb3VyY2UuX3BpeGlJZF0sdGhpcy5zb3VyY2UuX3BpeGlJZD1udWxsLGRlbGV0ZSB0aGlzLnNvdXJjZS5fcGl4aUlkKSxiLkJhc2VUZXh0dXJlLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LGIuVmlkZW9UZXh0dXJlLmJhc2VUZXh0dXJlRnJvbVZpZGVvPWZ1bmN0aW9uKGEsYyl7YS5fcGl4aUlkfHwoYS5fcGl4aUlkPVwidmlkZW9fXCIrYi5UZXh0dXJlQ2FjaGVJZEdlbmVyYXRvcisrKTt2YXIgZD1iLkJhc2VUZXh0dXJlQ2FjaGVbYS5fcGl4aUlkXTtyZXR1cm4gZHx8KGQ9bmV3IGIuVmlkZW9UZXh0dXJlKGEsYyksYi5CYXNlVGV4dHVyZUNhY2hlW2EuX3BpeGlJZF09ZCksZH0sYi5WaWRlb1RleHR1cmUudGV4dHVyZUZyb21WaWRlbz1mdW5jdGlvbihhLGMpe3ZhciBkPWIuVmlkZW9UZXh0dXJlLmJhc2VUZXh0dXJlRnJvbVZpZGVvKGEsYyk7cmV0dXJuIG5ldyBiLlRleHR1cmUoZCl9LGIuVmlkZW9UZXh0dXJlLmZyb21Vcmw9ZnVuY3Rpb24oYSxjKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidmlkZW9cIik7cmV0dXJuIGQuc3JjPWEsZC5hdXRvUGxheT0hMCxkLnBsYXkoKSxiLlZpZGVvVGV4dHVyZS50ZXh0dXJlRnJvbVZpZGVvKGQsYyl9LGIuQXNzZXRMb2FkZXI9ZnVuY3Rpb24oYSxjKXt0aGlzLmFzc2V0VVJMcz1hLHRoaXMuY3Jvc3NvcmlnaW49Yyx0aGlzLmxvYWRlcnNCeVR5cGU9e2pwZzpiLkltYWdlTG9hZGVyLGpwZWc6Yi5JbWFnZUxvYWRlcixwbmc6Yi5JbWFnZUxvYWRlcixnaWY6Yi5JbWFnZUxvYWRlcix3ZWJwOmIuSW1hZ2VMb2FkZXIsanNvbjpiLkpzb25Mb2FkZXIsYXRsYXM6Yi5BdGxhc0xvYWRlcixhbmltOmIuU3BpbmVMb2FkZXIseG1sOmIuQml0bWFwRm9udExvYWRlcixmbnQ6Yi5CaXRtYXBGb250TG9hZGVyfX0sYi5FdmVudFRhcmdldC5taXhpbihiLkFzc2V0TG9hZGVyLnByb3RvdHlwZSksYi5Bc3NldExvYWRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5Bc3NldExvYWRlcixiLkFzc2V0TG9hZGVyLnByb3RvdHlwZS5fZ2V0RGF0YVR5cGU9ZnVuY3Rpb24oYSl7dmFyIGI9XCJkYXRhOlwiLGM9YS5zbGljZSgwLGIubGVuZ3RoKS50b0xvd2VyQ2FzZSgpO2lmKGM9PT1iKXt2YXIgZD1hLnNsaWNlKGIubGVuZ3RoKSxlPWQuaW5kZXhPZihcIixcIik7aWYoLTE9PT1lKXJldHVybiBudWxsO3ZhciBmPWQuc2xpY2UoMCxlKS5zcGxpdChcIjtcIilbMF07cmV0dXJuIGYmJlwidGV4dC9wbGFpblwiIT09Zi50b0xvd2VyQ2FzZSgpP2Yuc3BsaXQoXCIvXCIpLnBvcCgpLnRvTG93ZXJDYXNlKCk6XCJ0eHRcIn1yZXR1cm4gbnVsbH0sYi5Bc3NldExvYWRlci5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7Yi5vbkFzc2V0TG9hZGVkKGEuZGF0YS5jb250ZW50KX12YXIgYj10aGlzO3RoaXMubG9hZENvdW50PXRoaXMuYXNzZXRVUkxzLmxlbmd0aDtmb3IodmFyIGM9MDtjPHRoaXMuYXNzZXRVUkxzLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuYXNzZXRVUkxzW2NdLGU9dGhpcy5fZ2V0RGF0YVR5cGUoZCk7ZXx8KGU9ZC5zcGxpdChcIj9cIikuc2hpZnQoKS5zcGxpdChcIi5cIikucG9wKCkudG9Mb3dlckNhc2UoKSk7dmFyIGY9dGhpcy5sb2FkZXJzQnlUeXBlW2VdO2lmKCFmKXRocm93IG5ldyBFcnJvcihlK1wiIGlzIGFuIHVuc3VwcG9ydGVkIGZpbGUgdHlwZVwiKTt2YXIgZz1uZXcgZihkLHRoaXMuY3Jvc3NvcmlnaW4pO2cub24oXCJsb2FkZWRcIixhKSxnLmxvYWQoKX19LGIuQXNzZXRMb2FkZXIucHJvdG90eXBlLm9uQXNzZXRMb2FkZWQ9ZnVuY3Rpb24oYSl7dGhpcy5sb2FkQ291bnQtLSx0aGlzLmVtaXQoXCJvblByb2dyZXNzXCIse2NvbnRlbnQ6dGhpcyxsb2FkZXI6YX0pLHRoaXMub25Qcm9ncmVzcyYmdGhpcy5vblByb2dyZXNzKGEpLHRoaXMubG9hZENvdW50fHwodGhpcy5lbWl0KFwib25Db21wbGV0ZVwiLHtjb250ZW50OnRoaXN9KSx0aGlzLm9uQ29tcGxldGUmJnRoaXMub25Db21wbGV0ZSgpKX0sYi5Kc29uTG9hZGVyPWZ1bmN0aW9uKGEsYil7dGhpcy51cmw9YSx0aGlzLmNyb3Nzb3JpZ2luPWIsdGhpcy5iYXNlVXJsPWEucmVwbGFjZSgvW15cXC9dKiQvLFwiXCIpLHRoaXMubG9hZGVkPSExfSxiLkpzb25Mb2FkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuSnNvbkxvYWRlcixiLkV2ZW50VGFyZ2V0Lm1peGluKGIuSnNvbkxvYWRlci5wcm90b3R5cGUpLGIuSnNvbkxvYWRlci5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3dpbmRvdy5YRG9tYWluUmVxdWVzdCYmdGhpcy5jcm9zc29yaWdpbj8odGhpcy5hamF4UmVxdWVzdD1uZXcgd2luZG93LlhEb21haW5SZXF1ZXN0LHRoaXMuYWpheFJlcXVlc3QudGltZW91dD0zZTMsdGhpcy5hamF4UmVxdWVzdC5vbmVycm9yPXRoaXMub25FcnJvci5iaW5kKHRoaXMpLHRoaXMuYWpheFJlcXVlc3Qub250aW1lb3V0PXRoaXMub25FcnJvci5iaW5kKHRoaXMpLHRoaXMuYWpheFJlcXVlc3Qub25wcm9ncmVzcz1mdW5jdGlvbigpe30sdGhpcy5hamF4UmVxdWVzdC5vbmxvYWQ9dGhpcy5vbkpTT05Mb2FkZWQuYmluZCh0aGlzKSk6KHRoaXMuYWpheFJlcXVlc3Q9d2luZG93LlhNTEh0dHBSZXF1ZXN0P25ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3Q6bmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTEhUVFBcIiksdGhpcy5hamF4UmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2U9dGhpcy5vblJlYWR5U3RhdGVDaGFuZ2VkLmJpbmQodGhpcykpLHRoaXMuYWpheFJlcXVlc3Qub3BlbihcIkdFVFwiLHRoaXMudXJsLCEwKSx0aGlzLmFqYXhSZXF1ZXN0LnNlbmQoKX0sYi5Kc29uTG9hZGVyLnByb3RvdHlwZS5vblJlYWR5U3RhdGVDaGFuZ2VkPWZ1bmN0aW9uKCl7NCE9PXRoaXMuYWpheFJlcXVlc3QucmVhZHlTdGF0ZXx8MjAwIT09dGhpcy5hamF4UmVxdWVzdC5zdGF0dXMmJi0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZihcImh0dHBcIil8fHRoaXMub25KU09OTG9hZGVkKCl9LGIuSnNvbkxvYWRlci5wcm90b3R5cGUub25KU09OTG9hZGVkPWZ1bmN0aW9uKCl7aWYoIXRoaXMuYWpheFJlcXVlc3QucmVzcG9uc2VUZXh0KXJldHVybiB2b2lkIHRoaXMub25FcnJvcigpO2lmKHRoaXMuanNvbj1KU09OLnBhcnNlKHRoaXMuYWpheFJlcXVlc3QucmVzcG9uc2VUZXh0KSx0aGlzLmpzb24uZnJhbWVzJiZ0aGlzLmpzb24ubWV0YSYmdGhpcy5qc29uLm1ldGEuaW1hZ2Upe3ZhciBhPXRoaXMuYmFzZVVybCt0aGlzLmpzb24ubWV0YS5pbWFnZSxkPW5ldyBiLkltYWdlTG9hZGVyKGEsdGhpcy5jcm9zc29yaWdpbiksZT10aGlzLmpzb24uZnJhbWVzO3RoaXMudGV4dHVyZT1kLnRleHR1cmUuYmFzZVRleHR1cmUsZC5hZGRFdmVudExpc3RlbmVyKFwibG9hZGVkXCIsdGhpcy5vbkxvYWRlZC5iaW5kKHRoaXMpKTtmb3IodmFyIGYgaW4gZSl7dmFyIGc9ZVtmXS5mcmFtZTtpZihnKXt2YXIgaD1uZXcgYi5SZWN0YW5nbGUoZy54LGcueSxnLncsZy5oKSxpPWguY2xvbmUoKSxqPW51bGw7aWYoZVtmXS50cmltbWVkKXt2YXIgaz1lW2ZdLnNvdXJjZVNpemUsbD1lW2ZdLnNwcml0ZVNvdXJjZVNpemU7aj1uZXcgYi5SZWN0YW5nbGUobC54LGwueSxrLncsay5oKX1iLlRleHR1cmVDYWNoZVtmXT1uZXcgYi5UZXh0dXJlKHRoaXMudGV4dHVyZSxoLGksail9fWQubG9hZCgpfWVsc2UgaWYodGhpcy5qc29uLmJvbmVzKWlmKGIuQW5pbUNhY2hlW3RoaXMudXJsXSl0aGlzLm9uTG9hZGVkKCk7ZWxzZXt2YXIgbT10aGlzLnVybC5zdWJzdHIoMCx0aGlzLnVybC5sYXN0SW5kZXhPZihcIi5cIikpK1wiLmF0bGFzXCIsbj1uZXcgYi5Kc29uTG9hZGVyKG0sdGhpcy5jcm9zc29yaWdpbiksbz10aGlzO24ub25KU09OTG9hZGVkPWZ1bmN0aW9uKCl7aWYoIXRoaXMuYWpheFJlcXVlc3QucmVzcG9uc2VUZXh0KXJldHVybiB2b2lkIHRoaXMub25FcnJvcigpO3ZhciBhPW5ldyBiLlNwaW5lVGV4dHVyZUxvYWRlcih0aGlzLnVybC5zdWJzdHJpbmcoMCx0aGlzLnVybC5sYXN0SW5kZXhPZihcIi9cIikpKSxkPW5ldyBjLkF0bGFzKHRoaXMuYWpheFJlcXVlc3QucmVzcG9uc2VUZXh0LGEpLGU9bmV3IGMuQXRsYXNBdHRhY2htZW50TG9hZGVyKGQpLGY9bmV3IGMuU2tlbGV0b25Kc29uKGUpLGc9Zi5yZWFkU2tlbGV0b25EYXRhKG8uanNvbik7Yi5BbmltQ2FjaGVbby51cmxdPWcsby5zcGluZT1nLG8uc3BpbmVBdGxhcz1kLG8uc3BpbmVBdGxhc0xvYWRlcj1uLGEubG9hZGluZ0NvdW50PjA/YS5hZGRFdmVudExpc3RlbmVyKFwibG9hZGVkQmFzZVRleHR1cmVcIixmdW5jdGlvbihhKXthLmNvbnRlbnQuY29udGVudC5sb2FkaW5nQ291bnQ8PTAmJm8ub25Mb2FkZWQoKX0pOm8ub25Mb2FkZWQoKX0sbi5sb2FkKCl9ZWxzZSB0aGlzLm9uTG9hZGVkKCl9LGIuSnNvbkxvYWRlci5wcm90b3R5cGUub25Mb2FkZWQ9ZnVuY3Rpb24oKXt0aGlzLmxvYWRlZD0hMCx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6XCJsb2FkZWRcIixjb250ZW50OnRoaXN9KX0sYi5Kc29uTG9hZGVyLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOlwiZXJyb3JcIixjb250ZW50OnRoaXN9KX0sYi5BdGxhc0xvYWRlcj1mdW5jdGlvbihhLGIpe3RoaXMudXJsPWEsdGhpcy5iYXNlVXJsPWEucmVwbGFjZSgvW15cXC9dKiQvLFwiXCIpLHRoaXMuY3Jvc3NvcmlnaW49Yix0aGlzLmxvYWRlZD0hMX0sYi5BdGxhc0xvYWRlci5jb25zdHJ1Y3Rvcj1iLkF0bGFzTG9hZGVyLGIuRXZlbnRUYXJnZXQubWl4aW4oYi5BdGxhc0xvYWRlci5wcm90b3R5cGUpLGIuQXRsYXNMb2FkZXIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLmFqYXhSZXF1ZXN0PW5ldyBiLkFqYXhSZXF1ZXN0LHRoaXMuYWpheFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlPXRoaXMub25BdGxhc0xvYWRlZC5iaW5kKHRoaXMpLHRoaXMuYWpheFJlcXVlc3Qub3BlbihcIkdFVFwiLHRoaXMudXJsLCEwKSx0aGlzLmFqYXhSZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUmJnRoaXMuYWpheFJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZShcImFwcGxpY2F0aW9uL2pzb25cIiksdGhpcy5hamF4UmVxdWVzdC5zZW5kKG51bGwpfSxiLkF0bGFzTG9hZGVyLnByb3RvdHlwZS5vbkF0bGFzTG9hZGVkPWZ1bmN0aW9uKCl7aWYoND09PXRoaXMuYWpheFJlcXVlc3QucmVhZHlTdGF0ZSlpZigyMDA9PT10aGlzLmFqYXhSZXF1ZXN0LnN0YXR1c3x8LTE9PT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKFwiaHR0cFwiKSl7dGhpcy5hdGxhcz17bWV0YTp7aW1hZ2U6W119LGZyYW1lczpbXX07dmFyIGE9dGhpcy5hamF4UmVxdWVzdC5yZXNwb25zZVRleHQuc3BsaXQoL1xccj9cXG4vKSxjPS0zLGQ9MCxlPW51bGwsZj0hMSxnPTAsaD0wLGk9dGhpcy5vbkxvYWRlZC5iaW5kKHRoaXMpO2ZvcihnPTA7ZzxhLmxlbmd0aDtnKyspaWYoYVtnXT1hW2ddLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIiksXCJcIj09PWFbZ10mJihmPWcrMSksYVtnXS5sZW5ndGg+MCl7aWYoZj09PWcpdGhpcy5hdGxhcy5tZXRhLmltYWdlLnB1c2goYVtnXSksZD10aGlzLmF0bGFzLm1ldGEuaW1hZ2UubGVuZ3RoLTEsdGhpcy5hdGxhcy5mcmFtZXMucHVzaCh7fSksYz0tMztlbHNlIGlmKGM+MClpZihjJTc9PT0xKW51bGwhPWUmJih0aGlzLmF0bGFzLmZyYW1lc1tkXVtlLm5hbWVdPWUpLGU9e25hbWU6YVtnXSxmcmFtZTp7fX07ZWxzZXt2YXIgaj1hW2ddLnNwbGl0KFwiIFwiKTtpZihjJTc9PT0zKWUuZnJhbWUueD1OdW1iZXIoalsxXS5yZXBsYWNlKFwiLFwiLFwiXCIpKSxlLmZyYW1lLnk9TnVtYmVyKGpbMl0pO1xuZWxzZSBpZihjJTc9PT00KWUuZnJhbWUudz1OdW1iZXIoalsxXS5yZXBsYWNlKFwiLFwiLFwiXCIpKSxlLmZyYW1lLmg9TnVtYmVyKGpbMl0pO2Vsc2UgaWYoYyU3PT09NSl7dmFyIGs9e3g6MCx5OjAsdzpOdW1iZXIoalsxXS5yZXBsYWNlKFwiLFwiLFwiXCIpKSxoOk51bWJlcihqWzJdKX07ay53PmUuZnJhbWUud3x8ay5oPmUuZnJhbWUuaD8oZS50cmltbWVkPSEwLGUucmVhbFNpemU9ayk6ZS50cmltbWVkPSExfX1jKyt9aWYobnVsbCE9ZSYmKHRoaXMuYXRsYXMuZnJhbWVzW2RdW2UubmFtZV09ZSksdGhpcy5hdGxhcy5tZXRhLmltYWdlLmxlbmd0aD4wKXtmb3IodGhpcy5pbWFnZXM9W10saD0wO2g8dGhpcy5hdGxhcy5tZXRhLmltYWdlLmxlbmd0aDtoKyspe3ZhciBsPXRoaXMuYmFzZVVybCt0aGlzLmF0bGFzLm1ldGEuaW1hZ2VbaF0sbT10aGlzLmF0bGFzLmZyYW1lc1toXTt0aGlzLmltYWdlcy5wdXNoKG5ldyBiLkltYWdlTG9hZGVyKGwsdGhpcy5jcm9zc29yaWdpbikpO2ZvcihnIGluIG0pe3ZhciBuPW1bZ10uZnJhbWU7biYmKGIuVGV4dHVyZUNhY2hlW2ddPW5ldyBiLlRleHR1cmUodGhpcy5pbWFnZXNbaF0udGV4dHVyZS5iYXNlVGV4dHVyZSx7eDpuLngseTpuLnksd2lkdGg6bi53LGhlaWdodDpuLmh9KSxtW2ddLnRyaW1tZWQmJihiLlRleHR1cmVDYWNoZVtnXS5yZWFsU2l6ZT1tW2ddLnJlYWxTaXplLGIuVGV4dHVyZUNhY2hlW2ddLnRyaW0ueD0wLGIuVGV4dHVyZUNhY2hlW2ddLnRyaW0ueT0wKSl9fWZvcih0aGlzLmN1cnJlbnRJbWFnZUlkPTAsaD0wO2g8dGhpcy5pbWFnZXMubGVuZ3RoO2grKyl0aGlzLmltYWdlc1toXS5vbihcImxvYWRlZFwiLGkpO3RoaXMuaW1hZ2VzW3RoaXMuY3VycmVudEltYWdlSWRdLmxvYWQoKX1lbHNlIHRoaXMub25Mb2FkZWQoKX1lbHNlIHRoaXMub25FcnJvcigpfSxiLkF0bGFzTG9hZGVyLnByb3RvdHlwZS5vbkxvYWRlZD1mdW5jdGlvbigpe3RoaXMuaW1hZ2VzLmxlbmd0aC0xPnRoaXMuY3VycmVudEltYWdlSWQ/KHRoaXMuY3VycmVudEltYWdlSWQrKyx0aGlzLmltYWdlc1t0aGlzLmN1cnJlbnRJbWFnZUlkXS5sb2FkKCkpOih0aGlzLmxvYWRlZD0hMCx0aGlzLmVtaXQoXCJsb2FkZWRcIix7Y29udGVudDp0aGlzfSkpfSxiLkF0bGFzTG9hZGVyLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KFwiZXJyb3JcIix7Y29udGVudDp0aGlzfSl9LGIuU3ByaXRlU2hlZXRMb2FkZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLnVybD1hLHRoaXMuY3Jvc3NvcmlnaW49Yix0aGlzLmJhc2VVcmw9YS5yZXBsYWNlKC9bXlxcL10qJC8sXCJcIiksdGhpcy50ZXh0dXJlPW51bGwsdGhpcy5mcmFtZXM9e319LGIuU3ByaXRlU2hlZXRMb2FkZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuU3ByaXRlU2hlZXRMb2FkZXIsYi5FdmVudFRhcmdldC5taXhpbihiLlNwcml0ZVNoZWV0TG9hZGVyLnByb3RvdHlwZSksYi5TcHJpdGVTaGVldExvYWRlci5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1uZXcgYi5Kc29uTG9hZGVyKHRoaXMudXJsLHRoaXMuY3Jvc3NvcmlnaW4pO2Mub24oXCJsb2FkZWRcIixmdW5jdGlvbihiKXthLmpzb249Yi5kYXRhLmNvbnRlbnQuanNvbixhLm9uTG9hZGVkKCl9KSxjLmxvYWQoKX0sYi5TcHJpdGVTaGVldExvYWRlci5wcm90b3R5cGUub25Mb2FkZWQ9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoXCJsb2FkZWRcIix7Y29udGVudDp0aGlzfSl9LGIuSW1hZ2VMb2FkZXI9ZnVuY3Rpb24oYSxjKXt0aGlzLnRleHR1cmU9Yi5UZXh0dXJlLmZyb21JbWFnZShhLGMpLHRoaXMuZnJhbWVzPVtdfSxiLkltYWdlTG9hZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkltYWdlTG9hZGVyLGIuRXZlbnRUYXJnZXQubWl4aW4oYi5JbWFnZUxvYWRlci5wcm90b3R5cGUpLGIuSW1hZ2VMb2FkZXIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLnRleHR1cmUuYmFzZVRleHR1cmUuaGFzTG9hZGVkP3RoaXMub25Mb2FkZWQoKTp0aGlzLnRleHR1cmUuYmFzZVRleHR1cmUub24oXCJsb2FkZWRcIix0aGlzLm9uTG9hZGVkLmJpbmQodGhpcykpfSxiLkltYWdlTG9hZGVyLnByb3RvdHlwZS5vbkxvYWRlZD1mdW5jdGlvbigpe3RoaXMuZW1pdChcImxvYWRlZFwiLHtjb250ZW50OnRoaXN9KX0sYi5JbWFnZUxvYWRlci5wcm90b3R5cGUubG9hZEZyYW1lZFNwcml0ZVNoZWV0PWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmZyYW1lcz1bXTtmb3IodmFyIGU9TWF0aC5mbG9vcih0aGlzLnRleHR1cmUud2lkdGgvYSksZj1NYXRoLmZsb29yKHRoaXMudGV4dHVyZS5oZWlnaHQvYyksZz0wLGg9MDtmPmg7aCsrKWZvcih2YXIgaT0wO2U+aTtpKyssZysrKXt2YXIgaj1uZXcgYi5UZXh0dXJlKHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZSx7eDppKmEseTpoKmMsd2lkdGg6YSxoZWlnaHQ6Y30pO3RoaXMuZnJhbWVzLnB1c2goaiksZCYmKGIuVGV4dHVyZUNhY2hlW2QrXCItXCIrZ109ail9dGhpcy5sb2FkKCl9LGIuQml0bWFwRm9udExvYWRlcj1mdW5jdGlvbihhLGIpe3RoaXMudXJsPWEsdGhpcy5jcm9zc29yaWdpbj1iLHRoaXMuYmFzZVVybD1hLnJlcGxhY2UoL1teXFwvXSokLyxcIlwiKSx0aGlzLnRleHR1cmU9bnVsbH0sYi5CaXRtYXBGb250TG9hZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkJpdG1hcEZvbnRMb2FkZXIsYi5FdmVudFRhcmdldC5taXhpbihiLkJpdG1hcEZvbnRMb2FkZXIucHJvdG90eXBlKSxiLkJpdG1hcEZvbnRMb2FkZXIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLmFqYXhSZXF1ZXN0PW5ldyBiLkFqYXhSZXF1ZXN0LHRoaXMuYWpheFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlPXRoaXMub25YTUxMb2FkZWQuYmluZCh0aGlzKSx0aGlzLmFqYXhSZXF1ZXN0Lm9wZW4oXCJHRVRcIix0aGlzLnVybCwhMCksdGhpcy5hamF4UmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlJiZ0aGlzLmFqYXhSZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUoXCJhcHBsaWNhdGlvbi94bWxcIiksdGhpcy5hamF4UmVxdWVzdC5zZW5kKG51bGwpfSxiLkJpdG1hcEZvbnRMb2FkZXIucHJvdG90eXBlLm9uWE1MTG9hZGVkPWZ1bmN0aW9uKCl7aWYoND09PXRoaXMuYWpheFJlcXVlc3QucmVhZHlTdGF0ZSYmKDIwMD09PXRoaXMuYWpheFJlcXVlc3Quc3RhdHVzfHwtMT09PXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbC5pbmRleE9mKFwiaHR0cFwiKSkpe3ZhciBhPXRoaXMuYWpheFJlcXVlc3QucmVzcG9uc2VYTUw7aWYoIWF8fC9NU0lFIDkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxuYXZpZ2F0b3IuaXNDb2Nvb25KUylpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB3aW5kb3cuRE9NUGFyc2VyKXt2YXIgYz1uZXcgRE9NUGFyc2VyO2E9Yy5wYXJzZUZyb21TdHJpbmcodGhpcy5hamF4UmVxdWVzdC5yZXNwb25zZVRleHQsXCJ0ZXh0L3htbFwiKX1lbHNle3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZC5pbm5lckhUTUw9dGhpcy5hamF4UmVxdWVzdC5yZXNwb25zZVRleHQsYT1kfXZhciBlPXRoaXMuYmFzZVVybCthLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwicGFnZVwiKVswXS5nZXRBdHRyaWJ1dGUoXCJmaWxlXCIpLGY9bmV3IGIuSW1hZ2VMb2FkZXIoZSx0aGlzLmNyb3Nzb3JpZ2luKTt0aGlzLnRleHR1cmU9Zi50ZXh0dXJlLmJhc2VUZXh0dXJlO3ZhciBnPXt9LGg9YS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImluZm9cIilbMF0saT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29tbW9uXCIpWzBdO2cuZm9udD1oLmdldEF0dHJpYnV0ZShcImZhY2VcIiksZy5zaXplPXBhcnNlSW50KGguZ2V0QXR0cmlidXRlKFwic2l6ZVwiKSwxMCksZy5saW5lSGVpZ2h0PXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKFwibGluZUhlaWdodFwiKSwxMCksZy5jaGFycz17fTtmb3IodmFyIGo9YS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNoYXJcIiksaz0wO2s8ai5sZW5ndGg7aysrKXt2YXIgbD1wYXJzZUludChqW2tdLmdldEF0dHJpYnV0ZShcImlkXCIpLDEwKSxtPW5ldyBiLlJlY3RhbmdsZShwYXJzZUludChqW2tdLmdldEF0dHJpYnV0ZShcInhcIiksMTApLHBhcnNlSW50KGpba10uZ2V0QXR0cmlidXRlKFwieVwiKSwxMCkscGFyc2VJbnQoaltrXS5nZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSwxMCkscGFyc2VJbnQoaltrXS5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiksMTApKTtnLmNoYXJzW2xdPXt4T2Zmc2V0OnBhcnNlSW50KGpba10uZ2V0QXR0cmlidXRlKFwieG9mZnNldFwiKSwxMCkseU9mZnNldDpwYXJzZUludChqW2tdLmdldEF0dHJpYnV0ZShcInlvZmZzZXRcIiksMTApLHhBZHZhbmNlOnBhcnNlSW50KGpba10uZ2V0QXR0cmlidXRlKFwieGFkdmFuY2VcIiksMTApLGtlcm5pbmc6e30sdGV4dHVyZTpiLlRleHR1cmVDYWNoZVtsXT1uZXcgYi5UZXh0dXJlKHRoaXMudGV4dHVyZSxtKX19dmFyIG49YS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImtlcm5pbmdcIik7Zm9yKGs9MDtrPG4ubGVuZ3RoO2srKyl7dmFyIG89cGFyc2VJbnQobltrXS5nZXRBdHRyaWJ1dGUoXCJmaXJzdFwiKSwxMCkscD1wYXJzZUludChuW2tdLmdldEF0dHJpYnV0ZShcInNlY29uZFwiKSwxMCkscT1wYXJzZUludChuW2tdLmdldEF0dHJpYnV0ZShcImFtb3VudFwiKSwxMCk7Zy5jaGFyc1twXS5rZXJuaW5nW29dPXF9Yi5CaXRtYXBUZXh0LmZvbnRzW2cuZm9udF09ZyxmLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkZWRcIix0aGlzLm9uTG9hZGVkLmJpbmQodGhpcykpLGYubG9hZCgpfX0sYi5CaXRtYXBGb250TG9hZGVyLnByb3RvdHlwZS5vbkxvYWRlZD1mdW5jdGlvbigpe3RoaXMuZW1pdChcImxvYWRlZFwiLHtjb250ZW50OnRoaXN9KX0sYi5TcGluZUxvYWRlcj1mdW5jdGlvbihhLGIpe3RoaXMudXJsPWEsdGhpcy5jcm9zc29yaWdpbj1iLHRoaXMubG9hZGVkPSExfSxiLlNwaW5lTG9hZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLlNwaW5lTG9hZGVyLGIuRXZlbnRUYXJnZXQubWl4aW4oYi5TcGluZUxvYWRlci5wcm90b3R5cGUpLGIuU3BpbmVMb2FkZXIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9bmV3IGIuSnNvbkxvYWRlcih0aGlzLnVybCx0aGlzLmNyb3Nzb3JpZ2luKTtjLm9uKFwibG9hZGVkXCIsZnVuY3Rpb24oYil7YS5qc29uPWIuZGF0YS5jb250ZW50Lmpzb24sYS5vbkxvYWRlZCgpfSksYy5sb2FkKCl9LGIuU3BpbmVMb2FkZXIucHJvdG90eXBlLm9uTG9hZGVkPWZ1bmN0aW9uKCl7dGhpcy5sb2FkZWQ9ITAsdGhpcy5lbWl0KFwibG9hZGVkXCIse2NvbnRlbnQ6dGhpc30pfSxiLkFic3RyYWN0RmlsdGVyPWZ1bmN0aW9uKGEsYil7dGhpcy5wYXNzZXM9W3RoaXNdLHRoaXMuc2hhZGVycz1bXSx0aGlzLmRpcnR5PSEwLHRoaXMucGFkZGluZz0wLHRoaXMudW5pZm9ybXM9Ynx8e30sdGhpcy5mcmFnbWVudFNyYz1hfHxbXX0sYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5BYnN0cmFjdEZpbHRlcixiLkFic3RyYWN0RmlsdGVyLnByb3RvdHlwZS5zeW5jVW5pZm9ybXM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiPXRoaXMuc2hhZGVycy5sZW5ndGg7Yj5hO2ErKyl0aGlzLnNoYWRlcnNbYV0uZGlydHk9ITB9LGIuQWxwaGFNYXNrRmlsdGVyPWZ1bmN0aW9uKGEpe2IuQWJzdHJhY3RGaWx0ZXIuY2FsbCh0aGlzKSx0aGlzLnBhc3Nlcz1bdGhpc10sYS5iYXNlVGV4dHVyZS5fcG93ZXJPZjI9ITAsdGhpcy51bmlmb3Jtcz17bWFzazp7dHlwZTpcInNhbXBsZXIyRFwiLHZhbHVlOmF9LG1hcERpbWVuc2lvbnM6e3R5cGU6XCIyZlwiLHZhbHVlOnt4OjEseTo1MTEyfX0sZGltZW5zaW9uczp7dHlwZTpcIjRmdlwiLHZhbHVlOlswLDAsMCwwXX19LGEuYmFzZVRleHR1cmUuaGFzTG9hZGVkPyh0aGlzLnVuaWZvcm1zLm1hc2sudmFsdWUueD1hLndpZHRoLHRoaXMudW5pZm9ybXMubWFzay52YWx1ZS55PWEuaGVpZ2h0KToodGhpcy5ib3VuZExvYWRlZEZ1bmN0aW9uPXRoaXMub25UZXh0dXJlTG9hZGVkLmJpbmQodGhpcyksYS5iYXNlVGV4dHVyZS5vbihcImxvYWRlZFwiLHRoaXMuYm91bmRMb2FkZWRGdW5jdGlvbikpLHRoaXMuZnJhZ21lbnRTcmM9W1wicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XCIsXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcInZhcnlpbmcgdmVjNCB2Q29sb3I7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCBtYXNrO1wiLFwidW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XCIsXCJ1bmlmb3JtIHZlYzIgb2Zmc2V0O1wiLFwidW5pZm9ybSB2ZWM0IGRpbWVuc2lvbnM7XCIsXCJ1bmlmb3JtIHZlYzIgbWFwRGltZW5zaW9ucztcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICB2ZWMyIG1hcENvcmRzID0gdlRleHR1cmVDb29yZC54eTtcIixcIiAgIG1hcENvcmRzICs9IChkaW1lbnNpb25zLnp3ICsgb2Zmc2V0KS8gZGltZW5zaW9ucy54eSA7XCIsXCIgICBtYXBDb3Jkcy55ICo9IC0xLjA7XCIsXCIgICBtYXBDb3Jkcy55ICs9IDEuMDtcIixcIiAgIG1hcENvcmRzICo9IGRpbWVuc2lvbnMueHkgLyBtYXBEaW1lbnNpb25zO1wiLFwiICAgdmVjNCBvcmlnaW5hbCA9ICB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpO1wiLFwiICAgZmxvYXQgbWFza0FscGhhID0gIHRleHR1cmUyRChtYXNrLCBtYXBDb3JkcykucjtcIixcIiAgIG9yaWdpbmFsICo9IG1hc2tBbHBoYTtcIixcIiAgIGdsX0ZyYWdDb2xvciA9ICBvcmlnaW5hbDtcIixcIn1cIl19LGIuQWxwaGFNYXNrRmlsdGVyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuQWJzdHJhY3RGaWx0ZXIucHJvdG90eXBlKSxiLkFscGhhTWFza0ZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5BbHBoYU1hc2tGaWx0ZXIsYi5BbHBoYU1hc2tGaWx0ZXIucHJvdG90eXBlLm9uVGV4dHVyZUxvYWRlZD1mdW5jdGlvbigpe3RoaXMudW5pZm9ybXMubWFwRGltZW5zaW9ucy52YWx1ZS54PXRoaXMudW5pZm9ybXMubWFzay52YWx1ZS53aWR0aCx0aGlzLnVuaWZvcm1zLm1hcERpbWVuc2lvbnMudmFsdWUueT10aGlzLnVuaWZvcm1zLm1hc2sudmFsdWUuaGVpZ2h0LHRoaXMudW5pZm9ybXMubWFzay52YWx1ZS5iYXNlVGV4dHVyZS5vZmYoXCJsb2FkZWRcIix0aGlzLmJvdW5kTG9hZGVkRnVuY3Rpb24pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5BbHBoYU1hc2tGaWx0ZXIucHJvdG90eXBlLFwibWFwXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLm1hc2sudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLm1hc2sudmFsdWU9YX19KSxiLkNvbG9yTWF0cml4RmlsdGVyPWZ1bmN0aW9uKCl7Yi5BYnN0cmFjdEZpbHRlci5jYWxsKHRoaXMpLHRoaXMucGFzc2VzPVt0aGlzXSx0aGlzLnVuaWZvcm1zPXttYXRyaXg6e3R5cGU6XCJtYXQ0XCIsdmFsdWU6WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdfX0sdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInVuaWZvcm0gZmxvYXQgaW52ZXJ0O1wiLFwidW5pZm9ybSBtYXQ0IG1hdHJpeDtcIixcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCkgKiBtYXRyaXg7XCIsXCJ9XCJdfSxiLkNvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuQWJzdHJhY3RGaWx0ZXIucHJvdG90eXBlKSxiLkNvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkNvbG9yTWF0cml4RmlsdGVyLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkNvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZSxcIm1hdHJpeFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5tYXRyaXgudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLm1hdHJpeC52YWx1ZT1hfX0pLGIuR3JheUZpbHRlcj1mdW5jdGlvbigpe2IuQWJzdHJhY3RGaWx0ZXIuY2FsbCh0aGlzKSx0aGlzLnBhc3Nlcz1bdGhpc10sdGhpcy51bmlmb3Jtcz17Z3JheTp7dHlwZTpcIjFmXCIsdmFsdWU6MX19LHRoaXMuZnJhZ21lbnRTcmM9W1wicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XCIsXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcInZhcnlpbmcgdmVjNCB2Q29sb3I7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcInVuaWZvcm0gZmxvYXQgZ3JheTtcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpO1wiLFwiICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peChnbF9GcmFnQ29sb3IucmdiLCB2ZWMzKDAuMjEyNipnbF9GcmFnQ29sb3IuciArIDAuNzE1MipnbF9GcmFnQ29sb3IuZyArIDAuMDcyMipnbF9GcmFnQ29sb3IuYiksIGdyYXkpO1wiLFwifVwiXX0sYi5HcmF5RmlsdGVyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuQWJzdHJhY3RGaWx0ZXIucHJvdG90eXBlKSxiLkdyYXlGaWx0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuR3JheUZpbHRlcixPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5HcmF5RmlsdGVyLnByb3RvdHlwZSxcImdyYXlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuZ3JheS52YWx1ZX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudW5pZm9ybXMuZ3JheS52YWx1ZT1hfX0pLGIuRGlzcGxhY2VtZW50RmlsdGVyPWZ1bmN0aW9uKGEpe2IuQWJzdHJhY3RGaWx0ZXIuY2FsbCh0aGlzKSx0aGlzLnBhc3Nlcz1bdGhpc10sYS5iYXNlVGV4dHVyZS5fcG93ZXJPZjI9ITAsdGhpcy51bmlmb3Jtcz17ZGlzcGxhY2VtZW50TWFwOnt0eXBlOlwic2FtcGxlcjJEXCIsdmFsdWU6YX0sc2NhbGU6e3R5cGU6XCIyZlwiLHZhbHVlOnt4OjMwLHk6MzB9fSxvZmZzZXQ6e3R5cGU6XCIyZlwiLHZhbHVlOnt4OjAseTowfX0sbWFwRGltZW5zaW9uczp7dHlwZTpcIjJmXCIsdmFsdWU6e3g6MSx5OjUxMTJ9fSxkaW1lbnNpb25zOnt0eXBlOlwiNGZ2XCIsdmFsdWU6WzAsMCwwLDBdfX0sYS5iYXNlVGV4dHVyZS5oYXNMb2FkZWQ/KHRoaXMudW5pZm9ybXMubWFwRGltZW5zaW9ucy52YWx1ZS54PWEud2lkdGgsdGhpcy51bmlmb3Jtcy5tYXBEaW1lbnNpb25zLnZhbHVlLnk9YS5oZWlnaHQpOih0aGlzLmJvdW5kTG9hZGVkRnVuY3Rpb249dGhpcy5vblRleHR1cmVMb2FkZWQuYmluZCh0aGlzKSxhLmJhc2VUZXh0dXJlLm9uKFwibG9hZGVkXCIsdGhpcy5ib3VuZExvYWRlZEZ1bmN0aW9uKSksdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcIixcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFwidW5pZm9ybSB2ZWMyIHNjYWxlO1wiLFwidW5pZm9ybSB2ZWMyIG9mZnNldDtcIixcInVuaWZvcm0gdmVjNCBkaW1lbnNpb25zO1wiLFwidW5pZm9ybSB2ZWMyIG1hcERpbWVuc2lvbnM7XCIsXCJ2b2lkIG1haW4odm9pZCkge1wiLFwiICAgdmVjMiBtYXBDb3JkcyA9IHZUZXh0dXJlQ29vcmQueHk7XCIsXCIgICBtYXBDb3JkcyArPSAoZGltZW5zaW9ucy56dyArIG9mZnNldCkvIGRpbWVuc2lvbnMueHkgO1wiLFwiICAgbWFwQ29yZHMueSAqPSAtMS4wO1wiLFwiICAgbWFwQ29yZHMueSArPSAxLjA7XCIsXCIgICB2ZWMyIG1hdFNhbXBsZSA9IHRleHR1cmUyRChkaXNwbGFjZW1lbnRNYXAsIG1hcENvcmRzKS54eTtcIixcIiAgIG1hdFNhbXBsZSAtPSAwLjU7XCIsXCIgICBtYXRTYW1wbGUgKj0gc2NhbGU7XCIsXCIgICBtYXRTYW1wbGUgLz0gbWFwRGltZW5zaW9ucztcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLnggKyBtYXRTYW1wbGUueCwgdlRleHR1cmVDb29yZC55ICsgbWF0U2FtcGxlLnkpKTtcIixcIiAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGdsX0ZyYWdDb2xvci5yZ2IsIDEuMCk7XCIsXCIgICB2ZWMyIGNvcmQgPSB2VGV4dHVyZUNvb3JkO1wiLFwifVwiXX0sYi5EaXNwbGFjZW1lbnRGaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuRGlzcGxhY2VtZW50RmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkRpc3BsYWNlbWVudEZpbHRlcixiLkRpc3BsYWNlbWVudEZpbHRlci5wcm90b3R5cGUub25UZXh0dXJlTG9hZGVkPWZ1bmN0aW9uKCl7dGhpcy51bmlmb3Jtcy5tYXBEaW1lbnNpb25zLnZhbHVlLng9dGhpcy51bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUud2lkdGgsdGhpcy51bmlmb3Jtcy5tYXBEaW1lbnNpb25zLnZhbHVlLnk9dGhpcy51bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUuaGVpZ2h0LHRoaXMudW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlLmJhc2VUZXh0dXJlLm9mZihcImxvYWRlZFwiLHRoaXMuYm91bmRMb2FkZWRGdW5jdGlvbil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkRpc3BsYWNlbWVudEZpbHRlci5wcm90b3R5cGUsXCJtYXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy51bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWU9YX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5EaXNwbGFjZW1lbnRGaWx0ZXIucHJvdG90eXBlLFwic2NhbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuc2NhbGUudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLnNjYWxlLnZhbHVlPWF9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuRGlzcGxhY2VtZW50RmlsdGVyLnByb3RvdHlwZSxcIm9mZnNldFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5vZmZzZXQudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLm9mZnNldC52YWx1ZT1hfX0pLGIuUGl4ZWxhdGVGaWx0ZXI9ZnVuY3Rpb24oKXtiLkFic3RyYWN0RmlsdGVyLmNhbGwodGhpcyksdGhpcy5wYXNzZXM9W3RoaXNdLHRoaXMudW5pZm9ybXM9e2ludmVydDp7dHlwZTpcIjFmXCIsdmFsdWU6MH0sZGltZW5zaW9uczp7dHlwZTpcIjRmdlwiLHZhbHVlOm5ldyBiLkZsb2F0MzJBcnJheShbMWU0LDEwMCwxMCwxMF0pfSxwaXhlbFNpemU6e3R5cGU6XCIyZlwiLHZhbHVlOnt4OjEwLHk6MTB9fX0sdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInVuaWZvcm0gdmVjMiB0ZXN0RGltO1wiLFwidW5pZm9ybSB2ZWM0IGRpbWVuc2lvbnM7XCIsXCJ1bmlmb3JtIHZlYzIgcGl4ZWxTaXplO1wiLFwidW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XCIsXCJ2b2lkIG1haW4odm9pZCkge1wiLFwiICAgdmVjMiBjb29yZCA9IHZUZXh0dXJlQ29vcmQ7XCIsXCIgICB2ZWMyIHNpemUgPSBkaW1lbnNpb25zLnh5L3BpeGVsU2l6ZTtcIixcIiAgIHZlYzIgY29sb3IgPSBmbG9vciggKCB2VGV4dHVyZUNvb3JkICogc2l6ZSApICkgLyBzaXplICsgcGl4ZWxTaXplL2RpbWVuc2lvbnMueHkgKiAwLjU7XCIsXCIgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIGNvbG9yKTtcIixcIn1cIl19LGIuUGl4ZWxhdGVGaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuUGl4ZWxhdGVGaWx0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuUGl4ZWxhdGVGaWx0ZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuUGl4ZWxhdGVGaWx0ZXIucHJvdG90eXBlLFwic2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5waXhlbFNpemUudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLmRpcnR5PSEwLHRoaXMudW5pZm9ybXMucGl4ZWxTaXplLnZhbHVlPWF9fSksYi5CbHVyWEZpbHRlcj1mdW5jdGlvbigpe2IuQWJzdHJhY3RGaWx0ZXIuY2FsbCh0aGlzKSx0aGlzLnBhc3Nlcz1bdGhpc10sdGhpcy51bmlmb3Jtcz17Ymx1cjp7dHlwZTpcIjFmXCIsdmFsdWU6MS81MTJ9fSx0aGlzLmZyYWdtZW50U3JjPVtcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIHZlYzQgdkNvbG9yO1wiLFwidW5pZm9ybSBmbG9hdCBibHVyO1wiLFwidW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XCIsXCJ2b2lkIG1haW4odm9pZCkge1wiLFwiICAgdmVjNCBzdW0gPSB2ZWM0KDAuMCk7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCAtIDQuMCpibHVyLCB2VGV4dHVyZUNvb3JkLnkpKSAqIDAuMDU7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCAtIDMuMCpibHVyLCB2VGV4dHVyZUNvb3JkLnkpKSAqIDAuMDk7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCAtIDIuMCpibHVyLCB2VGV4dHVyZUNvb3JkLnkpKSAqIDAuMTI7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCAtIGJsdXIsIHZUZXh0dXJlQ29vcmQueSkpICogMC4xNTtcIixcIiAgIHN1bSArPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZlYzIodlRleHR1cmVDb29yZC54LCB2VGV4dHVyZUNvb3JkLnkpKSAqIDAuMTY7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCArIGJsdXIsIHZUZXh0dXJlQ29vcmQueSkpICogMC4xNTtcIixcIiAgIHN1bSArPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZlYzIodlRleHR1cmVDb29yZC54ICsgMi4wKmJsdXIsIHZUZXh0dXJlQ29vcmQueSkpICogMC4xMjtcIixcIiAgIHN1bSArPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZlYzIodlRleHR1cmVDb29yZC54ICsgMy4wKmJsdXIsIHZUZXh0dXJlQ29vcmQueSkpICogMC4wOTtcIixcIiAgIHN1bSArPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZlYzIodlRleHR1cmVDb29yZC54ICsgNC4wKmJsdXIsIHZUZXh0dXJlQ29vcmQueSkpICogMC4wNTtcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHN1bTtcIixcIn1cIl19LGIuQmx1clhGaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuQmx1clhGaWx0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuQmx1clhGaWx0ZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuQmx1clhGaWx0ZXIucHJvdG90eXBlLFwiYmx1clwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5ibHVyLnZhbHVlLygxLzdlMyl9LHNldDpmdW5jdGlvbihhKXt0aGlzLmRpcnR5PSEwLHRoaXMudW5pZm9ybXMuYmx1ci52YWx1ZT0xLzdlMyphfX0pLGIuQmx1cllGaWx0ZXI9ZnVuY3Rpb24oKXtiLkFic3RyYWN0RmlsdGVyLmNhbGwodGhpcyksdGhpcy5wYXNzZXM9W3RoaXNdLHRoaXMudW5pZm9ybXM9e2JsdXI6e3R5cGU6XCIxZlwiLHZhbHVlOjEvNTEyfX0sdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInVuaWZvcm0gZmxvYXQgYmx1cjtcIixcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIHZlYzQgc3VtID0gdmVjNCgwLjApO1wiLFwiICAgc3VtICs9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLngsIHZUZXh0dXJlQ29vcmQueSAtIDQuMCpibHVyKSkgKiAwLjA1O1wiLFwiICAgc3VtICs9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLngsIHZUZXh0dXJlQ29vcmQueSAtIDMuMCpibHVyKSkgKiAwLjA5O1wiLFwiICAgc3VtICs9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLngsIHZUZXh0dXJlQ29vcmQueSAtIDIuMCpibHVyKSkgKiAwLjEyO1wiLFwiICAgc3VtICs9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLngsIHZUZXh0dXJlQ29vcmQueSAtIGJsdXIpKSAqIDAuMTU7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCwgdlRleHR1cmVDb29yZC55KSkgKiAwLjE2O1wiLFwiICAgc3VtICs9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLngsIHZUZXh0dXJlQ29vcmQueSArIGJsdXIpKSAqIDAuMTU7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCwgdlRleHR1cmVDb29yZC55ICsgMi4wKmJsdXIpKSAqIDAuMTI7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCwgdlRleHR1cmVDb29yZC55ICsgMy4wKmJsdXIpKSAqIDAuMDk7XCIsXCIgICBzdW0gKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2ZWMyKHZUZXh0dXJlQ29vcmQueCwgdlRleHR1cmVDb29yZC55ICsgNC4wKmJsdXIpKSAqIDAuMDU7XCIsXCIgICBnbF9GcmFnQ29sb3IgPSBzdW07XCIsXCJ9XCJdfSxiLkJsdXJZRmlsdGVyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuQWJzdHJhY3RGaWx0ZXIucHJvdG90eXBlKSxiLkJsdXJZRmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkJsdXJZRmlsdGVyLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkJsdXJZRmlsdGVyLnByb3RvdHlwZSxcImJsdXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuYmx1ci52YWx1ZS8oMS83ZTMpfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy51bmlmb3Jtcy5ibHVyLnZhbHVlPTEvN2UzKmF9fSksYi5CbHVyRmlsdGVyPWZ1bmN0aW9uKCl7dGhpcy5ibHVyWEZpbHRlcj1uZXcgYi5CbHVyWEZpbHRlcix0aGlzLmJsdXJZRmlsdGVyPW5ldyBiLkJsdXJZRmlsdGVyLHRoaXMucGFzc2VzPVt0aGlzLmJsdXJYRmlsdGVyLHRoaXMuYmx1cllGaWx0ZXJdfSxiLkJsdXJGaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuQmx1ckZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5CbHVyRmlsdGVyLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkJsdXJGaWx0ZXIucHJvdG90eXBlLFwiYmx1clwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibHVyWEZpbHRlci5ibHVyfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ibHVyWEZpbHRlci5ibHVyPXRoaXMuYmx1cllGaWx0ZXIuYmx1cj1hfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkJsdXJGaWx0ZXIucHJvdG90eXBlLFwiYmx1clhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmx1clhGaWx0ZXIuYmx1cn0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuYmx1clhGaWx0ZXIuYmx1cj1hfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkJsdXJGaWx0ZXIucHJvdG90eXBlLFwiYmx1cllcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmx1cllGaWx0ZXIuYmx1cn0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuYmx1cllGaWx0ZXIuYmx1cj1hfX0pLGIuSW52ZXJ0RmlsdGVyPWZ1bmN0aW9uKCl7Yi5BYnN0cmFjdEZpbHRlci5jYWxsKHRoaXMpLHRoaXMucGFzc2VzPVt0aGlzXSx0aGlzLnVuaWZvcm1zPXtpbnZlcnQ6e3R5cGU6XCIxZlwiLHZhbHVlOjF9fSx0aGlzLmZyYWdtZW50U3JjPVtcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIHZlYzQgdkNvbG9yO1wiLFwidW5pZm9ybSBmbG9hdCBpbnZlcnQ7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpO1wiLFwiICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggKHZlYzMoMSktZ2xfRnJhZ0NvbG9yLnJnYikgKiBnbF9GcmFnQ29sb3IuYSwgZ2xfRnJhZ0NvbG9yLnJnYiwgMS4wIC0gaW52ZXJ0KTtcIixcIn1cIl19LGIuSW52ZXJ0RmlsdGVyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuQWJzdHJhY3RGaWx0ZXIucHJvdG90eXBlKSxiLkludmVydEZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5JbnZlcnRGaWx0ZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuSW52ZXJ0RmlsdGVyLnByb3RvdHlwZSxcImludmVydFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5pbnZlcnQudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLmludmVydC52YWx1ZT1hfX0pLGIuU2VwaWFGaWx0ZXI9ZnVuY3Rpb24oKXtiLkFic3RyYWN0RmlsdGVyLmNhbGwodGhpcyksdGhpcy5wYXNzZXM9W3RoaXNdLHRoaXMudW5pZm9ybXM9e3NlcGlhOnt0eXBlOlwiMWZcIix2YWx1ZToxfX0sdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInVuaWZvcm0gZmxvYXQgc2VwaWE7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcImNvbnN0IG1hdDMgc2VwaWFNYXRyaXggPSBtYXQzKDAuMzU4OCwgMC43MDQ0LCAwLjEzNjgsIDAuMjk5MCwgMC41ODcwLCAwLjExNDAsIDAuMjM5MiwgMC40Njk2LCAwLjA5MTIpO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XCIsXCIgICBnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBnbF9GcmFnQ29sb3IucmdiICogc2VwaWFNYXRyaXgsIHNlcGlhKTtcIixcIn1cIl19LGIuU2VwaWFGaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuU2VwaWFGaWx0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuU2VwaWFGaWx0ZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuU2VwaWFGaWx0ZXIucHJvdG90eXBlLFwic2VwaWFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuc2VwaWEudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLnNlcGlhLnZhbHVlPWF9fSksYi5Ud2lzdEZpbHRlcj1mdW5jdGlvbigpe2IuQWJzdHJhY3RGaWx0ZXIuY2FsbCh0aGlzKSx0aGlzLnBhc3Nlcz1bdGhpc10sdGhpcy51bmlmb3Jtcz17cmFkaXVzOnt0eXBlOlwiMWZcIix2YWx1ZTouNX0sYW5nbGU6e3R5cGU6XCIxZlwiLHZhbHVlOjV9LG9mZnNldDp7dHlwZTpcIjJmXCIsdmFsdWU6e3g6LjUseTouNX19fSx0aGlzLmZyYWdtZW50U3JjPVtcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIHZlYzQgdkNvbG9yO1wiLFwidW5pZm9ybSB2ZWM0IGRpbWVuc2lvbnM7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcInVuaWZvcm0gZmxvYXQgcmFkaXVzO1wiLFwidW5pZm9ybSBmbG9hdCBhbmdsZTtcIixcInVuaWZvcm0gdmVjMiBvZmZzZXQ7XCIsXCJ2b2lkIG1haW4odm9pZCkge1wiLFwiICAgdmVjMiBjb29yZCA9IHZUZXh0dXJlQ29vcmQgLSBvZmZzZXQ7XCIsXCIgICBmbG9hdCBkaXN0YW5jZSA9IGxlbmd0aChjb29yZCk7XCIsXCIgICBpZiAoZGlzdGFuY2UgPCByYWRpdXMpIHtcIixcIiAgICAgICBmbG9hdCByYXRpbyA9IChyYWRpdXMgLSBkaXN0YW5jZSkgLyByYWRpdXM7XCIsXCIgICAgICAgZmxvYXQgYW5nbGVNb2QgPSByYXRpbyAqIHJhdGlvICogYW5nbGU7XCIsXCIgICAgICAgZmxvYXQgcyA9IHNpbihhbmdsZU1vZCk7XCIsXCIgICAgICAgZmxvYXQgYyA9IGNvcyhhbmdsZU1vZCk7XCIsXCIgICAgICAgY29vcmQgPSB2ZWMyKGNvb3JkLnggKiBjIC0gY29vcmQueSAqIHMsIGNvb3JkLnggKiBzICsgY29vcmQueSAqIGMpO1wiLFwiICAgfVwiLFwiICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCBjb29yZCtvZmZzZXQpO1wiLFwifVwiXX0sYi5Ud2lzdEZpbHRlci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiLkFic3RyYWN0RmlsdGVyLnByb3RvdHlwZSksYi5Ud2lzdEZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5Ud2lzdEZpbHRlcixPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5Ud2lzdEZpbHRlci5wcm90b3R5cGUsXCJvZmZzZXRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMub2Zmc2V0LnZhbHVlfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5kaXJ0eT0hMCx0aGlzLnVuaWZvcm1zLm9mZnNldC52YWx1ZT1hfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLlR3aXN0RmlsdGVyLnByb3RvdHlwZSxcInJhZGl1c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5yYWRpdXMudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLmRpcnR5PSEwLHRoaXMudW5pZm9ybXMucmFkaXVzLnZhbHVlPWF9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuVHdpc3RGaWx0ZXIucHJvdG90eXBlLFwiYW5nbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuYW5nbGUudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLmRpcnR5PSEwLHRoaXMudW5pZm9ybXMuYW5nbGUudmFsdWU9YX19KSxiLkNvbG9yU3RlcEZpbHRlcj1mdW5jdGlvbigpe2IuQWJzdHJhY3RGaWx0ZXIuY2FsbCh0aGlzKSx0aGlzLnBhc3Nlcz1bdGhpc10sdGhpcy51bmlmb3Jtcz17c3RlcDp7dHlwZTpcIjFmXCIsdmFsdWU6NX19LHRoaXMuZnJhZ21lbnRTcmM9W1wicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XCIsXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcInZhcnlpbmcgdmVjNCB2Q29sb3I7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcInVuaWZvcm0gZmxvYXQgc3RlcDtcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKTtcIixcIiAgIGNvbG9yID0gZmxvb3IoY29sb3IgKiBzdGVwKSAvIHN0ZXA7XCIsXCIgICBnbF9GcmFnQ29sb3IgPSBjb2xvcjtcIixcIn1cIl19LGIuQ29sb3JTdGVwRmlsdGVyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGIuQWJzdHJhY3RGaWx0ZXIucHJvdG90eXBlKSxiLkNvbG9yU3RlcEZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5Db2xvclN0ZXBGaWx0ZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuQ29sb3JTdGVwRmlsdGVyLnByb3RvdHlwZSxcInN0ZXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuc3RlcC52YWx1ZX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudW5pZm9ybXMuc3RlcC52YWx1ZT1hfX0pLGIuRG90U2NyZWVuRmlsdGVyPWZ1bmN0aW9uKCl7Yi5BYnN0cmFjdEZpbHRlci5jYWxsKHRoaXMpLHRoaXMucGFzc2VzPVt0aGlzXSx0aGlzLnVuaWZvcm1zPXtzY2FsZTp7dHlwZTpcIjFmXCIsdmFsdWU6MX0sYW5nbGU6e3R5cGU6XCIxZlwiLHZhbHVlOjV9LGRpbWVuc2lvbnM6e3R5cGU6XCI0ZnZcIix2YWx1ZTpbMCwwLDAsMF19fSx0aGlzLmZyYWdtZW50U3JjPVtcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIHZlYzQgdkNvbG9yO1wiLFwidW5pZm9ybSB2ZWM0IGRpbWVuc2lvbnM7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcInVuaWZvcm0gZmxvYXQgYW5nbGU7XCIsXCJ1bmlmb3JtIGZsb2F0IHNjYWxlO1wiLFwiZmxvYXQgcGF0dGVybigpIHtcIixcIiAgIGZsb2F0IHMgPSBzaW4oYW5nbGUpLCBjID0gY29zKGFuZ2xlKTtcIixcIiAgIHZlYzIgdGV4ID0gdlRleHR1cmVDb29yZCAqIGRpbWVuc2lvbnMueHk7XCIsXCIgICB2ZWMyIHBvaW50ID0gdmVjMihcIixcIiAgICAgICBjICogdGV4LnggLSBzICogdGV4LnksXCIsXCIgICAgICAgcyAqIHRleC54ICsgYyAqIHRleC55XCIsXCIgICApICogc2NhbGU7XCIsXCIgICByZXR1cm4gKHNpbihwb2ludC54KSAqIHNpbihwb2ludC55KSkgKiA0LjA7XCIsXCJ9XCIsXCJ2b2lkIG1haW4oKSB7XCIsXCIgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKTtcIixcIiAgIGZsb2F0IGF2ZXJhZ2UgPSAoY29sb3IuciArIGNvbG9yLmcgKyBjb2xvci5iKSAvIDMuMDtcIixcIiAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodmVjMyhhdmVyYWdlICogMTAuMCAtIDUuMCArIHBhdHRlcm4oKSksIGNvbG9yLmEpO1wiLFwifVwiXX0sYi5Eb3RTY3JlZW5GaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuRG90U2NyZWVuRmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iLkRvdFNjcmVlbkZpbHRlcixPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5Eb3RTY3JlZW5GaWx0ZXIucHJvdG90eXBlLFwic2NhbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuc2NhbGUudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLmRpcnR5PSEwLHRoaXMudW5pZm9ybXMuc2NhbGUudmFsdWU9YX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYi5Eb3RTY3JlZW5GaWx0ZXIucHJvdG90eXBlLFwiYW5nbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuYW5nbGUudmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLmRpcnR5PSEwLHRoaXMudW5pZm9ybXMuYW5nbGUudmFsdWU9YX19KSxiLkNyb3NzSGF0Y2hGaWx0ZXI9ZnVuY3Rpb24oKXtiLkFic3RyYWN0RmlsdGVyLmNhbGwodGhpcyksdGhpcy5wYXNzZXM9W3RoaXNdLHRoaXMudW5pZm9ybXM9e2JsdXI6e3R5cGU6XCIxZlwiLHZhbHVlOjEvNTEyfX0sdGhpcy5mcmFnbWVudFNyYz1bXCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcIixcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFwidmFyeWluZyB2ZWM0IHZDb2xvcjtcIixcInVuaWZvcm0gZmxvYXQgYmx1cjtcIixcInVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1wiLFwidm9pZCBtYWluKHZvaWQpIHtcIixcIiAgICBmbG9hdCBsdW0gPSBsZW5ndGgodGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkLnh5KS5yZ2IpO1wiLFwiICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wLCAxLjAsIDEuMCwgMS4wKTtcIixcIiAgICBpZiAobHVtIDwgMS4wMCkge1wiLFwiICAgICAgICBpZiAobW9kKGdsX0ZyYWdDb29yZC54ICsgZ2xfRnJhZ0Nvb3JkLnksIDEwLjApID09IDAuMCkge1wiLFwiICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1wiLFwiICAgICAgICB9XCIsXCIgICAgfVwiLFwiICAgIGlmIChsdW0gPCAwLjc1KSB7XCIsXCIgICAgICAgIGlmIChtb2QoZ2xfRnJhZ0Nvb3JkLnggLSBnbF9GcmFnQ29vcmQueSwgMTAuMCkgPT0gMC4wKSB7XCIsXCIgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7XCIsXCIgICAgICAgIH1cIixcIiAgICB9XCIsXCIgICAgaWYgKGx1bSA8IDAuNTApIHtcIixcIiAgICAgICAgaWYgKG1vZChnbF9GcmFnQ29vcmQueCArIGdsX0ZyYWdDb29yZC55IC0gNS4wLCAxMC4wKSA9PSAwLjApIHtcIixcIiAgICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcIixcIiAgICAgICAgfVwiLFwiICAgIH1cIixcIiAgICBpZiAobHVtIDwgMC4zKSB7XCIsXCIgICAgICAgIGlmIChtb2QoZ2xfRnJhZ0Nvb3JkLnggLSBnbF9GcmFnQ29vcmQueSAtIDUuMCwgMTAuMCkgPT0gMC4wKSB7XCIsXCIgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCk7XCIsXCIgICAgICAgIH1cIixcIiAgICB9XCIsXCJ9XCJdfSxiLkNyb3NzSGF0Y2hGaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuQ3Jvc3NIYXRjaEZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5Dcm9zc0hhdGNoRmlsdGVyLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLkNyb3NzSGF0Y2hGaWx0ZXIucHJvdG90eXBlLFwiYmx1clwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5ibHVyLnZhbHVlLygxLzdlMyl9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLmJsdXIudmFsdWU9MS83ZTMqYX19KSxiLlJHQlNwbGl0RmlsdGVyPWZ1bmN0aW9uKCl7Yi5BYnN0cmFjdEZpbHRlci5jYWxsKHRoaXMpLHRoaXMucGFzc2VzPVt0aGlzXSx0aGlzLnVuaWZvcm1zPXtyZWQ6e3R5cGU6XCIyZlwiLHZhbHVlOnt4OjIwLHk6MjB9fSxncmVlbjp7dHlwZTpcIjJmXCIsdmFsdWU6e3g6LTIwLHk6MjB9fSxibHVlOnt0eXBlOlwiMmZcIix2YWx1ZTp7eDoyMCx5Oi0yMH19LGRpbWVuc2lvbnM6e3R5cGU6XCI0ZnZcIix2YWx1ZTpbMCwwLDAsMF19fSx0aGlzLmZyYWdtZW50U3JjPVtcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1wiLFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXCJ2YXJ5aW5nIHZlYzQgdkNvbG9yO1wiLFwidW5pZm9ybSB2ZWMyIHJlZDtcIixcInVuaWZvcm0gdmVjMiBncmVlbjtcIixcInVuaWZvcm0gdmVjMiBibHVlO1wiLFwidW5pZm9ybSB2ZWM0IGRpbWVuc2lvbnM7XCIsXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcInZvaWQgbWFpbih2b2lkKSB7XCIsXCIgICBnbF9GcmFnQ29sb3IuciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCArIHJlZC9kaW1lbnNpb25zLnh5KS5yO1wiLFwiICAgZ2xfRnJhZ0NvbG9yLmcgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQgKyBncmVlbi9kaW1lbnNpb25zLnh5KS5nO1wiLFwiICAgZ2xfRnJhZ0NvbG9yLmIgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQgKyBibHVlL2RpbWVuc2lvbnMueHkpLmI7XCIsXCIgICBnbF9GcmFnQ29sb3IuYSA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCkuYTtcIixcIn1cIl19LGIuUkdCU3BsaXRGaWx0ZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYi5BYnN0cmFjdEZpbHRlci5wcm90b3R5cGUpLGIuUkdCU3BsaXRGaWx0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuUkdCU3BsaXRGaWx0ZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuUkdCU3BsaXRGaWx0ZXIucHJvdG90eXBlLFwicmVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLnJlZC52YWx1ZX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudW5pZm9ybXMucmVkLnZhbHVlPWF9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuUkdCU3BsaXRGaWx0ZXIucHJvdG90eXBlLFwiZ3JlZW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuZ3JlZW4udmFsdWV9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVuaWZvcm1zLmdyZWVuLnZhbHVlPWF9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIuUkdCU3BsaXRGaWx0ZXIucHJvdG90eXBlLFwiYmx1ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5ibHVlLnZhbHVlfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy51bmlmb3Jtcy5ibHVlLnZhbHVlPWF9fSksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHM/KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYoZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1iKSxleHBvcnRzLlBJWEk9Yik6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoYik6YS5QSVhJPWJ9KS5jYWxsKHRoaXMpOyIsIjsoZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuXG4gIC8vIFN1cHBvcnQgQU1EXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuXG4gIC8vIFN1cHBvcnQgQ29tbW9uSlNcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcmFuZG9tQ29sb3IgPSBmYWN0b3J5KCk7XG4gICAgXG4gICAgLy8gU3VwcG9ydCBOb2RlSlMgJiBDb21wb25lbnQsIHdoaWNoIGFsbG93IG1vZHVsZS5leHBvcnRzIHRvIGJlIGEgZnVuY3Rpb25cbiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByYW5kb21Db2xvcjtcbiAgICB9XG4gICAgXG4gICAgLy8gU3VwcG9ydCBDb21tb25KUyAxLjEuMSBzcGVjXG4gICAgZXhwb3J0cy5yYW5kb21Db2xvciA9IHJhbmRvbUNvbG9yO1xuICBcbiAgLy8gU3VwcG9ydCB2YW5pbGxhIHNjcmlwdCBsb2FkaW5nXG4gIH0gZWxzZSB7XG4gICAgcm9vdC5yYW5kb21Db2xvciA9IGZhY3RvcnkoKTtcbiAgfTtcblxufSh0aGlzLCBmdW5jdGlvbigpIHtcblxuICAvLyBTaGFyZWQgY29sb3IgZGljdGlvbmFyeVxuICB2YXIgY29sb3JEaWN0aW9uYXJ5ID0ge307XG5cbiAgLy8gUG9wdWxhdGUgdGhlIGNvbG9yIGRpY3Rpb25hcnlcbiAgbG9hZENvbG9yQm91bmRzKCk7XG5cbiAgdmFyIHJhbmRvbUNvbG9yID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgdmFyIEgsUyxCO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBjb2xvcnNcbiAgICBpZiAob3B0aW9ucy5jb3VudCkge1xuXG4gICAgICB2YXIgdG90YWxDb2xvcnMgPSBvcHRpb25zLmNvdW50LFxuICAgICAgICAgIGNvbG9ycyA9IFtdO1xuXG4gICAgICBvcHRpb25zLmNvdW50ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICh0b3RhbENvbG9ycyA+IGNvbG9ycy5sZW5ndGgpIHtcbiAgICAgICAgY29sb3JzLnB1c2gocmFuZG9tQ29sb3Iob3B0aW9ucykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sb3JzO1xuICAgIH1cblxuICAgIC8vIEZpcnN0IHdlIHBpY2sgYSBodWUgKEgpXG4gICAgSCA9IHBpY2tIdWUob3B0aW9ucyk7XG5cbiAgICAvLyBUaGVuIHVzZSBIIHRvIGRldGVybWluZSBzYXR1cmF0aW9uIChTKVxuICAgIFMgPSBwaWNrU2F0dXJhdGlvbihILCBvcHRpb25zKTtcblxuICAgIC8vIFRoZW4gdXNlIFMgYW5kIEggdG8gZGV0ZXJtaW5lIGJyaWdodG5lc3MgKEIpLlxuICAgIEIgPSBwaWNrQnJpZ2h0bmVzcyhILCBTLCBvcHRpb25zKTtcblxuICAgIC8vIFRoZW4gd2UgcmV0dXJuIHRoZSBIU0IgY29sb3IgaW4gdGhlIGRlc2lyZWQgZm9ybWF0XG4gICAgcmV0dXJuIHNldEZvcm1hdChbSCxTLEJdLCBvcHRpb25zKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwaWNrSHVlIChvcHRpb25zKSB7XG5cbiAgICB2YXIgaHVlUmFuZ2UgPSBnZXRIdWVSYW5nZShvcHRpb25zLmh1ZSksXG4gICAgICAgIGh1ZSA9IHJhbmRvbVdpdGhpbihodWVSYW5nZSk7XG5cbiAgICAvLyBJbnN0ZWFkIG9mIHN0b3JpbmcgcmVkIGFzIHR3byBzZXBlcmF0ZSByYW5nZXMsXG4gICAgLy8gd2UgZ3JvdXAgdGhlbSwgdXNpbmcgbmVnYXRpdmUgbnVtYmVyc1xuICAgIGlmIChodWUgPCAwKSB7aHVlID0gMzYwICsgaHVlfVxuXG4gICAgcmV0dXJuIGh1ZTtcblxuICB9XG5cbiAgZnVuY3Rpb24gcGlja1NhdHVyYXRpb24gKGh1ZSwgb3B0aW9ucykge1xuXG4gICAgaWYgKG9wdGlvbnMubHVtaW5vc2l0eSA9PT0gJ3JhbmRvbScpIHtcbiAgICAgIHJldHVybiByYW5kb21XaXRoaW4oWzAsMTAwXSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaHVlID09PSAnbW9ub2Nocm9tZScpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBzYXR1cmF0aW9uUmFuZ2UgPSBnZXRTYXR1cmF0aW9uUmFuZ2UoaHVlKTtcblxuICAgIHZhciBzTWluID0gc2F0dXJhdGlvblJhbmdlWzBdLFxuICAgICAgICBzTWF4ID0gc2F0dXJhdGlvblJhbmdlWzFdO1xuXG4gICAgc3dpdGNoIChvcHRpb25zLmx1bWlub3NpdHkpIHtcblxuICAgICAgY2FzZSAnYnJpZ2h0JzpcbiAgICAgICAgc01pbiA9IDU1O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZGFyayc6XG4gICAgICAgIHNNaW4gPSBzTWF4IC0gMTA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsaWdodCc6XG4gICAgICAgIHNNYXggPSA1NTtcbiAgICAgICAgYnJlYWs7XG4gICB9XG5cbiAgICByZXR1cm4gcmFuZG9tV2l0aGluKFtzTWluLCBzTWF4XSk7XG5cbiAgfVxuXG4gIGZ1bmN0aW9uIHBpY2tCcmlnaHRuZXNzIChILCBTLCBvcHRpb25zKSB7XG5cbiAgICB2YXIgYnJpZ2h0bmVzcyxcbiAgICAgICAgYk1pbiA9IGdldE1pbmltdW1CcmlnaHRuZXNzKEgsIFMpLFxuICAgICAgICBiTWF4ID0gMTAwO1xuXG4gICAgc3dpdGNoIChvcHRpb25zLmx1bWlub3NpdHkpIHtcblxuICAgICAgY2FzZSAnZGFyayc6XG4gICAgICAgIGJNYXggPSBiTWluICsgMjA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsaWdodCc6XG4gICAgICAgIGJNaW4gPSAoYk1heCArIGJNaW4pLzI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyYW5kb20nOlxuICAgICAgICBiTWluID0gMDtcbiAgICAgICAgYk1heCA9IDEwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmRvbVdpdGhpbihbYk1pbiwgYk1heF0pO1xuXG4gIH1cblxuICBmdW5jdGlvbiBzZXRGb3JtYXQgKGhzdiwgb3B0aW9ucykge1xuXG4gICAgc3dpdGNoIChvcHRpb25zLmZvcm1hdCkge1xuXG4gICAgICBjYXNlICdoc3ZBcnJheSc6XG4gICAgICAgIHJldHVybiBoc3Y7XG5cbiAgICAgIGNhc2UgJ2hzdic6XG4gICAgICAgIHJldHVybiBjb2xvclN0cmluZygnaHN2JywgaHN2KTtcblxuICAgICAgY2FzZSAncmdiQXJyYXknOlxuICAgICAgICByZXR1cm4gSFNWdG9SR0IoaHN2KTtcblxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgcmV0dXJuIGNvbG9yU3RyaW5nKCdyZ2InLCBIU1Z0b1JHQihoc3YpKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEhTVnRvSGV4KGhzdik7XG4gICAgfVxuXG4gIH1cblxuICBmdW5jdGlvbiBnZXRNaW5pbXVtQnJpZ2h0bmVzcyhILCBTKSB7XG5cbiAgICB2YXIgbG93ZXJCb3VuZHMgPSBnZXRDb2xvckluZm8oSCkubG93ZXJCb3VuZHM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvd2VyQm91bmRzLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICB2YXIgczEgPSBsb3dlckJvdW5kc1tpXVswXSxcbiAgICAgICAgICB2MSA9IGxvd2VyQm91bmRzW2ldWzFdO1xuXG4gICAgICB2YXIgczIgPSBsb3dlckJvdW5kc1tpKzFdWzBdLFxuICAgICAgICAgIHYyID0gbG93ZXJCb3VuZHNbaSsxXVsxXTtcblxuICAgICAgaWYgKFMgPj0gczEgJiYgUyA8PSBzMikge1xuXG4gICAgICAgICB2YXIgbSA9ICh2MiAtIHYxKS8oczIgLSBzMSksXG4gICAgICAgICAgICAgYiA9IHYxIC0gbSpzMTtcblxuICAgICAgICAgcmV0dXJuIG0qUyArIGI7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEh1ZVJhbmdlIChjb2xvcklucHV0KSB7XG5cbiAgICBpZiAodHlwZW9mIHBhcnNlSW50KGNvbG9ySW5wdXQpID09PSAnbnVtYmVyJykge1xuXG4gICAgICB2YXIgbnVtYmVyID0gcGFyc2VJbnQoY29sb3JJbnB1dCk7XG5cbiAgICAgIGlmIChudW1iZXIgPCAzNjAgJiYgbnVtYmVyID4gMCkge1xuICAgICAgICByZXR1cm4gW251bWJlciwgbnVtYmVyXTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sb3JJbnB1dCA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgaWYgKGNvbG9yRGljdGlvbmFyeVtjb2xvcklucHV0XSkge1xuICAgICAgICB2YXIgY29sb3IgPSBjb2xvckRpY3Rpb25hcnlbY29sb3JJbnB1dF07XG4gICAgICAgIGlmIChjb2xvci5odWVSYW5nZSkge3JldHVybiBjb2xvci5odWVSYW5nZX1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gWzAsMzYwXTtcblxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2F0dXJhdGlvblJhbmdlIChodWUpIHtcbiAgICByZXR1cm4gZ2V0Q29sb3JJbmZvKGh1ZSkuc2F0dXJhdGlvblJhbmdlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q29sb3JJbmZvIChodWUpIHtcblxuICAgIC8vIE1hcHMgcmVkIGNvbG9ycyB0byBtYWtlIHBpY2tpbmcgaHVlIGVhc2llclxuICAgIGlmIChodWUgPj0gMzM0ICYmIGh1ZSA8PSAzNjApIHtcbiAgICAgIGh1ZS09IDM2MDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBjb2xvck5hbWUgaW4gY29sb3JEaWN0aW9uYXJ5KSB7XG4gICAgICAgdmFyIGNvbG9yID0gY29sb3JEaWN0aW9uYXJ5W2NvbG9yTmFtZV07XG4gICAgICAgaWYgKGNvbG9yLmh1ZVJhbmdlICYmXG4gICAgICAgICAgIGh1ZSA+PSBjb2xvci5odWVSYW5nZVswXSAmJlxuICAgICAgICAgICBodWUgPD0gY29sb3IuaHVlUmFuZ2VbMV0pIHtcbiAgICAgICAgICByZXR1cm4gY29sb3JEaWN0aW9uYXJ5W2NvbG9yTmFtZV07XG4gICAgICAgfVxuICAgIH0gcmV0dXJuICdDb2xvciBub3QgZm91bmQnO1xuICB9XG5cbiAgZnVuY3Rpb24gcmFuZG9tV2l0aGluIChyYW5nZSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHJhbmdlWzBdICsgTWF0aC5yYW5kb20oKSoocmFuZ2VbMV0gKyAxIC0gcmFuZ2VbMF0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNoaWZ0SHVlIChoLCBkZWdyZWVzKSB7XG4gICAgcmV0dXJuIChoICsgZGVncmVlcyklMzYwO1xuICB9XG5cbiAgZnVuY3Rpb24gSFNWdG9IZXggKGhzdil7XG5cbiAgICB2YXIgcmdiID0gSFNWdG9SR0IoaHN2KTtcblxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudFRvSGV4KGMpIHtcbiAgICAgICAgdmFyIGhleCA9IGMudG9TdHJpbmcoMTYpO1xuICAgICAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PSAxID8gXCIwXCIgKyBoZXggOiBoZXg7XG4gICAgfVxuXG4gICAgdmFyIGhleCA9IFwiI1wiICsgY29tcG9uZW50VG9IZXgocmdiWzBdKSArIGNvbXBvbmVudFRvSGV4KHJnYlsxXSkgKyBjb21wb25lbnRUb0hleChyZ2JbMl0pO1xuXG4gICAgcmV0dXJuIGhleDtcblxuICB9XG5cbiAgZnVuY3Rpb24gZGVmaW5lQ29sb3IgKG5hbWUsIGh1ZVJhbmdlLCBsb3dlckJvdW5kcykge1xuXG4gICAgdmFyIHNNaW4gPSBsb3dlckJvdW5kc1swXVswXSxcbiAgICAgICAgc01heCA9IGxvd2VyQm91bmRzW2xvd2VyQm91bmRzLmxlbmd0aCAtIDFdWzBdLFxuXG4gICAgICAgIGJNaW4gPSBsb3dlckJvdW5kc1tsb3dlckJvdW5kcy5sZW5ndGggLSAxXVsxXSxcbiAgICAgICAgYk1heCA9IGxvd2VyQm91bmRzWzBdWzFdO1xuXG4gICAgY29sb3JEaWN0aW9uYXJ5W25hbWVdID0ge1xuICAgICAgaHVlUmFuZ2U6IGh1ZVJhbmdlLFxuICAgICAgbG93ZXJCb3VuZHM6IGxvd2VyQm91bmRzLFxuICAgICAgc2F0dXJhdGlvblJhbmdlOiBbc01pbiwgc01heF0sXG4gICAgICBicmlnaHRuZXNzUmFuZ2U6IFtiTWluLCBiTWF4XVxuICAgIH07XG5cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWRDb2xvckJvdW5kcyAoKSB7XG5cbiAgICBkZWZpbmVDb2xvcihcbiAgICAgICdtb25vY2hyb21lJyxcbiAgICAgIG51bGwsXG4gICAgICBbWzAsMF0sWzEwMCwwXV1cbiAgICApO1xuXG4gICAgZGVmaW5lQ29sb3IoXG4gICAgICAncmVkJyxcbiAgICAgIFstMjYsMThdLFxuICAgICAgW1syMCwxMDBdLFszMCw5Ml0sWzQwLDg5XSxbNTAsODVdLFs2MCw3OF0sWzcwLDcwXSxbODAsNjBdLFs5MCw1NV0sWzEwMCw1MF1dXG4gICAgKTtcblxuICAgIGRlZmluZUNvbG9yKFxuICAgICAgJ29yYW5nZScsXG4gICAgICBbMTksNDZdLFxuICAgICAgW1syMCwxMDBdLFszMCw5M10sWzQwLDg4XSxbNTAsODZdLFs2MCw4NV0sWzcwLDcwXSxbMTAwLDcwXV1cbiAgICApO1xuXG4gICAgZGVmaW5lQ29sb3IoXG4gICAgICAneWVsbG93JyxcbiAgICAgIFs0Nyw2Ml0sXG4gICAgICBbWzI1LDEwMF0sWzQwLDk0XSxbNTAsODldLFs2MCw4Nl0sWzcwLDg0XSxbODAsODJdLFs5MCw4MF0sWzEwMCw3NV1dXG4gICAgKTtcblxuICAgIGRlZmluZUNvbG9yKFxuICAgICAgJ2dyZWVuJyxcbiAgICAgIFs2MywxNThdLFxuICAgICAgW1szMCwxMDBdLFs0MCw5MF0sWzUwLDg1XSxbNjAsODFdLFs3MCw3NF0sWzgwLDY0XSxbOTAsNTBdLFsxMDAsNDBdXVxuICAgICk7XG5cbiAgICBkZWZpbmVDb2xvcihcbiAgICAgICdibHVlJyxcbiAgICAgIFsxNTksIDI1N10sXG4gICAgICBbWzIwLDEwMF0sWzMwLDg2XSxbNDAsODBdLFs1MCw3NF0sWzYwLDYwXSxbNzAsNTJdLFs4MCw0NF0sWzkwLDM5XSxbMTAwLDM1XV1cbiAgICApO1xuXG4gICAgZGVmaW5lQ29sb3IoXG4gICAgICAncHVycGxlJyxcbiAgICAgIFsyNTgsIDI4Ml0sXG4gICAgICBbWzIwLDEwMF0sWzMwLDg3XSxbNDAsNzldLFs1MCw3MF0sWzYwLDY1XSxbNzAsNTldLFs4MCw1Ml0sWzkwLDQ1XSxbMTAwLDQyXV1cbiAgICApO1xuXG4gICAgZGVmaW5lQ29sb3IoXG4gICAgICAncGluaycsXG4gICAgICBbMjgzLCAzMzRdLFxuICAgICAgW1syMCwxMDBdLFszMCw5MF0sWzQwLDg2XSxbNjAsODRdLFs4MCw4MF0sWzkwLDc1XSxbMTAwLDczXV1cbiAgICApO1xuXG4gIH1cblxuICBmdW5jdGlvbiBIU1Z0b1JHQiAoaHN2KSB7XG5cbiAgICAvLyB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgdGhlIHZhbHVlcyBvZiAwIGFuZCAzNjBcbiAgICAvLyBoZXJlJ3MgdGhlIGhhY2t5IGZpeFxuICAgIHZhciBoID0gaHN2WzBdO1xuICAgIGlmIChoID09PSAwKSB7aCA9IDF9XG4gICAgaWYgKGggPT09IDM2MCkge2ggPSAzNTl9XG5cbiAgICAvLyBSZWJhc2UgdGhlIGgscyx2IHZhbHVlc1xuICAgIGggPSBoLzM2MDtcbiAgICB2YXIgcyA9IGhzdlsxXS8xMDAsXG4gICAgICAgIHYgPSBoc3ZbMl0vMTAwO1xuXG4gICAgdmFyIGhfaSA9IE1hdGguZmxvb3IoaCo2KSxcbiAgICAgIGYgPSBoICogNiAtIGhfaSxcbiAgICAgIHAgPSB2ICogKDEgLSBzKSxcbiAgICAgIHEgPSB2ICogKDEgLSBmKnMpLFxuICAgICAgdCA9IHYgKiAoMSAtICgxIC0gZikqcyksXG4gICAgICByID0gMjU2LFxuICAgICAgZyA9IDI1NixcbiAgICAgIGIgPSAyNTY7XG5cbiAgICBzd2l0Y2goaF9pKSB7XG4gICAgICBjYXNlIDA6IHIgPSB2LCBnID0gdCwgYiA9IHA7ICBicmVhaztcbiAgICAgIGNhc2UgMTogciA9IHEsIGcgPSB2LCBiID0gcDsgIGJyZWFrO1xuICAgICAgY2FzZSAyOiByID0gcCwgZyA9IHYsIGIgPSB0OyAgYnJlYWs7XG4gICAgICBjYXNlIDM6IHIgPSBwLCBnID0gcSwgYiA9IHY7ICBicmVhaztcbiAgICAgIGNhc2UgNDogciA9IHQsIGcgPSBwLCBiID0gdjsgIGJyZWFrO1xuICAgICAgY2FzZSA1OiByID0gdiwgZyA9IHAsIGIgPSBxOyAgYnJlYWs7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBbTWF0aC5mbG9vcihyKjI1NSksIE1hdGguZmxvb3IoZyoyNTUpLCBNYXRoLmZsb29yKGIqMjU1KV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbG9yU3RyaW5nIChwcmVmaXgsIHZhbHVlcykge1xuICAgIHJldHVybiBwcmVmaXggKyAnKCcgKyB2YWx1ZXMuam9pbignLCAnKSArICcpJztcbiAgfVxuXG4gIHJldHVybiByYW5kb21Db2xvcjtcbn0pKTsiXX0=