Created
November 8, 2016 16:59
-
-
Save jtenner/31974fc68b7dcad839a07e6f5c53de05 to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| let React = require('react'); | |
| let ReactDOM = require('react-dom'); | |
| let DOM = React.DOM; | |
| let outsideText = "testing the text put inside the span"; | |
| let App = class App extends React.Component { | |
| constructor() { | |
| super(); | |
| this.state = { | |
| index: 0 | |
| }; | |
| setInterval(() => { | |
| this.state.index += 1; | |
| if (outsideText.length >= this.state.index) { | |
| this.state.index = outsideText.length - 1; | |
| } | |
| this.refs.text.getDOMNode().innerHTML = outsideText.slice(0, this.state.index); | |
| }, 100); | |
| } | |
| render() { | |
| return DOM.div({}, | |
| DOM.span({ ref: 'text' }, "test") | |
| ); | |
| } | |
| } | |
| ReactDOM.render( | |
| React.createElement(App, {}), | |
| document.body | |
| ); |
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| setTimeout(function(){ | |
| ;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})({1:[function(require,module,exports){ | |
| // shim for using process in browser | |
| var process = module.exports = {}; | |
| process.nextTick = (function () { | |
| var canSetImmediate = typeof window !== 'undefined' | |
| && window.setImmediate; | |
| var canMutationObserver = typeof window !== 'undefined' | |
| && window.MutationObserver; | |
| var canPost = typeof window !== 'undefined' | |
| && window.postMessage && window.addEventListener | |
| ; | |
| if (canSetImmediate) { | |
| return function (f) { return window.setImmediate(f) }; | |
| } | |
| var queue = []; | |
| if (canMutationObserver) { | |
| var hiddenDiv = document.createElement("div"); | |
| var observer = new MutationObserver(function () { | |
| var queueList = queue.slice(); | |
| queue.length = 0; | |
| queueList.forEach(function (fn) { | |
| fn(); | |
| }); | |
| }); | |
| observer.observe(hiddenDiv, { attributes: true }); | |
| return function nextTick(fn) { | |
| if (!queue.length) { | |
| hiddenDiv.setAttribute('yes', 'no'); | |
| } | |
| queue.push(fn); | |
| }; | |
| } | |
| if (canPost) { | |
| window.addEventListener('message', function (ev) { | |
| var source = ev.source; | |
| if ((source === window || source === null) && ev.data === 'process-tick') { | |
| ev.stopPropagation(); | |
| if (queue.length > 0) { | |
| var fn = queue.shift(); | |
| fn(); | |
| } | |
| } | |
| }, true); | |
| return function nextTick(fn) { | |
| queue.push(fn); | |
| window.postMessage('process-tick', '*'); | |
| }; | |
| } | |
| return function nextTick(fn) { | |
| setTimeout(fn, 0); | |
| }; | |
| })(); | |
| process.title = 'browser'; | |
| process.browser = true; | |
| process.env = {}; | |
| process.argv = []; | |
| function noop() {} | |
| process.on = noop; | |
| process.addListener = noop; | |
| process.once = noop; | |
| process.off = noop; | |
| process.removeListener = noop; | |
| process.removeAllListeners = noop; | |
| process.emit = noop; | |
| process.binding = function (name) { | |
| throw new Error('process.binding is not supported'); | |
| }; | |
| // TODO(shtylman) | |
| process.cwd = function () { return '/' }; | |
| process.chdir = function (dir) { | |
| throw new Error('process.chdir is not supported'); | |
| }; | |
| },{}],2:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule KeyEscapeUtils | |
| * | |
| */ | |
| 'use strict'; | |
| /** | |
| * Escape and wrap key so it is safe to use as a reactid | |
| * | |
| * @param {string} key to be escaped. | |
| * @return {string} the escaped key. | |
| */ | |
| function escape(key) { | |
| var escapeRegex = /[=:]/g; | |
| var escaperLookup = { | |
| '=': '=0', | |
| ':': '=2' | |
| }; | |
| var escapedString = ('' + key).replace(escapeRegex, function (match) { | |
| return escaperLookup[match]; | |
| }); | |
| return '$' + escapedString; | |
| } | |
| /** | |
| * Unescape and unwrap key for human-readable display | |
| * | |
| * @param {string} key to unescape. | |
| * @return {string} the unescaped key. | |
| */ | |
| function unescape(key) { | |
| var unescapeRegex = /(=0|=2)/g; | |
| var unescaperLookup = { | |
| '=0': '=', | |
| '=2': ':' | |
| }; | |
| var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1); | |
| return ('' + keySubstring).replace(unescapeRegex, function (match) { | |
| return unescaperLookup[match]; | |
| }); | |
| } | |
| var KeyEscapeUtils = { | |
| escape: escape, | |
| unescape: unescape | |
| }; | |
| module.exports = KeyEscapeUtils; | |
| },{}],3:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule PooledClass | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| /** | |
| * Static poolers. Several custom versions for each potential number of | |
| * arguments. A completely generic pooler is easy to implement, but would | |
| * require accessing the `arguments` object. In each of these, `this` refers to | |
| * the Class itself, not an instance. If any others are needed, simply add them | |
| * here, or in their own files. | |
| */ | |
| var oneArgumentPooler = function (copyFieldsFrom) { | |
| var Klass = this; | |
| if (Klass.instancePool.length) { | |
| var instance = Klass.instancePool.pop(); | |
| Klass.call(instance, copyFieldsFrom); | |
| return instance; | |
| } else { | |
| return new Klass(copyFieldsFrom); | |
| } | |
| }; | |
| var twoArgumentPooler = function (a1, a2) { | |
| var Klass = this; | |
| if (Klass.instancePool.length) { | |
| var instance = Klass.instancePool.pop(); | |
| Klass.call(instance, a1, a2); | |
| return instance; | |
| } else { | |
| return new Klass(a1, a2); | |
| } | |
| }; | |
| var threeArgumentPooler = function (a1, a2, a3) { | |
| var Klass = this; | |
| if (Klass.instancePool.length) { | |
| var instance = Klass.instancePool.pop(); | |
| Klass.call(instance, a1, a2, a3); | |
| return instance; | |
| } else { | |
| return new Klass(a1, a2, a3); | |
| } | |
| }; | |
| var fourArgumentPooler = function (a1, a2, a3, a4) { | |
| var Klass = this; | |
| if (Klass.instancePool.length) { | |
| var instance = Klass.instancePool.pop(); | |
| Klass.call(instance, a1, a2, a3, a4); | |
| return instance; | |
| } else { | |
| return new Klass(a1, a2, a3, a4); | |
| } | |
| }; | |
| var fiveArgumentPooler = function (a1, a2, a3, a4, a5) { | |
| var Klass = this; | |
| if (Klass.instancePool.length) { | |
| var instance = Klass.instancePool.pop(); | |
| Klass.call(instance, a1, a2, a3, a4, a5); | |
| return instance; | |
| } else { | |
| return new Klass(a1, a2, a3, a4, a5); | |
| } | |
| }; | |
| var standardReleaser = function (instance) { | |
| var Klass = this; | |
| !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0; | |
| instance.destructor(); | |
| if (Klass.instancePool.length < Klass.poolSize) { | |
| Klass.instancePool.push(instance); | |
| } | |
| }; | |
| var DEFAULT_POOL_SIZE = 10; | |
| var DEFAULT_POOLER = oneArgumentPooler; | |
| /** | |
| * Augments `CopyConstructor` to be a poolable class, augmenting only the class | |
| * itself (statically) not adding any prototypical fields. Any CopyConstructor | |
| * you give this may have a `poolSize` property, and will look for a | |
| * prototypical `destructor` on instances. | |
| * | |
| * @param {Function} CopyConstructor Constructor that can be used to reset. | |
| * @param {Function} pooler Customizable pooler. | |
| */ | |
| var addPoolingTo = function (CopyConstructor, pooler) { | |
| var NewKlass = CopyConstructor; | |
| NewKlass.instancePool = []; | |
| NewKlass.getPooled = pooler || DEFAULT_POOLER; | |
| if (!NewKlass.poolSize) { | |
| NewKlass.poolSize = DEFAULT_POOL_SIZE; | |
| } | |
| NewKlass.release = standardReleaser; | |
| return NewKlass; | |
| }; | |
| var PooledClass = { | |
| addPoolingTo: addPoolingTo, | |
| oneArgumentPooler: oneArgumentPooler, | |
| twoArgumentPooler: twoArgumentPooler, | |
| threeArgumentPooler: threeArgumentPooler, | |
| fourArgumentPooler: fourArgumentPooler, | |
| fiveArgumentPooler: fiveArgumentPooler | |
| }; | |
| module.exports = PooledClass; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9Qb29sZWRDbGFzcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBQb29sZWRDbGFzc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFN0YXRpYyBwb29sZXJzLiBTZXZlcmFsIGN1c3RvbSB2ZXJzaW9ucyBmb3IgZWFjaCBwb3RlbnRpYWwgbnVtYmVyIG9mXG4gKiBhcmd1bWVudHMuIEEgY29tcGxldGVseSBnZW5lcmljIHBvb2xlciBpcyBlYXN5IHRvIGltcGxlbWVudCwgYnV0IHdvdWxkXG4gKiByZXF1aXJlIGFjY2Vzc2luZyB0aGUgYGFyZ3VtZW50c2Agb2JqZWN0LiBJbiBlYWNoIG9mIHRoZXNlLCBgdGhpc2AgcmVmZXJzIHRvXG4gKiB0aGUgQ2xhc3MgaXRzZWxmLCBub3QgYW4gaW5zdGFuY2UuIElmIGFueSBvdGhlcnMgYXJlIG5lZWRlZCwgc2ltcGx5IGFkZCB0aGVtXG4gKiBoZXJlLCBvciBpbiB0aGVpciBvd24gZmlsZXMuXG4gKi9cbnZhciBvbmVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChjb3B5RmllbGRzRnJvbSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBjb3B5RmllbGRzRnJvbSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoY29weUZpZWxkc0Zyb20pO1xuICB9XG59O1xuXG52YXIgdHdvQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMik7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyKTtcbiAgfVxufTtcblxudmFyIHRocmVlQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMykge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzKTtcbiAgfVxufTtcblxudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzLCBhNCkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzLCBhNCk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMywgYTQpO1xuICB9XG59O1xuXG52YXIgZml2ZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzLCBhNCwgYTUpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMsIGE0LCBhNSk7XG4gIH1cbn07XG5cbnZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gICEoaW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFzcykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJ5aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZmZXJlbnQgdHlwZS4nKSA6IF9wcm9kSW52YXJpYW50KCcyNScpIDogdm9pZCAwO1xuICBpbnN0YW5jZS5kZXN0cnVjdG9yKCk7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoIDwgS2xhc3MucG9vbFNpemUpIHtcbiAgICBLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSk7XG4gIH1cbn07XG5cbnZhciBERUZBVUxUX1BPT0xfU0laRSA9IDEwO1xudmFyIERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1lbnRQb29sZXI7XG5cbi8qKlxuICogQXVnbWVudHMgYENvcHlDb25zdHJ1Y3RvcmAgdG8gYmUgYSBwb29sYWJsZSBjbGFzcywgYXVnbWVudGluZyBvbmx5IHRoZSBjbGFzc1xuICogaXRzZWxmIChzdGF0aWNhbGx5KSBub3QgYWRkaW5nIGFueSBwcm90b3R5cGljYWwgZmllbGRzLiBBbnkgQ29weUNvbnN0cnVjdG9yXG4gKiB5b3UgZ2l2ZSB0aGlzIG1heSBoYXZlIGEgYHBvb2xTaXplYCBwcm9wZXJ0eSwgYW5kIHdpbGwgbG9vayBmb3IgYVxuICogcHJvdG90eXBpY2FsIGBkZXN0cnVjdG9yYCBvbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gQ29weUNvbnN0cnVjdG9yIENvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb29sZXIgQ3VzdG9taXphYmxlIHBvb2xlci5cbiAqL1xudmFyIGFkZFBvb2xpbmdUbyA9IGZ1bmN0aW9uIChDb3B5Q29uc3RydWN0b3IsIHBvb2xlcikge1xuICB2YXIgTmV3S2xhc3MgPSBDb3B5Q29uc3RydWN0b3I7XG4gIE5ld0tsYXNzLmluc3RhbmNlUG9vbCA9IFtdO1xuICBOZXdLbGFzcy5nZXRQb29sZWQgPSBwb29sZXIgfHwgREVGQVVMVF9QT09MRVI7XG4gIGlmICghTmV3S2xhc3MucG9vbFNpemUpIHtcbiAgICBOZXdLbGFzcy5wb29sU2l6ZSA9IERFRkFVTFRfUE9PTF9TSVpFO1xuICB9XG4gIE5ld0tsYXNzLnJlbGVhc2UgPSBzdGFuZGFyZFJlbGVhc2VyO1xuICByZXR1cm4gTmV3S2xhc3M7XG59O1xuXG52YXIgUG9vbGVkQ2xhc3MgPSB7XG4gIGFkZFBvb2xpbmdUbzogYWRkUG9vbGluZ1RvLFxuICBvbmVBcmd1bWVudFBvb2xlcjogb25lQXJndW1lbnRQb29sZXIsXG4gIHR3b0FyZ3VtZW50UG9vbGVyOiB0d29Bcmd1bWVudFBvb2xlcixcbiAgdGhyZWVBcmd1bWVudFBvb2xlcjogdGhyZWVBcmd1bWVudFBvb2xlcixcbiAgZm91ckFyZ3VtZW50UG9vbGVyOiBmb3VyQXJndW1lbnRQb29sZXIsXG4gIGZpdmVBcmd1bWVudFBvb2xlcjogZml2ZUFyZ3VtZW50UG9vbGVyXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzOyJdfQ== | |
| },{"./reactProdInvariant":24,"_process":1,"fbjs/lib/invariant":28}],4:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule React | |
| */ | |
| 'use strict'; | |
| var _assign = require('object-assign'); | |
| var ReactChildren = require('./ReactChildren'); | |
| var ReactComponent = require('./ReactComponent'); | |
| var ReactPureComponent = require('./ReactPureComponent'); | |
| var ReactClass = require('./ReactClass'); | |
| var ReactDOMFactories = require('./ReactDOMFactories'); | |
| var ReactElement = require('./ReactElement'); | |
| var ReactPropTypes = require('./ReactPropTypes'); | |
| var ReactVersion = require('./ReactVersion'); | |
| var onlyChild = require('./onlyChild'); | |
| var warning = require('fbjs/lib/warning'); | |
| var createElement = ReactElement.createElement; | |
| var createFactory = ReactElement.createFactory; | |
| var cloneElement = ReactElement.cloneElement; | |
| if (process.env.NODE_ENV !== 'production') { | |
| var ReactElementValidator = require('./ReactElementValidator'); | |
| createElement = ReactElementValidator.createElement; | |
| createFactory = ReactElementValidator.createFactory; | |
| cloneElement = ReactElementValidator.cloneElement; | |
| } | |
| var __spread = _assign; | |
| if (process.env.NODE_ENV !== 'production') { | |
| var warned = false; | |
| __spread = function () { | |
| process.env.NODE_ENV !== 'production' ? warning(warned, 'React.__spread is deprecated and should not be used. Use ' + 'Object.assign directly or another helper function with similar ' + 'semantics. You may be seeing this warning due to your compiler. ' + 'See https://fb.me/react-spread-deprecation for more details.') : void 0; | |
| warned = true; | |
| return _assign.apply(null, arguments); | |
| }; | |
| } | |
| var React = { | |
| // Modern | |
| Children: { | |
| map: ReactChildren.map, | |
| forEach: ReactChildren.forEach, | |
| count: ReactChildren.count, | |
| toArray: ReactChildren.toArray, | |
| only: onlyChild | |
| }, | |
| Component: ReactComponent, | |
| PureComponent: ReactPureComponent, | |
| createElement: createElement, | |
| cloneElement: cloneElement, | |
| isValidElement: ReactElement.isValidElement, | |
| // Classic | |
| PropTypes: ReactPropTypes, | |
| createClass: ReactClass.createClass, | |
| createFactory: createFactory, | |
| createMixin: function (mixin) { | |
| // Currently a noop. Will be used to validate and trace mixins. | |
| return mixin; | |
| }, | |
| // This looks DOM specific but these are actually isomorphic helpers | |
| // since they are just generating DOM strings. | |
| DOM: ReactDOMFactories, | |
| version: ReactVersion, | |
| // Deprecated hook for JSX spread, don't use this for anything. | |
| __spread: __spread | |
| }; | |
| module.exports = React; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q2hpbGRyZW4gPSByZXF1aXJlKCcuL1JlYWN0Q2hpbGRyZW4nKTtcbnZhciBSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnQnKTtcbnZhciBSZWFjdFB1cmVDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0UHVyZUNvbXBvbmVudCcpO1xudmFyIFJlYWN0Q2xhc3MgPSByZXF1aXJlKCcuL1JlYWN0Q2xhc3MnKTtcbnZhciBSZWFjdERPTUZhY3RvcmllcyA9IHJlcXVpcmUoJy4vUmVhY3RET01GYWN0b3JpZXMnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlcycpO1xudmFyIFJlYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vUmVhY3RWZXJzaW9uJyk7XG5cbnZhciBvbmx5Q2hpbGQgPSByZXF1aXJlKCcuL29ubHlDaGlsZCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBjcmVhdGVFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQ7XG52YXIgY3JlYXRlRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5O1xudmFyIGNsb25lRWxlbWVudCA9IFJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQ7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFZhbGlkYXRvcicpO1xuICBjcmVhdGVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUVsZW1lbnQ7XG4gIGNyZWF0ZUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbiAgY2xvbmVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNsb25lRWxlbWVudDtcbn1cblxudmFyIF9fc3ByZWFkID0gX2Fzc2lnbjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBfX3NwcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh3YXJuZWQsICdSZWFjdC5fX3NwcmVhZCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIFVzZSAnICsgJ09iamVjdC5hc3NpZ24gZGlyZWN0bHkgb3IgYW5vdGhlciBoZWxwZXIgZnVuY3Rpb24gd2l0aCBzaW1pbGFyICcgKyAnc2VtYW50aWNzLiBZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIHlvdXIgY29tcGlsZXIuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtc3ByZWFkLWRlcHJlY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuJykgOiB2b2lkIDA7XG4gICAgd2FybmVkID0gdHJ1ZTtcbiAgICByZXR1cm4gX2Fzc2lnbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG52YXIgUmVhY3QgPSB7XG5cbiAgLy8gTW9kZXJuXG5cbiAgQ2hpbGRyZW46IHtcbiAgICBtYXA6IFJlYWN0Q2hpbGRyZW4ubWFwLFxuICAgIGZvckVhY2g6IFJlYWN0Q2hpbGRyZW4uZm9yRWFjaCxcbiAgICBjb3VudDogUmVhY3RDaGlsZHJlbi5jb3VudCxcbiAgICB0b0FycmF5OiBSZWFjdENoaWxkcmVuLnRvQXJyYXksXG4gICAgb25seTogb25seUNoaWxkXG4gIH0sXG5cbiAgQ29tcG9uZW50OiBSZWFjdENvbXBvbmVudCxcbiAgUHVyZUNvbXBvbmVudDogUmVhY3RQdXJlQ29tcG9uZW50LFxuXG4gIGNyZWF0ZUVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnQsXG4gIGNsb25lRWxlbWVudDogY2xvbmVFbGVtZW50LFxuICBpc1ZhbGlkRWxlbWVudDogUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50LFxuXG4gIC8vIENsYXNzaWNcblxuICBQcm9wVHlwZXM6IFJlYWN0UHJvcFR5cGVzLFxuICBjcmVhdGVDbGFzczogUmVhY3RDbGFzcy5jcmVhdGVDbGFzcyxcbiAgY3JlYXRlRmFjdG9yeTogY3JlYXRlRmFjdG9yeSxcbiAgY3JlYXRlTWl4aW46IGZ1bmN0aW9uIChtaXhpbikge1xuICAgIC8vIEN1cnJlbnRseSBhIG5vb3AuIFdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSBhbmQgdHJhY2UgbWl4aW5zLlxuICAgIHJldHVybiBtaXhpbjtcbiAgfSxcblxuICAvLyBUaGlzIGxvb2tzIERPTSBzcGVjaWZpYyBidXQgdGhlc2UgYXJlIGFjdHVhbGx5IGlzb21vcnBoaWMgaGVscGVyc1xuICAvLyBzaW5jZSB0aGV5IGFyZSBqdXN0IGdlbmVyYXRpbmcgRE9NIHN0cmluZ3MuXG4gIERPTTogUmVhY3RET01GYWN0b3JpZXMsXG5cbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuXG4gIC8vIERlcHJlY2F0ZWQgaG9vayBmb3IgSlNYIHNwcmVhZCwgZG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nLlxuICBfX3NwcmVhZDogX19zcHJlYWRcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3Q7Il19 | |
| },{"./ReactChildren":5,"./ReactClass":6,"./ReactComponent":7,"./ReactDOMFactories":10,"./ReactElement":11,"./ReactElementValidator":12,"./ReactPropTypes":16,"./ReactPureComponent":18,"./ReactVersion":19,"./onlyChild":23,"_process":1,"fbjs/lib/warning":31,"object-assign":32}],5:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactChildren | |
| */ | |
| 'use strict'; | |
| var PooledClass = require('./PooledClass'); | |
| var ReactElement = require('./ReactElement'); | |
| var emptyFunction = require('fbjs/lib/emptyFunction'); | |
| var traverseAllChildren = require('./traverseAllChildren'); | |
| var twoArgumentPooler = PooledClass.twoArgumentPooler; | |
| var fourArgumentPooler = PooledClass.fourArgumentPooler; | |
| var userProvidedKeyEscapeRegex = /\/+/g; | |
| function escapeUserProvidedKey(text) { | |
| return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/'); | |
| } | |
| /** | |
| * PooledClass representing the bookkeeping associated with performing a child | |
| * traversal. Allows avoiding binding callbacks. | |
| * | |
| * @constructor ForEachBookKeeping | |
| * @param {!function} forEachFunction Function to perform traversal with. | |
| * @param {?*} forEachContext Context to perform context with. | |
| */ | |
| function ForEachBookKeeping(forEachFunction, forEachContext) { | |
| this.func = forEachFunction; | |
| this.context = forEachContext; | |
| this.count = 0; | |
| } | |
| ForEachBookKeeping.prototype.destructor = function () { | |
| this.func = null; | |
| this.context = null; | |
| this.count = 0; | |
| }; | |
| PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler); | |
| function forEachSingleChild(bookKeeping, child, name) { | |
| var func = bookKeeping.func; | |
| var context = bookKeeping.context; | |
| func.call(context, child, bookKeeping.count++); | |
| } | |
| /** | |
| * Iterates through children that are typically specified as `props.children`. | |
| * | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.children.foreach | |
| * | |
| * The provided forEachFunc(child, index) will be called for each | |
| * leaf child. | |
| * | |
| * @param {?*} children Children tree container. | |
| * @param {function(*, int)} forEachFunc | |
| * @param {*} forEachContext Context for forEachContext. | |
| */ | |
| function forEachChildren(children, forEachFunc, forEachContext) { | |
| if (children == null) { | |
| return children; | |
| } | |
| var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext); | |
| traverseAllChildren(children, forEachSingleChild, traverseContext); | |
| ForEachBookKeeping.release(traverseContext); | |
| } | |
| /** | |
| * PooledClass representing the bookkeeping associated with performing a child | |
| * mapping. Allows avoiding binding callbacks. | |
| * | |
| * @constructor MapBookKeeping | |
| * @param {!*} mapResult Object containing the ordered map of results. | |
| * @param {!function} mapFunction Function to perform mapping with. | |
| * @param {?*} mapContext Context to perform mapping with. | |
| */ | |
| function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) { | |
| this.result = mapResult; | |
| this.keyPrefix = keyPrefix; | |
| this.func = mapFunction; | |
| this.context = mapContext; | |
| this.count = 0; | |
| } | |
| MapBookKeeping.prototype.destructor = function () { | |
| this.result = null; | |
| this.keyPrefix = null; | |
| this.func = null; | |
| this.context = null; | |
| this.count = 0; | |
| }; | |
| PooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler); | |
| function mapSingleChildIntoContext(bookKeeping, child, childKey) { | |
| var result = bookKeeping.result; | |
| var keyPrefix = bookKeeping.keyPrefix; | |
| var func = bookKeeping.func; | |
| var context = bookKeeping.context; | |
| var mappedChild = func.call(context, child, bookKeeping.count++); | |
| if (Array.isArray(mappedChild)) { | |
| mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument); | |
| } else if (mappedChild != null) { | |
| if (ReactElement.isValidElement(mappedChild)) { | |
| mappedChild = ReactElement.cloneAndReplaceKey(mappedChild, | |
| // Keep both the (mapped) and old keys if they differ, just as | |
| // traverseAllChildren used to do for objects as children | |
| keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey); | |
| } | |
| result.push(mappedChild); | |
| } | |
| } | |
| function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) { | |
| var escapedPrefix = ''; | |
| if (prefix != null) { | |
| escapedPrefix = escapeUserProvidedKey(prefix) + '/'; | |
| } | |
| var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context); | |
| traverseAllChildren(children, mapSingleChildIntoContext, traverseContext); | |
| MapBookKeeping.release(traverseContext); | |
| } | |
| /** | |
| * Maps children that are typically specified as `props.children`. | |
| * | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.children.map | |
| * | |
| * The provided mapFunction(child, key, index) will be called for each | |
| * leaf child. | |
| * | |
| * @param {?*} children Children tree container. | |
| * @param {function(*, int)} func The map function. | |
| * @param {*} context Context for mapFunction. | |
| * @return {object} Object containing the ordered map of results. | |
| */ | |
| function mapChildren(children, func, context) { | |
| if (children == null) { | |
| return children; | |
| } | |
| var result = []; | |
| mapIntoWithKeyPrefixInternal(children, result, null, func, context); | |
| return result; | |
| } | |
| function forEachSingleChildDummy(traverseContext, child, name) { | |
| return null; | |
| } | |
| /** | |
| * Count the number of children that are typically specified as | |
| * `props.children`. | |
| * | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.children.count | |
| * | |
| * @param {?*} children Children tree container. | |
| * @return {number} The number of children. | |
| */ | |
| function countChildren(children, context) { | |
| return traverseAllChildren(children, forEachSingleChildDummy, null); | |
| } | |
| /** | |
| * Flatten a children object (typically specified as `props.children`) and | |
| * return an array with appropriately re-keyed children. | |
| * | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.children.toarray | |
| */ | |
| function toArray(children) { | |
| var result = []; | |
| mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument); | |
| return result; | |
| } | |
| var ReactChildren = { | |
| forEach: forEachChildren, | |
| map: mapChildren, | |
| mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal, | |
| count: countChildren, | |
| toArray: toArray | |
| }; | |
| module.exports = ReactChildren; | |
| },{"./PooledClass":3,"./ReactElement":11,"./traverseAllChildren":25,"fbjs/lib/emptyFunction":26}],6:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactClass | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'), | |
| _assign = require('object-assign'); | |
| var ReactComponent = require('./ReactComponent'); | |
| var ReactElement = require('./ReactElement'); | |
| var ReactPropTypeLocations = require('./ReactPropTypeLocations'); | |
| var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames'); | |
| var ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue'); | |
| var emptyObject = require('fbjs/lib/emptyObject'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| var keyMirror = require('fbjs/lib/keyMirror'); | |
| var keyOf = require('fbjs/lib/keyOf'); | |
| var warning = require('fbjs/lib/warning'); | |
| var MIXINS_KEY = keyOf({ mixins: null }); | |
| /** | |
| * Policies that describe methods in `ReactClassInterface`. | |
| */ | |
| var SpecPolicy = keyMirror({ | |
| /** | |
| * These methods may be defined only once by the class specification or mixin. | |
| */ | |
| DEFINE_ONCE: null, | |
| /** | |
| * These methods may be defined by both the class specification and mixins. | |
| * Subsequent definitions will be chained. These methods must return void. | |
| */ | |
| DEFINE_MANY: null, | |
| /** | |
| * These methods are overriding the base class. | |
| */ | |
| OVERRIDE_BASE: null, | |
| /** | |
| * These methods are similar to DEFINE_MANY, except we assume they return | |
| * objects. We try to merge the keys of the return values of all the mixed in | |
| * functions. If there is a key conflict we throw. | |
| */ | |
| DEFINE_MANY_MERGED: null | |
| }); | |
| var injectedMixins = []; | |
| /** | |
| * Composite components are higher-level components that compose other composite | |
| * or host components. | |
| * | |
| * To create a new type of `ReactClass`, pass a specification of | |
| * your new class to `React.createClass`. The only requirement of your class | |
| * specification is that you implement a `render` method. | |
| * | |
| * var MyComponent = React.createClass({ | |
| * render: function() { | |
| * return <div>Hello World</div>; | |
| * } | |
| * }); | |
| * | |
| * The class specification supports a specific protocol of methods that have | |
| * special meaning (e.g. `render`). See `ReactClassInterface` for | |
| * more the comprehensive protocol. Any other properties and methods in the | |
| * class specification will be available on the prototype. | |
| * | |
| * @interface ReactClassInterface | |
| * @internal | |
| */ | |
| var ReactClassInterface = { | |
| /** | |
| * An array of Mixin objects to include when defining your component. | |
| * | |
| * @type {array} | |
| * @optional | |
| */ | |
| mixins: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * An object containing properties and methods that should be defined on | |
| * the component's constructor instead of its prototype (static methods). | |
| * | |
| * @type {object} | |
| * @optional | |
| */ | |
| statics: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Definition of prop types for this component. | |
| * | |
| * @type {object} | |
| * @optional | |
| */ | |
| propTypes: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Definition of context types for this component. | |
| * | |
| * @type {object} | |
| * @optional | |
| */ | |
| contextTypes: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Definition of context types this component sets for its children. | |
| * | |
| * @type {object} | |
| * @optional | |
| */ | |
| childContextTypes: SpecPolicy.DEFINE_MANY, | |
| // ==== Definition methods ==== | |
| /** | |
| * Invoked when the component is mounted. Values in the mapping will be set on | |
| * `this.props` if that prop is not specified (i.e. using an `in` check). | |
| * | |
| * This method is invoked before `getInitialState` and therefore cannot rely | |
| * on `this.state` or use `this.setState`. | |
| * | |
| * @return {object} | |
| * @optional | |
| */ | |
| getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED, | |
| /** | |
| * Invoked once before the component is mounted. The return value will be used | |
| * as the initial value of `this.state`. | |
| * | |
| * getInitialState: function() { | |
| * return { | |
| * isOn: false, | |
| * fooBaz: new BazFoo() | |
| * } | |
| * } | |
| * | |
| * @return {object} | |
| * @optional | |
| */ | |
| getInitialState: SpecPolicy.DEFINE_MANY_MERGED, | |
| /** | |
| * @return {object} | |
| * @optional | |
| */ | |
| getChildContext: SpecPolicy.DEFINE_MANY_MERGED, | |
| /** | |
| * Uses props from `this.props` and state from `this.state` to render the | |
| * structure of the component. | |
| * | |
| * No guarantees are made about when or how often this method is invoked, so | |
| * it must not have side effects. | |
| * | |
| * render: function() { | |
| * var name = this.props.name; | |
| * return <div>Hello, {name}!</div>; | |
| * } | |
| * | |
| * @return {ReactComponent} | |
| * @nosideeffects | |
| * @required | |
| */ | |
| render: SpecPolicy.DEFINE_ONCE, | |
| // ==== Delegate methods ==== | |
| /** | |
| * Invoked when the component is initially created and about to be mounted. | |
| * This may have side effects, but any external subscriptions or data created | |
| * by this method must be cleaned up in `componentWillUnmount`. | |
| * | |
| * @optional | |
| */ | |
| componentWillMount: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Invoked when the component has been mounted and has a DOM representation. | |
| * However, there is no guarantee that the DOM node is in the document. | |
| * | |
| * Use this as an opportunity to operate on the DOM when the component has | |
| * been mounted (initialized and rendered) for the first time. | |
| * | |
| * @param {DOMElement} rootNode DOM element representing the component. | |
| * @optional | |
| */ | |
| componentDidMount: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Invoked before the component receives new props. | |
| * | |
| * Use this as an opportunity to react to a prop transition by updating the | |
| * state using `this.setState`. Current props are accessed via `this.props`. | |
| * | |
| * componentWillReceiveProps: function(nextProps, nextContext) { | |
| * this.setState({ | |
| * likesIncreasing: nextProps.likeCount > this.props.likeCount | |
| * }); | |
| * } | |
| * | |
| * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop | |
| * transition may cause a state change, but the opposite is not true. If you | |
| * need it, you are probably looking for `componentWillUpdate`. | |
| * | |
| * @param {object} nextProps | |
| * @optional | |
| */ | |
| componentWillReceiveProps: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Invoked while deciding if the component should be updated as a result of | |
| * receiving new props, state and/or context. | |
| * | |
| * Use this as an opportunity to `return false` when you're certain that the | |
| * transition to the new props/state/context will not require a component | |
| * update. | |
| * | |
| * shouldComponentUpdate: function(nextProps, nextState, nextContext) { | |
| * return !equal(nextProps, this.props) || | |
| * !equal(nextState, this.state) || | |
| * !equal(nextContext, this.context); | |
| * } | |
| * | |
| * @param {object} nextProps | |
| * @param {?object} nextState | |
| * @param {?object} nextContext | |
| * @return {boolean} True if the component should update. | |
| * @optional | |
| */ | |
| shouldComponentUpdate: SpecPolicy.DEFINE_ONCE, | |
| /** | |
| * Invoked when the component is about to update due to a transition from | |
| * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState` | |
| * and `nextContext`. | |
| * | |
| * Use this as an opportunity to perform preparation before an update occurs. | |
| * | |
| * NOTE: You **cannot** use `this.setState()` in this method. | |
| * | |
| * @param {object} nextProps | |
| * @param {?object} nextState | |
| * @param {?object} nextContext | |
| * @param {ReactReconcileTransaction} transaction | |
| * @optional | |
| */ | |
| componentWillUpdate: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Invoked when the component's DOM representation has been updated. | |
| * | |
| * Use this as an opportunity to operate on the DOM when the component has | |
| * been updated. | |
| * | |
| * @param {object} prevProps | |
| * @param {?object} prevState | |
| * @param {?object} prevContext | |
| * @param {DOMElement} rootNode DOM element representing the component. | |
| * @optional | |
| */ | |
| componentDidUpdate: SpecPolicy.DEFINE_MANY, | |
| /** | |
| * Invoked when the component is about to be removed from its parent and have | |
| * its DOM representation destroyed. | |
| * | |
| * Use this as an opportunity to deallocate any external resources. | |
| * | |
| * NOTE: There is no `componentDidUnmount` since your component will have been | |
| * destroyed by that point. | |
| * | |
| * @optional | |
| */ | |
| componentWillUnmount: SpecPolicy.DEFINE_MANY, | |
| // ==== Advanced methods ==== | |
| /** | |
| * Updates the component's currently mounted DOM representation. | |
| * | |
| * By default, this implements React's rendering and reconciliation algorithm. | |
| * Sophisticated clients may wish to override this. | |
| * | |
| * @param {ReactReconcileTransaction} transaction | |
| * @internal | |
| * @overridable | |
| */ | |
| updateComponent: SpecPolicy.OVERRIDE_BASE | |
| }; | |
| /** | |
| * Mapping from class specification keys to special processing functions. | |
| * | |
| * Although these are declared like instance properties in the specification | |
| * when defining classes using `React.createClass`, they are actually static | |
| * and are accessible on the constructor instead of the prototype. Despite | |
| * being static, they must be defined outside of the "statics" key under | |
| * which all other static methods are defined. | |
| */ | |
| var RESERVED_SPEC_KEYS = { | |
| displayName: function (Constructor, displayName) { | |
| Constructor.displayName = displayName; | |
| }, | |
| mixins: function (Constructor, mixins) { | |
| if (mixins) { | |
| for (var i = 0; i < mixins.length; i++) { | |
| mixSpecIntoComponent(Constructor, mixins[i]); | |
| } | |
| } | |
| }, | |
| childContextTypes: function (Constructor, childContextTypes) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| validateTypeDef(Constructor, childContextTypes, ReactPropTypeLocations.childContext); | |
| } | |
| Constructor.childContextTypes = _assign({}, Constructor.childContextTypes, childContextTypes); | |
| }, | |
| contextTypes: function (Constructor, contextTypes) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| validateTypeDef(Constructor, contextTypes, ReactPropTypeLocations.context); | |
| } | |
| Constructor.contextTypes = _assign({}, Constructor.contextTypes, contextTypes); | |
| }, | |
| /** | |
| * Special case getDefaultProps which should move into statics but requires | |
| * automatic merging. | |
| */ | |
| getDefaultProps: function (Constructor, getDefaultProps) { | |
| if (Constructor.getDefaultProps) { | |
| Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps); | |
| } else { | |
| Constructor.getDefaultProps = getDefaultProps; | |
| } | |
| }, | |
| propTypes: function (Constructor, propTypes) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| validateTypeDef(Constructor, propTypes, ReactPropTypeLocations.prop); | |
| } | |
| Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes); | |
| }, | |
| statics: function (Constructor, statics) { | |
| mixStaticSpecIntoComponent(Constructor, statics); | |
| }, | |
| autobind: function () {} }; | |
| // noop | |
| function validateTypeDef(Constructor, typeDef, location) { | |
| for (var propName in typeDef) { | |
| if (typeDef.hasOwnProperty(propName)) { | |
| // use a warning instead of an invariant so components | |
| // don't show up in prod but only in __DEV__ | |
| process.env.NODE_ENV !== 'production' ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : void 0; | |
| } | |
| } | |
| } | |
| function validateMethodOverride(isAlreadyDefined, name) { | |
| var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null; | |
| // Disallow overriding of base class methods unless explicitly allowed. | |
| if (ReactClassMixin.hasOwnProperty(name)) { | |
| !(specPolicy === SpecPolicy.OVERRIDE_BASE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.', name) : _prodInvariant('73', name) : void 0; | |
| } | |
| // Disallow defining methods more than once unless explicitly allowed. | |
| if (isAlreadyDefined) { | |
| !(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.', name) : _prodInvariant('74', name) : void 0; | |
| } | |
| } | |
| /** | |
| * Mixin helper which handles policy validation and reserved | |
| * specification keys when building React classes. | |
| */ | |
| function mixSpecIntoComponent(Constructor, spec) { | |
| if (!spec) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| var typeofSpec = typeof spec; | |
| var isMixinValid = typeofSpec === 'object' && spec !== null; | |
| process.env.NODE_ENV !== 'production' ? warning(isMixinValid, '%s: You\'re attempting to include a mixin that is either null ' + 'or not an object. Check the mixins included by the component, ' + 'as well as any mixins they include themselves. ' + 'Expected object but got %s.', Constructor.displayName || 'ReactClass', spec === null ? null : typeofSpec) : void 0; | |
| } | |
| return; | |
| } | |
| !(typeof spec !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to use a component class or function as a mixin. Instead, just use a regular object.') : _prodInvariant('75') : void 0; | |
| !!ReactElement.isValidElement(spec) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to use a component as a mixin. Instead, just use a regular object.') : _prodInvariant('76') : void 0; | |
| var proto = Constructor.prototype; | |
| var autoBindPairs = proto.__reactAutoBindPairs; | |
| // By handling mixins before any other properties, we ensure the same | |
| // chaining order is applied to methods with DEFINE_MANY policy, whether | |
| // mixins are listed before or after these methods in the spec. | |
| if (spec.hasOwnProperty(MIXINS_KEY)) { | |
| RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins); | |
| } | |
| for (var name in spec) { | |
| if (!spec.hasOwnProperty(name)) { | |
| continue; | |
| } | |
| if (name === MIXINS_KEY) { | |
| // We have already handled mixins in a special case above. | |
| continue; | |
| } | |
| var property = spec[name]; | |
| var isAlreadyDefined = proto.hasOwnProperty(name); | |
| validateMethodOverride(isAlreadyDefined, name); | |
| if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) { | |
| RESERVED_SPEC_KEYS[name](Constructor, property); | |
| } else { | |
| // Setup methods on prototype: | |
| // The following member methods should not be automatically bound: | |
| // 1. Expected ReactClass methods (in the "interface"). | |
| // 2. Overridden methods (that were mixed in). | |
| var isReactClassMethod = ReactClassInterface.hasOwnProperty(name); | |
| var isFunction = typeof property === 'function'; | |
| var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false; | |
| if (shouldAutoBind) { | |
| autoBindPairs.push(name, property); | |
| proto[name] = property; | |
| } else { | |
| if (isAlreadyDefined) { | |
| var specPolicy = ReactClassInterface[name]; | |
| // These cases should already be caught by validateMethodOverride. | |
| !(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.', specPolicy, name) : _prodInvariant('77', specPolicy, name) : void 0; | |
| // For methods which are defined more than once, call the existing | |
| // methods before calling the new property, merging if appropriate. | |
| if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) { | |
| proto[name] = createMergedResultFunction(proto[name], property); | |
| } else if (specPolicy === SpecPolicy.DEFINE_MANY) { | |
| proto[name] = createChainedFunction(proto[name], property); | |
| } | |
| } else { | |
| proto[name] = property; | |
| if (process.env.NODE_ENV !== 'production') { | |
| // Add verbose displayName to the function, which helps when looking | |
| // at profiling tools. | |
| if (typeof property === 'function' && spec.displayName) { | |
| proto[name].displayName = spec.displayName + '_' + name; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| function mixStaticSpecIntoComponent(Constructor, statics) { | |
| if (!statics) { | |
| return; | |
| } | |
| for (var name in statics) { | |
| var property = statics[name]; | |
| if (!statics.hasOwnProperty(name)) { | |
| continue; | |
| } | |
| var isReserved = name in RESERVED_SPEC_KEYS; | |
| !!isReserved ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.', name) : _prodInvariant('78', name) : void 0; | |
| var isInherited = name in Constructor; | |
| !!isInherited ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.', name) : _prodInvariant('79', name) : void 0; | |
| Constructor[name] = property; | |
| } | |
| } | |
| /** | |
| * Merge two objects, but throw if both contain the same key. | |
| * | |
| * @param {object} one The first object, which is mutated. | |
| * @param {object} two The second object | |
| * @return {object} one after it has been mutated to contain everything in two. | |
| */ | |
| function mergeIntoWithNoDuplicateKeys(one, two) { | |
| !(one && two && typeof one === 'object' && typeof two === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : _prodInvariant('80') : void 0; | |
| for (var key in two) { | |
| if (two.hasOwnProperty(key)) { | |
| !(one[key] === undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.', key) : _prodInvariant('81', key) : void 0; | |
| one[key] = two[key]; | |
| } | |
| } | |
| return one; | |
| } | |
| /** | |
| * Creates a function that invokes two functions and merges their return values. | |
| * | |
| * @param {function} one Function to invoke first. | |
| * @param {function} two Function to invoke second. | |
| * @return {function} Function that invokes the two argument functions. | |
| * @private | |
| */ | |
| function createMergedResultFunction(one, two) { | |
| return function mergedResult() { | |
| var a = one.apply(this, arguments); | |
| var b = two.apply(this, arguments); | |
| if (a == null) { | |
| return b; | |
| } else if (b == null) { | |
| return a; | |
| } | |
| var c = {}; | |
| mergeIntoWithNoDuplicateKeys(c, a); | |
| mergeIntoWithNoDuplicateKeys(c, b); | |
| return c; | |
| }; | |
| } | |
| /** | |
| * Creates a function that invokes two functions and ignores their return vales. | |
| * | |
| * @param {function} one Function to invoke first. | |
| * @param {function} two Function to invoke second. | |
| * @return {function} Function that invokes the two argument functions. | |
| * @private | |
| */ | |
| function createChainedFunction(one, two) { | |
| return function chainedFunction() { | |
| one.apply(this, arguments); | |
| two.apply(this, arguments); | |
| }; | |
| } | |
| /** | |
| * Binds a method to the component. | |
| * | |
| * @param {object} component Component whose method is going to be bound. | |
| * @param {function} method Method to be bound. | |
| * @return {function} The bound method. | |
| */ | |
| function bindAutoBindMethod(component, method) { | |
| var boundMethod = method.bind(component); | |
| if (process.env.NODE_ENV !== 'production') { | |
| boundMethod.__reactBoundContext = component; | |
| boundMethod.__reactBoundMethod = method; | |
| boundMethod.__reactBoundArguments = null; | |
| var componentName = component.constructor.displayName; | |
| var _bind = boundMethod.bind; | |
| boundMethod.bind = function (newThis) { | |
| for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | |
| args[_key - 1] = arguments[_key]; | |
| } | |
| // User is trying to bind() an autobound method; we effectively will | |
| // ignore the value of "this" that the user is trying to use, so | |
| // let's warn. | |
| if (newThis !== component && newThis !== null) { | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : void 0; | |
| } else if (!args.length) { | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : void 0; | |
| return boundMethod; | |
| } | |
| var reboundMethod = _bind.apply(boundMethod, arguments); | |
| reboundMethod.__reactBoundContext = component; | |
| reboundMethod.__reactBoundMethod = method; | |
| reboundMethod.__reactBoundArguments = args; | |
| return reboundMethod; | |
| }; | |
| } | |
| return boundMethod; | |
| } | |
| /** | |
| * Binds all auto-bound methods in a component. | |
| * | |
| * @param {object} component Component whose method is going to be bound. | |
| */ | |
| function bindAutoBindMethods(component) { | |
| var pairs = component.__reactAutoBindPairs; | |
| for (var i = 0; i < pairs.length; i += 2) { | |
| var autoBindKey = pairs[i]; | |
| var method = pairs[i + 1]; | |
| component[autoBindKey] = bindAutoBindMethod(component, method); | |
| } | |
| } | |
| /** | |
| * Add more to the ReactClass base class. These are all legacy features and | |
| * therefore not already part of the modern ReactComponent. | |
| */ | |
| var ReactClassMixin = { | |
| /** | |
| * TODO: This will be deprecated because state should always keep a consistent | |
| * type signature and the only use case for this, is to avoid that. | |
| */ | |
| replaceState: function (newState, callback) { | |
| this.updater.enqueueReplaceState(this, newState); | |
| if (callback) { | |
| this.updater.enqueueCallback(this, callback, 'replaceState'); | |
| } | |
| }, | |
| /** | |
| * Checks whether or not this composite component is mounted. | |
| * @return {boolean} True if mounted, false otherwise. | |
| * @protected | |
| * @final | |
| */ | |
| isMounted: function () { | |
| return this.updater.isMounted(this); | |
| } | |
| }; | |
| var ReactClassComponent = function () {}; | |
| _assign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin); | |
| /** | |
| * Module for creating composite components. | |
| * | |
| * @class ReactClass | |
| */ | |
| var ReactClass = { | |
| /** | |
| * Creates a composite component class given a class specification. | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass | |
| * | |
| * @param {object} spec Class specification (which must define `render`). | |
| * @return {function} Component constructor function. | |
| * @public | |
| */ | |
| createClass: function (spec) { | |
| var Constructor = function (props, context, updater) { | |
| // This constructor gets overridden by mocks. The argument is used | |
| // by mocks to assert on what gets mounted. | |
| if (process.env.NODE_ENV !== 'production') { | |
| process.env.NODE_ENV !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : void 0; | |
| } | |
| // Wire up auto-binding | |
| if (this.__reactAutoBindPairs.length) { | |
| bindAutoBindMethods(this); | |
| } | |
| this.props = props; | |
| this.context = context; | |
| this.refs = emptyObject; | |
| this.updater = updater || ReactNoopUpdateQueue; | |
| this.state = null; | |
| // ReactClasses doesn't have constructors. Instead, they use the | |
| // getInitialState and componentWillMount methods for initialization. | |
| var initialState = this.getInitialState ? this.getInitialState() : null; | |
| if (process.env.NODE_ENV !== 'production') { | |
| // We allow auto-mocks to proceed as if they're returning null. | |
| if (initialState === undefined && this.getInitialState._isMockFunction) { | |
| // This is probably bad practice. Consider warning here and | |
| // deprecating this convenience. | |
| initialState = null; | |
| } | |
| } | |
| !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : _prodInvariant('82', Constructor.displayName || 'ReactCompositeComponent') : void 0; | |
| this.state = initialState; | |
| }; | |
| Constructor.prototype = new ReactClassComponent(); | |
| Constructor.prototype.constructor = Constructor; | |
| Constructor.prototype.__reactAutoBindPairs = []; | |
| injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor)); | |
| mixSpecIntoComponent(Constructor, spec); | |
| // Initialize the defaultProps property after all mixins have been merged. | |
| if (Constructor.getDefaultProps) { | |
| Constructor.defaultProps = Constructor.getDefaultProps(); | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| // This is a tag to indicate that the use of these method names is ok, | |
| // since it's used with createClass. If it's not, then it's likely a | |
| // mistake so we'll warn you to use the static property, property | |
| // initializer or constructor respectively. | |
| if (Constructor.getDefaultProps) { | |
| Constructor.getDefaultProps.isReactClassApproved = {}; | |
| } | |
| if (Constructor.prototype.getInitialState) { | |
| Constructor.prototype.getInitialState.isReactClassApproved = {}; | |
| } | |
| } | |
| !Constructor.prototype.render ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createClass(...): Class specification must implement a `render` method.') : _prodInvariant('83') : void 0; | |
| if (process.env.NODE_ENV !== 'production') { | |
| process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : void 0; | |
| process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component') : void 0; | |
| } | |
| // Reduce time spent doing lookups by setting these on the prototype. | |
| for (var methodName in ReactClassInterface) { | |
| if (!Constructor.prototype[methodName]) { | |
| Constructor.prototype[methodName] = null; | |
| } | |
| } | |
| return Constructor; | |
| }, | |
| injection: { | |
| injectMixin: function (mixin) { | |
| injectedMixins.push(mixin); | |
| } | |
| } | |
| }; | |
| module.exports = ReactClass; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdENsYXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBSZWFjdENsYXNzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnQnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbnMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbnMnKTtcbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMnKTtcbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3ROb29wVXBkYXRlUXVldWUnKTtcblxudmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBrZXlNaXJyb3IgPSByZXF1aXJlKCdmYmpzL2xpYi9rZXlNaXJyb3InKTtcbnZhciBrZXlPZiA9IHJlcXVpcmUoJ2ZianMvbGliL2tleU9mJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIE1JWElOU19LRVkgPSBrZXlPZih7IG1peGluczogbnVsbCB9KTtcblxuLyoqXG4gKiBQb2xpY2llcyB0aGF0IGRlc2NyaWJlIG1ldGhvZHMgaW4gYFJlYWN0Q2xhc3NJbnRlcmZhY2VgLlxuICovXG52YXIgU3BlY1BvbGljeSA9IGtleU1pcnJvcih7XG4gIC8qKlxuICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBkZWZpbmVkIG9ubHkgb25jZSBieSB0aGUgY2xhc3Mgc3BlY2lmaWNhdGlvbiBvciBtaXhpbi5cbiAgICovXG4gIERFRklORV9PTkNFOiBudWxsLFxuICAvKipcbiAgICogVGhlc2UgbWV0aG9kcyBtYXkgYmUgZGVmaW5lZCBieSBib3RoIHRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIGFuZCBtaXhpbnMuXG4gICAqIFN1YnNlcXVlbnQgZGVmaW5pdGlvbnMgd2lsbCBiZSBjaGFpbmVkLiBUaGVzZSBtZXRob2RzIG11c3QgcmV0dXJuIHZvaWQuXG4gICAqL1xuICBERUZJTkVfTUFOWTogbnVsbCxcbiAgLyoqXG4gICAqIFRoZXNlIG1ldGhvZHMgYXJlIG92ZXJyaWRpbmcgdGhlIGJhc2UgY2xhc3MuXG4gICAqL1xuICBPVkVSUklERV9CQVNFOiBudWxsLFxuICAvKipcbiAgICogVGhlc2UgbWV0aG9kcyBhcmUgc2ltaWxhciB0byBERUZJTkVfTUFOWSwgZXhjZXB0IHdlIGFzc3VtZSB0aGV5IHJldHVyblxuICAgKiBvYmplY3RzLiBXZSB0cnkgdG8gbWVyZ2UgdGhlIGtleXMgb2YgdGhlIHJldHVybiB2YWx1ZXMgb2YgYWxsIHRoZSBtaXhlZCBpblxuICAgKiBmdW5jdGlvbnMuIElmIHRoZXJlIGlzIGEga2V5IGNvbmZsaWN0IHdlIHRocm93LlxuICAgKi9cbiAgREVGSU5FX01BTllfTUVSR0VEOiBudWxsXG59KTtcblxudmFyIGluamVjdGVkTWl4aW5zID0gW107XG5cbi8qKlxuICogQ29tcG9zaXRlIGNvbXBvbmVudHMgYXJlIGhpZ2hlci1sZXZlbCBjb21wb25lbnRzIHRoYXQgY29tcG9zZSBvdGhlciBjb21wb3NpdGVcbiAqIG9yIGhvc3QgY29tcG9uZW50cy5cbiAqXG4gKiBUbyBjcmVhdGUgYSBuZXcgdHlwZSBvZiBgUmVhY3RDbGFzc2AsIHBhc3MgYSBzcGVjaWZpY2F0aW9uIG9mXG4gKiB5b3VyIG5ldyBjbGFzcyB0byBgUmVhY3QuY3JlYXRlQ2xhc3NgLiBUaGUgb25seSByZXF1aXJlbWVudCBvZiB5b3VyIGNsYXNzXG4gKiBzcGVjaWZpY2F0aW9uIGlzIHRoYXQgeW91IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC5cbiAqXG4gKiAgIHZhciBNeUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgcmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47XG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiBUaGUgY2xhc3Mgc3BlY2lmaWNhdGlvbiBzdXBwb3J0cyBhIHNwZWNpZmljIHByb3RvY29sIG9mIG1ldGhvZHMgdGhhdCBoYXZlXG4gKiBzcGVjaWFsIG1lYW5pbmcgKGUuZy4gYHJlbmRlcmApLiBTZWUgYFJlYWN0Q2xhc3NJbnRlcmZhY2VgIGZvclxuICogbW9yZSB0aGUgY29tcHJlaGVuc2l2ZSBwcm90b2NvbC4gQW55IG90aGVyIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgaW4gdGhlXG4gKiBjbGFzcyBzcGVjaWZpY2F0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBwcm90b3R5cGUuXG4gKlxuICogQGludGVyZmFjZSBSZWFjdENsYXNzSW50ZXJmYWNlXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0Q2xhc3NJbnRlcmZhY2UgPSB7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIE1peGluIG9iamVjdHMgdG8gaW5jbHVkZSB3aGVuIGRlZmluaW5nIHlvdXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7YXJyYXl9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgbWl4aW5zOiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGRlZmluZWQgb25cbiAgICogdGhlIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgaXRzIHByb3RvdHlwZSAoc3RhdGljIG1ldGhvZHMpLlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIHN0YXRpY3M6IFNwZWNQb2xpY3kuREVGSU5FX01BTlksXG5cbiAgLyoqXG4gICAqIERlZmluaXRpb24gb2YgcHJvcCB0eXBlcyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgcHJvcFR5cGVzOiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8qKlxuICAgKiBEZWZpbml0aW9uIG9mIGNvbnRleHQgdHlwZXMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbnRleHRUeXBlczogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvKipcbiAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIHRoaXMgY29tcG9uZW50IHNldHMgZm9yIGl0cyBjaGlsZHJlbi5cbiAgICpcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjaGlsZENvbnRleHRUeXBlczogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvLyA9PT09IERlZmluaXRpb24gbWV0aG9kcyA9PT09XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQuIFZhbHVlcyBpbiB0aGUgbWFwcGluZyB3aWxsIGJlIHNldCBvblxuICAgKiBgdGhpcy5wcm9wc2AgaWYgdGhhdCBwcm9wIGlzIG5vdCBzcGVjaWZpZWQgKGkuZS4gdXNpbmcgYW4gYGluYCBjaGVjaykuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGBnZXRJbml0aWFsU3RhdGVgIGFuZCB0aGVyZWZvcmUgY2Fubm90IHJlbHlcbiAgICogb24gYHRoaXMuc3RhdGVgIG9yIHVzZSBgdGhpcy5zZXRTdGF0ZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBnZXREZWZhdWx0UHJvcHM6IFNwZWNQb2xpY3kuREVGSU5FX01BTllfTUVSR0VELFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uY2UgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZC4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWRcbiAgICogYXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYHRoaXMuc3RhdGVgLlxuICAgKlxuICAgKiAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAqICAgICByZXR1cm4ge1xuICAgKiAgICAgICBpc09uOiBmYWxzZSxcbiAgICogICAgICAgZm9vQmF6OiBuZXcgQmF6Rm9vKClcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBnZXRJbml0aWFsU3RhdGU6IFNwZWNQb2xpY3kuREVGSU5FX01BTllfTUVSR0VELFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgZ2V0Q2hpbGRDb250ZXh0OiBTcGVjUG9saWN5LkRFRklORV9NQU5ZX01FUkdFRCxcblxuICAvKipcbiAgICogVXNlcyBwcm9wcyBmcm9tIGB0aGlzLnByb3BzYCBhbmQgc3RhdGUgZnJvbSBgdGhpcy5zdGF0ZWAgdG8gcmVuZGVyIHRoZVxuICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB3aGVuIG9yIGhvdyBvZnRlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBzb1xuICAgKiBpdCBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgKiAgICAgdmFyIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAqICAgICByZXR1cm4gPGRpdj5IZWxsbywge25hbWV9ITwvZGl2PjtcbiAgICogICB9XG4gICAqXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fVxuICAgKiBAbm9zaWRlZWZmZWN0c1xuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIHJlbmRlcjogU3BlY1BvbGljeS5ERUZJTkVfT05DRSxcblxuICAvLyA9PT09IERlbGVnYXRlIG1ldGhvZHMgPT09PVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsbHkgY3JlYXRlZCBhbmQgYWJvdXQgdG8gYmUgbW91bnRlZC5cbiAgICogVGhpcyBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMsIGJ1dCBhbnkgZXh0ZXJuYWwgc3Vic2NyaXB0aW9ucyBvciBkYXRhIGNyZWF0ZWRcbiAgICogYnkgdGhpcyBtZXRob2QgbXVzdCBiZSBjbGVhbmVkIHVwIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGAuXG4gICAqXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbE1vdW50OiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBtb3VudGVkIGFuZCBoYXMgYSBET00gcmVwcmVzZW50YXRpb24uXG4gICAqIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBET00gbm9kZSBpcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAqIGJlZW4gbW91bnRlZCAoaW5pdGlhbGl6ZWQgYW5kIHJlbmRlcmVkKSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50RGlkTW91bnQ6IFNwZWNQb2xpY3kuREVGSU5FX01BTlksXG5cbiAgLyoqXG4gICAqIEludm9rZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgbmV3IHByb3BzLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byByZWFjdCB0byBhIHByb3AgdHJhbnNpdGlvbiBieSB1cGRhdGluZyB0aGVcbiAgICogc3RhdGUgdXNpbmcgYHRoaXMuc2V0U3RhdGVgLiBDdXJyZW50IHByb3BzIGFyZSBhY2Nlc3NlZCB2aWEgYHRoaXMucHJvcHNgLlxuICAgKlxuICAgKiAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKG5leHRQcm9wcywgbmV4dENvbnRleHQpIHtcbiAgICogICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgKiAgICAgICBsaWtlc0luY3JlYXNpbmc6IG5leHRQcm9wcy5saWtlQ291bnQgPiB0aGlzLnByb3BzLmxpa2VDb3VudFxuICAgKiAgICAgfSk7XG4gICAqICAgfVxuICAgKlxuICAgKiBOT1RFOiBUaGVyZSBpcyBubyBlcXVpdmFsZW50IGBjb21wb25lbnRXaWxsUmVjZWl2ZVN0YXRlYC4gQW4gaW5jb21pbmcgcHJvcFxuICAgKiB0cmFuc2l0aW9uIG1heSBjYXVzZSBhIHN0YXRlIGNoYW5nZSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZS4gSWYgeW91XG4gICAqIG5lZWQgaXQsIHlvdSBhcmUgcHJvYmFibHkgbG9va2luZyBmb3IgYGNvbXBvbmVudFdpbGxVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGlsZSBkZWNpZGluZyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB1cGRhdGVkIGFzIGEgcmVzdWx0IG9mXG4gICAqIHJlY2VpdmluZyBuZXcgcHJvcHMsIHN0YXRlIGFuZC9vciBjb250ZXh0LlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBgcmV0dXJuIGZhbHNlYCB3aGVuIHlvdSdyZSBjZXJ0YWluIHRoYXQgdGhlXG4gICAqIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBwcm9wcy9zdGF0ZS9jb250ZXh0IHdpbGwgbm90IHJlcXVpcmUgYSBjb21wb25lbnRcbiAgICogdXBkYXRlLlxuICAgKlxuICAgKiAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gICAqICAgICByZXR1cm4gIWVxdWFsKG5leHRQcm9wcywgdGhpcy5wcm9wcykgfHxcbiAgICogICAgICAgIWVxdWFsKG5leHRTdGF0ZSwgdGhpcy5zdGF0ZSkgfHxcbiAgICogICAgICAgIWVxdWFsKG5leHRDb250ZXh0LCB0aGlzLmNvbnRleHQpO1xuICAgKiAgIH1cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDb250ZXh0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlLlxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZTogU3BlY1BvbGljeS5ERUZJTkVfT05DRSxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gdXBkYXRlIGR1ZSB0byBhIHRyYW5zaXRpb24gZnJvbVxuICAgKiBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAgdG8gYG5leHRQcm9wc2AsIGBuZXh0U3RhdGVgXG4gICAqIGFuZCBgbmV4dENvbnRleHRgLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHByZXBhcmF0aW9uIGJlZm9yZSBhbiB1cGRhdGUgb2NjdXJzLlxuICAgKlxuICAgKiBOT1RFOiBZb3UgKipjYW5ub3QqKiB1c2UgYHRoaXMuc2V0U3RhdGUoKWAgaW4gdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3RhdGVcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFVwZGF0ZTogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQncyBET00gcmVwcmVzZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNvbXBvbmVudCBoYXNcbiAgICogYmVlbiB1cGRhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJldlByb3BzXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldlN0YXRlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldkNvbnRleHRcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC5cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnREaWRVcGRhdGU6IFNwZWNQb2xpY3kuREVGSU5FX01BTlksXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IGFuZCBoYXZlXG4gICAqIGl0cyBET00gcmVwcmVzZW50YXRpb24gZGVzdHJveWVkLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBkZWFsbG9jYXRlIGFueSBleHRlcm5hbCByZXNvdXJjZXMuXG4gICAqXG4gICAqIE5PVEU6IFRoZXJlIGlzIG5vIGBjb21wb25lbnREaWRVbm1vdW50YCBzaW5jZSB5b3VyIGNvbXBvbmVudCB3aWxsIGhhdmUgYmVlblxuICAgKiBkZXN0cm95ZWQgYnkgdGhhdCBwb2ludC5cbiAgICpcbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnRXaWxsVW5tb3VudDogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvLyA9PT09IEFkdmFuY2VkIG1ldGhvZHMgPT09PVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb21wb25lbnQncyBjdXJyZW50bHkgbW91bnRlZCBET00gcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLlxuICAgKiBTb3BoaXN0aWNhdGVkIGNsaWVudHMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICogQG92ZXJyaWRhYmxlXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnQ6IFNwZWNQb2xpY3kuT1ZFUlJJREVfQkFTRVxuXG59O1xuXG4vKipcbiAqIE1hcHBpbmcgZnJvbSBjbGFzcyBzcGVjaWZpY2F0aW9uIGtleXMgdG8gc3BlY2lhbCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBBbHRob3VnaCB0aGVzZSBhcmUgZGVjbGFyZWQgbGlrZSBpbnN0YW5jZSBwcm9wZXJ0aWVzIGluIHRoZSBzcGVjaWZpY2F0aW9uXG4gKiB3aGVuIGRlZmluaW5nIGNsYXNzZXMgdXNpbmcgYFJlYWN0LmNyZWF0ZUNsYXNzYCwgdGhleSBhcmUgYWN0dWFsbHkgc3RhdGljXG4gKiBhbmQgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgdGhlIHByb3RvdHlwZS4gRGVzcGl0ZVxuICogYmVpbmcgc3RhdGljLCB0aGV5IG11c3QgYmUgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBcInN0YXRpY3NcIiBrZXkgdW5kZXJcbiAqIHdoaWNoIGFsbCBvdGhlciBzdGF0aWMgbWV0aG9kcyBhcmUgZGVmaW5lZC5cbiAqL1xudmFyIFJFU0VSVkVEX1NQRUNfS0VZUyA9IHtcbiAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgZGlzcGxheU5hbWUpIHtcbiAgICBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICB9LFxuICBtaXhpbnM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgbWl4aW5zKSB7XG4gICAgaWYgKG1peGlucykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXhpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIG1peGluc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBjaGlsZENvbnRleHRUeXBlczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNoaWxkQ29udGV4dFR5cGVzLCBSZWFjdFByb3BUeXBlTG9jYXRpb25zLmNoaWxkQ29udGV4dCk7XG4gICAgfVxuICAgIENvbnN0cnVjdG9yLmNoaWxkQ29udGV4dFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dFR5cGVzKTtcbiAgfSxcbiAgY29udGV4dFR5cGVzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcywgUmVhY3RQcm9wVHlwZUxvY2F0aW9ucy5jb250ZXh0KTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzLCBjb250ZXh0VHlwZXMpO1xuICB9LFxuICAvKipcbiAgICogU3BlY2lhbCBjYXNlIGdldERlZmF1bHRQcm9wcyB3aGljaCBzaG91bGQgbW92ZSBpbnRvIHN0YXRpY3MgYnV0IHJlcXVpcmVzXG4gICAqIGF1dG9tYXRpYyBtZXJnaW5nLlxuICAgKi9cbiAgZ2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGdldERlZmF1bHRQcm9wcykge1xuICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcyA9IGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcywgZ2V0RGVmYXVsdFByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gZ2V0RGVmYXVsdFByb3BzO1xuICAgIH1cbiAgfSxcbiAgcHJvcFR5cGVzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3BUeXBlcykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHByb3BUeXBlcywgUmVhY3RQcm9wVHlwZUxvY2F0aW9ucy5wcm9wKTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IucHJvcFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IucHJvcFR5cGVzLCBwcm9wVHlwZXMpO1xuICB9LFxuICBzdGF0aWNzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgICBtaXhTdGF0aWNTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcyk7XG4gIH0sXG4gIGF1dG9iaW5kOiBmdW5jdGlvbiAoKSB7fSB9O1xuXG4vLyBub29wXG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHR5cGVEZWYsIGxvY2F0aW9uKSB7XG4gIGZvciAodmFyIHByb3BOYW1lIGluIHR5cGVEZWYpIHtcbiAgICBpZiAodHlwZURlZi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgIC8vIHVzZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBpbnZhcmlhbnQgc28gY29tcG9uZW50c1xuICAgICAgLy8gZG9uJ3Qgc2hvdyB1cCBpbiBwcm9kIGJ1dCBvbmx5IGluIF9fREVWX19cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiB0eXBlRGVmW3Byb3BOYW1lXSA9PT0gJ2Z1bmN0aW9uJywgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gJyArICdSZWFjdC5Qcm9wVHlwZXMuJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHByb3BOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNZXRob2RPdmVycmlkZShpc0FscmVhZHlEZWZpbmVkLCBuYW1lKSB7XG4gIHZhciBzcGVjUG9saWN5ID0gUmVhY3RDbGFzc0ludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IFJlYWN0Q2xhc3NJbnRlcmZhY2VbbmFtZV0gOiBudWxsO1xuXG4gIC8vIERpc2FsbG93IG92ZXJyaWRpbmcgb2YgYmFzZSBjbGFzcyBtZXRob2RzIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gIGlmIChSZWFjdENsYXNzTWl4aW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAhKHNwZWNQb2xpY3kgPT09IFNwZWNQb2xpY3kuT1ZFUlJJREVfQkFTRSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGAlc2AgZnJvbSB5b3VyIGNsYXNzIHNwZWNpZmljYXRpb24uIEVuc3VyZSB0aGF0IHlvdXIgbWV0aG9kIG5hbWVzIGRvIG5vdCBvdmVybGFwIHdpdGggUmVhY3QgbWV0aG9kcy4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3MycsIG5hbWUpIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gRGlzYWxsb3cgZGVmaW5pbmcgbWV0aG9kcyBtb3JlIHRoYW4gb25jZSB1bmxlc3MgZXhwbGljaXRseSBhbGxvd2VkLlxuICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICEoc3BlY1BvbGljeSA9PT0gU3BlY1BvbGljeS5ERUZJTkVfTUFOWSB8fCBzcGVjUG9saWN5ID09PSBTcGVjUG9saWN5LkRFRklORV9NQU5ZX01FUkdFRCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgdG8gYSBtaXhpbi4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3NCcsIG5hbWUpIDogdm9pZCAwO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gaGVscGVyIHdoaWNoIGhhbmRsZXMgcG9saWN5IHZhbGlkYXRpb24gYW5kIHJlc2VydmVkXG4gKiBzcGVjaWZpY2F0aW9uIGtleXMgd2hlbiBidWlsZGluZyBSZWFjdCBjbGFzc2VzLlxuICovXG5mdW5jdGlvbiBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYykge1xuICBpZiAoIXNwZWMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHR5cGVvZlNwZWMgPSB0eXBlb2Ygc3BlYztcbiAgICAgIHZhciBpc01peGluVmFsaWQgPSB0eXBlb2ZTcGVjID09PSAnb2JqZWN0JyAmJiBzcGVjICE9PSBudWxsO1xuXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpc01peGluVmFsaWQsICclczogWW91XFwncmUgYXR0ZW1wdGluZyB0byBpbmNsdWRlIGEgbWl4aW4gdGhhdCBpcyBlaXRoZXIgbnVsbCAnICsgJ29yIG5vdCBhbiBvYmplY3QuIENoZWNrIHRoZSBtaXhpbnMgaW5jbHVkZWQgYnkgdGhlIGNvbXBvbmVudCwgJyArICdhcyB3ZWxsIGFzIGFueSBtaXhpbnMgdGhleSBpbmNsdWRlIHRoZW1zZWx2ZXMuICcgKyAnRXhwZWN0ZWQgb2JqZWN0IGJ1dCBnb3QgJXMuJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLCBzcGVjID09PSBudWxsID8gbnVsbCA6IHR5cGVvZlNwZWMpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gICEodHlwZW9mIHNwZWMgIT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdXNlIGEgY29tcG9uZW50IGNsYXNzIG9yIGZ1bmN0aW9uIGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuJykgOiBfcHJvZEludmFyaWFudCgnNzUnKSA6IHZvaWQgMDtcbiAgISFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoc3BlYykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzczogWW91XFwncmUgYXR0ZW1wdGluZyB0byB1c2UgYSBjb21wb25lbnQgYXMgYSBtaXhpbi4gSW5zdGVhZCwganVzdCB1c2UgYSByZWd1bGFyIG9iamVjdC4nKSA6IF9wcm9kSW52YXJpYW50KCc3NicpIDogdm9pZCAwO1xuXG4gIHZhciBwcm90byA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIGF1dG9CaW5kUGFpcnMgPSBwcm90by5fX3JlYWN0QXV0b0JpbmRQYWlycztcblxuICAvLyBCeSBoYW5kbGluZyBtaXhpbnMgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzLCB3ZSBlbnN1cmUgdGhlIHNhbWVcbiAgLy8gY2hhaW5pbmcgb3JkZXIgaXMgYXBwbGllZCB0byBtZXRob2RzIHdpdGggREVGSU5FX01BTlkgcG9saWN5LCB3aGV0aGVyXG4gIC8vIG1peGlucyBhcmUgbGlzdGVkIGJlZm9yZSBvciBhZnRlciB0aGVzZSBtZXRob2RzIGluIHRoZSBzcGVjLlxuICBpZiAoc3BlYy5oYXNPd25Qcm9wZXJ0eShNSVhJTlNfS0VZKSkge1xuICAgIFJFU0VSVkVEX1NQRUNfS0VZUy5taXhpbnMoQ29uc3RydWN0b3IsIHNwZWMubWl4aW5zKTtcbiAgfVxuXG4gIGZvciAodmFyIG5hbWUgaW4gc3BlYykge1xuICAgIGlmICghc3BlYy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgPT09IE1JWElOU19LRVkpIHtcbiAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIG1peGlucyBpbiBhIHNwZWNpYWwgY2FzZSBhYm92ZS5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eSA9IHNwZWNbbmFtZV07XG4gICAgdmFyIGlzQWxyZWFkeURlZmluZWQgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpO1xuXG4gICAgaWYgKFJFU0VSVkVEX1NQRUNfS0VZUy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgUkVTRVJWRURfU1BFQ19LRVlTW25hbWVdKENvbnN0cnVjdG9yLCBwcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldHVwIG1ldGhvZHMgb24gcHJvdG90eXBlOlxuICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgbWV0aG9kcyBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgYm91bmQ6XG4gICAgICAvLyAxLiBFeHBlY3RlZCBSZWFjdENsYXNzIG1ldGhvZHMgKGluIHRoZSBcImludGVyZmFjZVwiKS5cbiAgICAgIC8vIDIuIE92ZXJyaWRkZW4gbWV0aG9kcyAodGhhdCB3ZXJlIG1peGVkIGluKS5cbiAgICAgIHZhciBpc1JlYWN0Q2xhc3NNZXRob2QgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbic7XG4gICAgICB2YXIgc2hvdWxkQXV0b0JpbmQgPSBpc0Z1bmN0aW9uICYmICFpc1JlYWN0Q2xhc3NNZXRob2QgJiYgIWlzQWxyZWFkeURlZmluZWQgJiYgc3BlYy5hdXRvYmluZCAhPT0gZmFsc2U7XG5cbiAgICAgIGlmIChzaG91bGRBdXRvQmluZCkge1xuICAgICAgICBhdXRvQmluZFBhaXJzLnB1c2gobmFtZSwgcHJvcGVydHkpO1xuICAgICAgICBwcm90b1tuYW1lXSA9IHByb3BlcnR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzQWxyZWFkeURlZmluZWQpIHtcbiAgICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZhY2VbbmFtZV07XG5cbiAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBzaG91bGQgYWxyZWFkeSBiZSBjYXVnaHQgYnkgdmFsaWRhdGVNZXRob2RPdmVycmlkZS5cbiAgICAgICAgICAhKGlzUmVhY3RDbGFzc01ldGhvZCAmJiAoc3BlY1BvbGljeSA9PT0gU3BlY1BvbGljeS5ERUZJTkVfTUFOWV9NRVJHRUQgfHwgc3BlY1BvbGljeSA9PT0gU3BlY1BvbGljeS5ERUZJTkVfTUFOWSkpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFVuZXhwZWN0ZWQgc3BlYyBwb2xpY3kgJXMgZm9yIGtleSAlcyB3aGVuIG1peGluZyBpbiBjb21wb25lbnQgc3BlY3MuJywgc3BlY1BvbGljeSwgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzcnLCBzcGVjUG9saWN5LCBuYW1lKSA6IHZvaWQgMDtcblxuICAgICAgICAgIC8vIEZvciBtZXRob2RzIHdoaWNoIGFyZSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLCBjYWxsIHRoZSBleGlzdGluZ1xuICAgICAgICAgIC8vIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlIG5ldyBwcm9wZXJ0eSwgbWVyZ2luZyBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICBpZiAoc3BlY1BvbGljeSA9PT0gU3BlY1BvbGljeS5ERUZJTkVfTUFOWV9NRVJHRUQpIHtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwZWNQb2xpY3kgPT09IFNwZWNQb2xpY3kuREVGSU5FX01BTlkpIHtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKHByb3RvW25hbWVdLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEFkZCB2ZXJib3NlIGRpc3BsYXlOYW1lIHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggaGVscHMgd2hlbiBsb29raW5nXG4gICAgICAgICAgICAvLyBhdCBwcm9maWxpbmcgdG9vbHMuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmIHNwZWMuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgcHJvdG9bbmFtZV0uZGlzcGxheU5hbWUgPSBzcGVjLmRpc3BsYXlOYW1lICsgJ18nICsgbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgaWYgKCFzdGF0aWNzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAodmFyIG5hbWUgaW4gc3RhdGljcykge1xuICAgIHZhciBwcm9wZXJ0eSA9IHN0YXRpY3NbbmFtZV07XG4gICAgaWYgKCFzdGF0aWNzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNSZXNlcnZlZCA9IG5hbWUgaW4gUkVTRVJWRURfU1BFQ19LRVlTO1xuICAgICEhaXNSZXNlcnZlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGEgcmVzZXJ2ZWQgcHJvcGVydHksIGAlc2AsIHRoYXQgc2hvdWxkblxcJ3QgYmUgb24gdGhlIFwic3RhdGljc1wiIGtleS4gRGVmaW5lIGl0IGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IGluc3RlYWQ7IGl0IHdpbGwgc3RpbGwgYmUgYWNjZXNzaWJsZSBvbiB0aGUgY29uc3RydWN0b3IuJywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzgnLCBuYW1lKSA6IHZvaWQgMDtcblxuICAgIHZhciBpc0luaGVyaXRlZCA9IG5hbWUgaW4gQ29uc3RydWN0b3I7XG4gICAgISFpc0luaGVyaXRlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGAlc2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc5JywgbmFtZSkgOiB2b2lkIDA7XG4gICAgQ29uc3RydWN0b3JbbmFtZV0gPSBwcm9wZXJ0eTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIHR3byBvYmplY3RzLCBidXQgdGhyb3cgaWYgYm90aCBjb250YWluIHRoZSBzYW1lIGtleS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb25lIFRoZSBmaXJzdCBvYmplY3QsIHdoaWNoIGlzIG11dGF0ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gdHdvIFRoZSBzZWNvbmQgb2JqZWN0XG4gKiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNvbnRhaW4gZXZlcnl0aGluZyBpbiB0d28uXG4gKi9cbmZ1bmN0aW9uIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMob25lLCB0d28pIHtcbiAgIShvbmUgJiYgdHdvICYmIHR5cGVvZiBvbmUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0d28gPT09ICdvYmplY3QnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6IENhbm5vdCBtZXJnZSBub24tb2JqZWN0cy4nKSA6IF9wcm9kSW52YXJpYW50KCc4MCcpIDogdm9pZCAwO1xuXG4gIGZvciAodmFyIGtleSBpbiB0d28pIHtcbiAgICBpZiAodHdvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICEob25lW2tleV0gPT09IHVuZGVmaW5lZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBUcmllZCB0byBtZXJnZSB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGtleTogYCVzYC4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW47IGluIHBhcnRpY3VsYXIsIHRoaXMgbWF5IGJlIGNhdXNlZCBieSB0d28gZ2V0SW5pdGlhbFN0YXRlKCkgb3IgZ2V0RGVmYXVsdFByb3BzKCkgbWV0aG9kcyByZXR1cm5pbmcgb2JqZWN0cyB3aXRoIGNsYXNoaW5nIGtleXMuJywga2V5KSA6IF9wcm9kSW52YXJpYW50KCc4MScsIGtleSkgOiB2b2lkIDA7XG4gICAgICBvbmVba2V5XSA9IHR3b1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb25lO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgbWVyZ2VzIHRoZWlyIHJldHVybiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRvIGludm9rZSBmaXJzdC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICogQHJldHVybiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgdHdvIGFyZ3VtZW50IGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKG9uZSwgdHdvKSB7XG4gIHJldHVybiBmdW5jdGlvbiBtZXJnZWRSZXN1bHQoKSB7XG4gICAgdmFyIGEgPSBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB2YXIgYiA9IHR3by5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChhID09IG51bGwpIHtcbiAgICAgIHJldHVybiBiO1xuICAgIH0gZWxzZSBpZiAoYiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgdmFyIGMgPSB7fTtcbiAgICBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKGMsIGEpO1xuICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYik7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28gZnVuY3Rpb25zIGFuZCBpZ25vcmVzIHRoZWlyIHJldHVybiB2YWxlcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbmUgRnVuY3Rpb24gdG8gaW52b2tlIGZpcnN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHdvIEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKG9uZSwgdHdvKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7XG4gICAgb25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8qKlxuICogQmluZHMgYSBtZXRob2QgdG8gdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWV0aG9kIHRvIGJlIGJvdW5kLlxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBib3VuZCBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIGJpbmRBdXRvQmluZE1ldGhvZChjb21wb25lbnQsIG1ldGhvZCkge1xuICB2YXIgYm91bmRNZXRob2QgPSBtZXRob2QuYmluZChjb21wb25lbnQpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7XG4gICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kO1xuICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IG51bGw7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuY29uc3RydWN0b3IuZGlzcGxheU5hbWU7XG4gICAgdmFyIF9iaW5kID0gYm91bmRNZXRob2QuYmluZDtcbiAgICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24gKG5ld1RoaXMpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlciBpcyB0cnlpbmcgdG8gYmluZCgpIGFuIGF1dG9ib3VuZCBtZXRob2Q7IHdlIGVmZmVjdGl2ZWx5IHdpbGxcbiAgICAgIC8vIGlnbm9yZSB0aGUgdmFsdWUgb2YgXCJ0aGlzXCIgdGhhdCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gdXNlLCBzb1xuICAgICAgLy8gbGV0J3Mgd2Fybi5cbiAgICAgIGlmIChuZXdUaGlzICE9PSBjb21wb25lbnQgJiYgbmV3VGhpcyAhPT0gbnVsbCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2JpbmQoKTogUmVhY3QgY29tcG9uZW50IG1ldGhvZHMgbWF5IG9ubHkgYmUgYm91bmQgdG8gdGhlICcgKyAnY29tcG9uZW50IGluc3RhbmNlLiBTZWUgJXMnLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSBpZiAoIWFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYmluZCgpOiBZb3UgYXJlIGJpbmRpbmcgYSBjb21wb25lbnQgbWV0aG9kIHRvIHRoZSBjb21wb25lbnQuICcgKyAnUmVhY3QgZG9lcyB0aGlzIGZvciB5b3UgYXV0b21hdGljYWxseSBpbiBhIGhpZ2gtcGVyZm9ybWFuY2UgJyArICd3YXksIHNvIHlvdSBjYW4gc2FmZWx5IHJlbW92ZSB0aGlzIGNhbGwuIFNlZSAlcycsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwO1xuICAgICAgICByZXR1cm4gYm91bmRNZXRob2Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVib3VuZE1ldGhvZCA9IF9iaW5kLmFwcGx5KGJvdW5kTWV0aG9kLCBhcmd1bWVudHMpO1xuICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRDb250ZXh0ID0gY29tcG9uZW50O1xuICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRNZXRob2QgPSBtZXRob2Q7XG4gICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICByZXR1cm4gcmVib3VuZE1ldGhvZDtcbiAgICB9O1xuICB9XG4gIHJldHVybiBib3VuZE1ldGhvZDtcbn1cblxuLyoqXG4gKiBCaW5kcyBhbGwgYXV0by1ib3VuZCBtZXRob2RzIGluIGEgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IHdob3NlIG1ldGhvZCBpcyBnb2luZyB0byBiZSBib3VuZC5cbiAqL1xuZnVuY3Rpb24gYmluZEF1dG9CaW5kTWV0aG9kcyhjb21wb25lbnQpIHtcbiAgdmFyIHBhaXJzID0gY29tcG9uZW50Ll9fcmVhY3RBdXRvQmluZFBhaXJzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGF1dG9CaW5kS2V5ID0gcGFpcnNbaV07XG4gICAgdmFyIG1ldGhvZCA9IHBhaXJzW2kgKyAxXTtcbiAgICBjb21wb25lbnRbYXV0b0JpbmRLZXldID0gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBtb3JlIHRvIHRoZSBSZWFjdENsYXNzIGJhc2UgY2xhc3MuIFRoZXNlIGFyZSBhbGwgbGVnYWN5IGZlYXR1cmVzIGFuZFxuICogdGhlcmVmb3JlIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIG1vZGVybiBSZWFjdENvbXBvbmVudC5cbiAqL1xudmFyIFJlYWN0Q2xhc3NNaXhpbiA9IHtcblxuICAvKipcbiAgICogVE9ETzogVGhpcyB3aWxsIGJlIGRlcHJlY2F0ZWQgYmVjYXVzZSBzdGF0ZSBzaG91bGQgYWx3YXlzIGtlZXAgYSBjb25zaXN0ZW50XG4gICAqIHR5cGUgc2lnbmF0dXJlIGFuZCB0aGUgb25seSB1c2UgY2FzZSBmb3IgdGhpcywgaXMgdG8gYXZvaWQgdGhhdC5cbiAgICovXG4gIHJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKG5ld1N0YXRlLCBjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKHRoaXMsIG5ld1N0YXRlKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVyLmlzTW91bnRlZCh0aGlzKTtcbiAgfVxufTtcblxudmFyIFJlYWN0Q2xhc3NDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7fTtcbl9hc3NpZ24oUmVhY3RDbGFzc0NvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RDbGFzc01peGluKTtcblxuLyoqXG4gKiBNb2R1bGUgZm9yIGNyZWF0aW5nIGNvbXBvc2l0ZSBjb21wb25lbnRzLlxuICpcbiAqIEBjbGFzcyBSZWFjdENsYXNzXG4gKi9cbnZhciBSZWFjdENsYXNzID0ge1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcG9zaXRlIGNvbXBvbmVudCBjbGFzcyBnaXZlbiBhIGNsYXNzIHNwZWNpZmljYXRpb24uXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jcmVhdGVjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3BlYyBDbGFzcyBzcGVjaWZpY2F0aW9uICh3aGljaCBtdXN0IGRlZmluZSBgcmVuZGVyYCkuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBDb21wb25lbnQgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNyZWF0ZUNsYXNzOiBmdW5jdGlvbiAoc3BlYykge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBnZXRzIG92ZXJyaWRkZW4gYnkgbW9ja3MuIFRoZSBhcmd1bWVudCBpcyB1c2VkXG4gICAgICAvLyBieSBtb2NrcyB0byBhc3NlcnQgb24gd2hhdCBnZXRzIG1vdW50ZWQuXG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHRoaXMgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvciwgJ1NvbWV0aGluZyBpcyBjYWxsaW5nIGEgUmVhY3QgY29tcG9uZW50IGRpcmVjdGx5LiBVc2UgYSBmYWN0b3J5IG9yICcgKyAnSlNYIGluc3RlYWQuIFNlZTogaHR0cHM6Ly9mYi5tZS9yZWFjdC1sZWdhY3lmYWN0b3J5JykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgYXV0by1iaW5kaW5nXG4gICAgICBpZiAodGhpcy5fX3JlYWN0QXV0b0JpbmRQYWlycy5sZW5ndGgpIHtcbiAgICAgICAgYmluZEF1dG9CaW5kTWV0aG9kcyh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAgICAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcblxuICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7XG5cbiAgICAgIC8vIFJlYWN0Q2xhc3NlcyBkb2Vzbid0IGhhdmUgY29uc3RydWN0b3JzLiBJbnN0ZWFkLCB0aGV5IHVzZSB0aGVcbiAgICAgIC8vIGdldEluaXRpYWxTdGF0ZSBhbmQgY29tcG9uZW50V2lsbE1vdW50IG1ldGhvZHMgZm9yIGluaXRpYWxpemF0aW9uLlxuXG4gICAgICB2YXIgaW5pdGlhbFN0YXRlID0gdGhpcy5nZXRJbml0aWFsU3RhdGUgPyB0aGlzLmdldEluaXRpYWxTdGF0ZSgpIDogbnVsbDtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIC8vIFdlIGFsbG93IGF1dG8tbW9ja3MgdG8gcHJvY2VlZCBhcyBpZiB0aGV5J3JlIHJldHVybmluZyBudWxsLlxuICAgICAgICBpZiAoaW5pdGlhbFN0YXRlID09PSB1bmRlZmluZWQgJiYgdGhpcy5nZXRJbml0aWFsU3RhdGUuX2lzTW9ja0Z1bmN0aW9uKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBiYWQgcHJhY3RpY2UuIENvbnNpZGVyIHdhcm5pbmcgaGVyZSBhbmRcbiAgICAgICAgICAvLyBkZXByZWNhdGluZyB0aGlzIGNvbnZlbmllbmNlLlxuICAgICAgICAgIGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICEodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0SW5pdGlhbFN0YXRlKCk6IG11c3QgcmV0dXJuIGFuIG9iamVjdCBvciBudWxsJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnODInLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB9O1xuICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG5ldyBSZWFjdENsYXNzQ29tcG9uZW50KCk7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlLl9fcmVhY3RBdXRvQmluZFBhaXJzID0gW107XG5cbiAgICBpbmplY3RlZE1peGlucy5mb3JFYWNoKG1peFNwZWNJbnRvQ29tcG9uZW50LmJpbmQobnVsbCwgQ29uc3RydWN0b3IpKTtcblxuICAgIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzcGVjKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHRQcm9wcyBwcm9wZXJ0eSBhZnRlciBhbGwgbWl4aW5zIGhhdmUgYmVlbiBtZXJnZWQuXG4gICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgQ29uc3RydWN0b3IuZGVmYXVsdFByb3BzID0gQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSB0YWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIHRoZXNlIG1ldGhvZCBuYW1lcyBpcyBvayxcbiAgICAgIC8vIHNpbmNlIGl0J3MgdXNlZCB3aXRoIGNyZWF0ZUNsYXNzLiBJZiBpdCdzIG5vdCwgdGhlbiBpdCdzIGxpa2VseSBhXG4gICAgICAvLyBtaXN0YWtlIHNvIHdlJ2xsIHdhcm4geW91IHRvIHVzZSB0aGUgc3RhdGljIHByb3BlcnR5LCBwcm9wZXJ0eVxuICAgICAgLy8gaW5pdGlhbGl6ZXIgb3IgY29uc3RydWN0b3IgcmVzcGVjdGl2ZWx5LlxuICAgICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLnJlbmRlciA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdjcmVhdGVDbGFzcyguLi4pOiBDbGFzcyBzcGVjaWZpY2F0aW9uIG11c3QgaW1wbGVtZW50IGEgYHJlbmRlcmAgbWV0aG9kLicpIDogX3Byb2RJbnZhcmlhbnQoJzgzJykgOiB2b2lkIDA7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21wb25lbnRTaG91bGRVcGRhdGUsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIC8vIFJlZHVjZSB0aW1lIHNwZW50IGRvaW5nIGxvb2t1cHMgYnkgc2V0dGluZyB0aGVzZSBvbiB0aGUgcHJvdG90eXBlLlxuICAgIGZvciAodmFyIG1ldGhvZE5hbWUgaW4gUmVhY3RDbGFzc0ludGVyZmFjZSkge1xuICAgICAgaWYgKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiB7XG4gICAgaW5qZWN0TWl4aW46IGZ1bmN0aW9uIChtaXhpbikge1xuICAgICAgaW5qZWN0ZWRNaXhpbnMucHVzaChtaXhpbik7XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDbGFzczsiXX0= | |
| },{"./ReactComponent":7,"./ReactElement":11,"./ReactNoopUpdateQueue":13,"./ReactPropTypeLocationNames":14,"./ReactPropTypeLocations":15,"./reactProdInvariant":24,"_process":1,"fbjs/lib/emptyObject":27,"fbjs/lib/invariant":28,"fbjs/lib/keyMirror":29,"fbjs/lib/keyOf":30,"fbjs/lib/warning":31,"object-assign":32}],7:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactComponent | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue'); | |
| var canDefineProperty = require('./canDefineProperty'); | |
| var emptyObject = require('fbjs/lib/emptyObject'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| var warning = require('fbjs/lib/warning'); | |
| /** | |
| * Base class helpers for the updating state of a component. | |
| */ | |
| function ReactComponent(props, context, updater) { | |
| this.props = props; | |
| this.context = context; | |
| this.refs = emptyObject; | |
| // We initialize the default updater but the real one gets injected by the | |
| // renderer. | |
| this.updater = updater || ReactNoopUpdateQueue; | |
| } | |
| ReactComponent.prototype.isReactComponent = {}; | |
| /** | |
| * Sets a subset of the state. Always use this to mutate | |
| * state. You should treat `this.state` as immutable. | |
| * | |
| * There is no guarantee that `this.state` will be immediately updated, so | |
| * accessing `this.state` after calling this method may return the old value. | |
| * | |
| * There is no guarantee that calls to `setState` will run synchronously, | |
| * as they may eventually be batched together. You can provide an optional | |
| * callback that will be executed when the call to setState is actually | |
| * completed. | |
| * | |
| * When a function is provided to setState, it will be called at some point in | |
| * the future (not synchronously). It will be called with the up to date | |
| * component arguments (state, props, context). These values can be different | |
| * from this.* because your function may be called after receiveProps but before | |
| * shouldComponentUpdate, and this new state, props, and context will not yet be | |
| * assigned to this. | |
| * | |
| * @param {object|function} partialState Next partial state or function to | |
| * produce next partial state to be merged with current state. | |
| * @param {?function} callback Called after state is updated. | |
| * @final | |
| * @protected | |
| */ | |
| ReactComponent.prototype.setState = function (partialState, callback) { | |
| !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : _prodInvariant('85') : void 0; | |
| this.updater.enqueueSetState(this, partialState); | |
| if (callback) { | |
| this.updater.enqueueCallback(this, callback, 'setState'); | |
| } | |
| }; | |
| /** | |
| * Forces an update. This should only be invoked when it is known with | |
| * certainty that we are **not** in a DOM transaction. | |
| * | |
| * You may want to call this when you know that some deeper aspect of the | |
| * component's state has changed but `setState` was not called. | |
| * | |
| * This will not invoke `shouldComponentUpdate`, but it will invoke | |
| * `componentWillUpdate` and `componentDidUpdate`. | |
| * | |
| * @param {?function} callback Called after update is complete. | |
| * @final | |
| * @protected | |
| */ | |
| ReactComponent.prototype.forceUpdate = function (callback) { | |
| this.updater.enqueueForceUpdate(this); | |
| if (callback) { | |
| this.updater.enqueueCallback(this, callback, 'forceUpdate'); | |
| } | |
| }; | |
| /** | |
| * Deprecated APIs. These APIs used to exist on classic React classes but since | |
| * we would like to deprecate them, we're not going to move them over to this | |
| * modern base class. Instead, we define a getter that warns if it's accessed. | |
| */ | |
| if (process.env.NODE_ENV !== 'production') { | |
| var deprecatedAPIs = { | |
| isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], | |
| replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] | |
| }; | |
| var defineDeprecationWarning = function (methodName, info) { | |
| if (canDefineProperty) { | |
| Object.defineProperty(ReactComponent.prototype, methodName, { | |
| get: function () { | |
| process.env.NODE_ENV !== 'production' ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : void 0; | |
| return undefined; | |
| } | |
| }); | |
| } | |
| }; | |
| for (var fnName in deprecatedAPIs) { | |
| if (deprecatedAPIs.hasOwnProperty(fnName)) { | |
| defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); | |
| } | |
| } | |
| } | |
| module.exports = ReactComponent; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdENvbXBvbmVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBSZWFjdENvbXBvbmVudFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIFJlYWN0Q29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuXG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4nKSA6IF9wcm9kSW52YXJpYW50KCc4NScpIDogdm9pZCAwO1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSk7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyk7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICB9XG59O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50OyJdfQ== | |
| },{"./ReactNoopUpdateQueue":13,"./canDefineProperty":20,"./reactProdInvariant":24,"_process":1,"fbjs/lib/emptyObject":27,"fbjs/lib/invariant":28,"fbjs/lib/warning":31}],8:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2016-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactComponentTreeHook | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var ReactCurrentOwner = require('./ReactCurrentOwner'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| var warning = require('fbjs/lib/warning'); | |
| function isNative(fn) { | |
| // Based on isNative() from Lodash | |
| var funcToString = Function.prototype.toString; | |
| var hasOwnProperty = Object.prototype.hasOwnProperty; | |
| var reIsNative = RegExp('^' + funcToString | |
| // Take an example native function source for comparison | |
| .call(hasOwnProperty) | |
| // Strip regex characters so we can use it for regex | |
| .replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') | |
| // Remove hasOwnProperty from the template to make it generic | |
| .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'); | |
| try { | |
| var source = funcToString.call(fn); | |
| return reIsNative.test(source); | |
| } catch (err) { | |
| return false; | |
| } | |
| } | |
| var canUseCollections = | |
| // Array.from | |
| typeof Array.from === 'function' && | |
| // Map | |
| typeof Map === 'function' && isNative(Map) && | |
| // Map.prototype.keys | |
| Map.prototype != null && typeof Map.prototype.keys === 'function' && isNative(Map.prototype.keys) && | |
| // Set | |
| typeof Set === 'function' && isNative(Set) && | |
| // Set.prototype.keys | |
| Set.prototype != null && typeof Set.prototype.keys === 'function' && isNative(Set.prototype.keys); | |
| var itemMap; | |
| var rootIDSet; | |
| var itemByKey; | |
| var rootByKey; | |
| if (canUseCollections) { | |
| itemMap = new Map(); | |
| rootIDSet = new Set(); | |
| } else { | |
| itemByKey = {}; | |
| rootByKey = {}; | |
| } | |
| var unmountedIDs = []; | |
| // Use non-numeric keys to prevent V8 performance issues: | |
| // https://github.com/facebook/react/pull/7232 | |
| function getKeyFromID(id) { | |
| return '.' + id; | |
| } | |
| function getIDFromKey(key) { | |
| return parseInt(key.substr(1), 10); | |
| } | |
| function get(id) { | |
| if (canUseCollections) { | |
| return itemMap.get(id); | |
| } else { | |
| var key = getKeyFromID(id); | |
| return itemByKey[key]; | |
| } | |
| } | |
| function remove(id) { | |
| if (canUseCollections) { | |
| itemMap['delete'](id); | |
| } else { | |
| var key = getKeyFromID(id); | |
| delete itemByKey[key]; | |
| } | |
| } | |
| function create(id, element, parentID) { | |
| var item = { | |
| element: element, | |
| parentID: parentID, | |
| text: null, | |
| childIDs: [], | |
| isMounted: false, | |
| updateCount: 0 | |
| }; | |
| if (canUseCollections) { | |
| itemMap.set(id, item); | |
| } else { | |
| var key = getKeyFromID(id); | |
| itemByKey[key] = item; | |
| } | |
| } | |
| function addRoot(id) { | |
| if (canUseCollections) { | |
| rootIDSet.add(id); | |
| } else { | |
| var key = getKeyFromID(id); | |
| rootByKey[key] = true; | |
| } | |
| } | |
| function removeRoot(id) { | |
| if (canUseCollections) { | |
| rootIDSet['delete'](id); | |
| } else { | |
| var key = getKeyFromID(id); | |
| delete rootByKey[key]; | |
| } | |
| } | |
| function getRegisteredIDs() { | |
| if (canUseCollections) { | |
| return Array.from(itemMap.keys()); | |
| } else { | |
| return Object.keys(itemByKey).map(getIDFromKey); | |
| } | |
| } | |
| function getRootIDs() { | |
| if (canUseCollections) { | |
| return Array.from(rootIDSet.keys()); | |
| } else { | |
| return Object.keys(rootByKey).map(getIDFromKey); | |
| } | |
| } | |
| function purgeDeep(id) { | |
| var item = get(id); | |
| if (item) { | |
| var childIDs = item.childIDs; | |
| remove(id); | |
| childIDs.forEach(purgeDeep); | |
| } | |
| } | |
| function describeComponentFrame(name, source, ownerName) { | |
| return '\n in ' + name + (source ? ' (at ' + source.fileName.replace(/^.*[\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : ''); | |
| } | |
| function getDisplayName(element) { | |
| if (element == null) { | |
| return '#empty'; | |
| } else if (typeof element === 'string' || typeof element === 'number') { | |
| return '#text'; | |
| } else if (typeof element.type === 'string') { | |
| return element.type; | |
| } else { | |
| return element.type.displayName || element.type.name || 'Unknown'; | |
| } | |
| } | |
| function describeID(id) { | |
| var name = ReactComponentTreeHook.getDisplayName(id); | |
| var element = ReactComponentTreeHook.getElement(id); | |
| var ownerID = ReactComponentTreeHook.getOwnerID(id); | |
| var ownerName; | |
| if (ownerID) { | |
| ownerName = ReactComponentTreeHook.getDisplayName(ownerID); | |
| } | |
| process.env.NODE_ENV !== 'production' ? warning(element, 'ReactComponentTreeHook: Missing React element for debugID %s when ' + 'building stack', id) : void 0; | |
| return describeComponentFrame(name, element && element._source, ownerName); | |
| } | |
| var ReactComponentTreeHook = { | |
| onSetChildren: function (id, nextChildIDs) { | |
| var item = get(id); | |
| item.childIDs = nextChildIDs; | |
| for (var i = 0; i < nextChildIDs.length; i++) { | |
| var nextChildID = nextChildIDs[i]; | |
| var nextChild = get(nextChildID); | |
| !nextChild ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected hook events to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('140') : void 0; | |
| !(nextChild.childIDs != null || typeof nextChild.element !== 'object' || nextChild.element == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren().') : _prodInvariant('141') : void 0; | |
| !nextChild.isMounted ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected onMountComponent() to fire for the child before its parent includes it in onSetChildren().') : _prodInvariant('71') : void 0; | |
| if (nextChild.parentID == null) { | |
| nextChild.parentID = id; | |
| // TODO: This shouldn't be necessary but mounting a new root during in | |
| // componentWillMount currently causes not-yet-mounted components to | |
| // be purged from our tree data so their parent ID is missing. | |
| } | |
| !(nextChild.parentID === id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).', nextChildID, nextChild.parentID, id) : _prodInvariant('142', nextChildID, nextChild.parentID, id) : void 0; | |
| } | |
| }, | |
| onBeforeMountComponent: function (id, element, parentID) { | |
| create(id, element, parentID); | |
| }, | |
| onBeforeUpdateComponent: function (id, element) { | |
| var item = get(id); | |
| if (!item || !item.isMounted) { | |
| // We may end up here as a result of setState() in componentWillUnmount(). | |
| // In this case, ignore the element. | |
| return; | |
| } | |
| item.element = element; | |
| }, | |
| onMountComponent: function (id) { | |
| var item = get(id); | |
| item.isMounted = true; | |
| var isRoot = item.parentID === 0; | |
| if (isRoot) { | |
| addRoot(id); | |
| } | |
| }, | |
| onUpdateComponent: function (id) { | |
| var item = get(id); | |
| if (!item || !item.isMounted) { | |
| // We may end up here as a result of setState() in componentWillUnmount(). | |
| // In this case, ignore the element. | |
| return; | |
| } | |
| item.updateCount++; | |
| }, | |
| onUnmountComponent: function (id) { | |
| var item = get(id); | |
| if (item) { | |
| // We need to check if it exists. | |
| // `item` might not exist if it is inside an error boundary, and a sibling | |
| // error boundary child threw while mounting. Then this instance never | |
| // got a chance to mount, but it still gets an unmounting event during | |
| // the error boundary cleanup. | |
| item.isMounted = false; | |
| var isRoot = item.parentID === 0; | |
| if (isRoot) { | |
| removeRoot(id); | |
| } | |
| } | |
| unmountedIDs.push(id); | |
| }, | |
| purgeUnmountedComponents: function () { | |
| if (ReactComponentTreeHook._preventPurging) { | |
| // Should only be used for testing. | |
| return; | |
| } | |
| for (var i = 0; i < unmountedIDs.length; i++) { | |
| var id = unmountedIDs[i]; | |
| purgeDeep(id); | |
| } | |
| unmountedIDs.length = 0; | |
| }, | |
| isMounted: function (id) { | |
| var item = get(id); | |
| return item ? item.isMounted : false; | |
| }, | |
| getCurrentStackAddendum: function (topElement) { | |
| var info = ''; | |
| if (topElement) { | |
| var type = topElement.type; | |
| var name = typeof type === 'function' ? type.displayName || type.name : type; | |
| var owner = topElement._owner; | |
| info += describeComponentFrame(name || 'Unknown', topElement._source, owner && owner.getName()); | |
| } | |
| var currentOwner = ReactCurrentOwner.current; | |
| var id = currentOwner && currentOwner._debugID; | |
| info += ReactComponentTreeHook.getStackAddendumByID(id); | |
| return info; | |
| }, | |
| getStackAddendumByID: function (id) { | |
| var info = ''; | |
| while (id) { | |
| info += describeID(id); | |
| id = ReactComponentTreeHook.getParentID(id); | |
| } | |
| return info; | |
| }, | |
| getChildIDs: function (id) { | |
| var item = get(id); | |
| return item ? item.childIDs : []; | |
| }, | |
| getDisplayName: function (id) { | |
| var element = ReactComponentTreeHook.getElement(id); | |
| if (!element) { | |
| return null; | |
| } | |
| return getDisplayName(element); | |
| }, | |
| getElement: function (id) { | |
| var item = get(id); | |
| return item ? item.element : null; | |
| }, | |
| getOwnerID: function (id) { | |
| var element = ReactComponentTreeHook.getElement(id); | |
| if (!element || !element._owner) { | |
| return null; | |
| } | |
| return element._owner._debugID; | |
| }, | |
| getParentID: function (id) { | |
| var item = get(id); | |
| return item ? item.parentID : null; | |
| }, | |
| getSource: function (id) { | |
| var item = get(id); | |
| var element = item ? item.element : null; | |
| var source = element != null ? element._source : null; | |
| return source; | |
| }, | |
| getText: function (id) { | |
| var element = ReactComponentTreeHook.getElement(id); | |
| if (typeof element === 'string') { | |
| return element; | |
| } else if (typeof element === 'number') { | |
| return '' + element; | |
| } else { | |
| return null; | |
| } | |
| }, | |
| getUpdateCount: function (id) { | |
| var item = get(id); | |
| return item ? item.updateCount : 0; | |
| }, | |
| getRegisteredIDs: getRegisteredIDs, | |
| getRootIDs: getRootIDs | |
| }; | |
| module.exports = ReactComponentTreeHook; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBSZWFjdENvbXBvbmVudFRyZWVIb29rXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiBpc05hdGl2ZShmbikge1xuICAvLyBCYXNlZCBvbiBpc05hdGl2ZSgpIGZyb20gTG9kYXNoXG4gIHZhciBmdW5jVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArIGZ1bmNUb1N0cmluZ1xuICAvLyBUYWtlIGFuIGV4YW1wbGUgbmF0aXZlIGZ1bmN0aW9uIHNvdXJjZSBmb3IgY29tcGFyaXNvblxuICAuY2FsbChoYXNPd25Qcm9wZXJ0eSlcbiAgLy8gU3RyaXAgcmVnZXggY2hhcmFjdGVycyBzbyB3ZSBjYW4gdXNlIGl0IGZvciByZWdleFxuICAucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csICdcXFxcJCYnKVxuICAvLyBSZW1vdmUgaGFzT3duUHJvcGVydHkgZnJvbSB0aGUgdGVtcGxhdGUgdG8gbWFrZSBpdCBnZW5lcmljXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJyk7XG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9IGZ1bmNUb1N0cmluZy5jYWxsKGZuKTtcbiAgICByZXR1cm4gcmVJc05hdGl2ZS50ZXN0KHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG52YXIgY2FuVXNlQ29sbGVjdGlvbnMgPVxuLy8gQXJyYXkuZnJvbVxudHlwZW9mIEFycmF5LmZyb20gPT09ICdmdW5jdGlvbicgJiZcbi8vIE1hcFxudHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShNYXApICYmXG4vLyBNYXAucHJvdG90eXBlLmtleXNcbk1hcC5wcm90b3R5cGUgIT0gbnVsbCAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5rZXlzID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKE1hcC5wcm90b3R5cGUua2V5cykgJiZcbi8vIFNldFxudHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShTZXQpICYmXG4vLyBTZXQucHJvdG90eXBlLmtleXNcblNldC5wcm90b3R5cGUgIT0gbnVsbCAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5rZXlzID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKFNldC5wcm90b3R5cGUua2V5cyk7XG5cbnZhciBpdGVtTWFwO1xudmFyIHJvb3RJRFNldDtcblxudmFyIGl0ZW1CeUtleTtcbnZhciByb290QnlLZXk7XG5cbmlmIChjYW5Vc2VDb2xsZWN0aW9ucykge1xuICBpdGVtTWFwID0gbmV3IE1hcCgpO1xuICByb290SURTZXQgPSBuZXcgU2V0KCk7XG59IGVsc2Uge1xuICBpdGVtQnlLZXkgPSB7fTtcbiAgcm9vdEJ5S2V5ID0ge307XG59XG5cbnZhciB1bm1vdW50ZWRJRHMgPSBbXTtcblxuLy8gVXNlIG5vbi1udW1lcmljIGtleXMgdG8gcHJldmVudCBWOCBwZXJmb3JtYW5jZSBpc3N1ZXM6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MjMyXG5mdW5jdGlvbiBnZXRLZXlGcm9tSUQoaWQpIHtcbiAgcmV0dXJuICcuJyArIGlkO1xufVxuZnVuY3Rpb24gZ2V0SURGcm9tS2V5KGtleSkge1xuICByZXR1cm4gcGFyc2VJbnQoa2V5LnN1YnN0cigxKSwgMTApO1xufVxuXG5mdW5jdGlvbiBnZXQoaWQpIHtcbiAgaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gICAgcmV0dXJuIGl0ZW1NYXAuZ2V0KGlkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICByZXR1cm4gaXRlbUJ5S2V5W2tleV07XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlKGlkKSB7XG4gIGlmIChjYW5Vc2VDb2xsZWN0aW9ucykge1xuICAgIGl0ZW1NYXBbJ2RlbGV0ZSddKGlkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICBkZWxldGUgaXRlbUJ5S2V5W2tleV07XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKGlkLCBlbGVtZW50LCBwYXJlbnRJRCkge1xuICB2YXIgaXRlbSA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgIHBhcmVudElEOiBwYXJlbnRJRCxcbiAgICB0ZXh0OiBudWxsLFxuICAgIGNoaWxkSURzOiBbXSxcbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIHVwZGF0ZUNvdW50OiAwXG4gIH07XG5cbiAgaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gICAgaXRlbU1hcC5zZXQoaWQsIGl0ZW0pO1xuICB9IGVsc2Uge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGl0ZW1CeUtleVtrZXldID0gaXRlbTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRSb290KGlkKSB7XG4gIGlmIChjYW5Vc2VDb2xsZWN0aW9ucykge1xuICAgIHJvb3RJRFNldC5hZGQoaWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIHJvb3RCeUtleVtrZXldID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVSb290KGlkKSB7XG4gIGlmIChjYW5Vc2VDb2xsZWN0aW9ucykge1xuICAgIHJvb3RJRFNldFsnZGVsZXRlJ10oaWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGRlbGV0ZSByb290QnlLZXlba2V5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWdpc3RlcmVkSURzKCkge1xuICBpZiAoY2FuVXNlQ29sbGVjdGlvbnMpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShpdGVtTWFwLmtleXMoKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGl0ZW1CeUtleSkubWFwKGdldElERnJvbUtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Um9vdElEcygpIHtcbiAgaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocm9vdElEU2V0LmtleXMoKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJvb3RCeUtleSkubWFwKGdldElERnJvbUtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVyZ2VEZWVwKGlkKSB7XG4gIHZhciBpdGVtID0gZ2V0KGlkKTtcbiAgaWYgKGl0ZW0pIHtcbiAgICB2YXIgY2hpbGRJRHMgPSBpdGVtLmNoaWxkSURzO1xuXG4gICAgcmVtb3ZlKGlkKTtcbiAgICBjaGlsZElEcy5mb3JFYWNoKHB1cmdlRGVlcCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyTmFtZSkge1xuICByZXR1cm4gJ1xcbiAgICBpbiAnICsgbmFtZSArIChzb3VyY2UgPyAnIChhdCAnICsgc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKSArICc6JyArIHNvdXJjZS5saW5lTnVtYmVyICsgJyknIDogb3duZXJOYW1lID8gJyAoY3JlYXRlZCBieSAnICsgb3duZXJOYW1lICsgJyknIDogJycpO1xufVxuXG5mdW5jdGlvbiBnZXREaXNwbGF5TmFtZShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gJyNlbXB0eSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbGVtZW50ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAnI3RleHQnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudHlwZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZWxlbWVudC50eXBlLmRpc3BsYXlOYW1lIHx8IGVsZW1lbnQudHlwZS5uYW1lIHx8ICdVbmtub3duJztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUlEKGlkKSB7XG4gIHZhciBuYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShpZCk7XG4gIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQoaWQpO1xuICB2YXIgb3duZXJOYW1lO1xuICBpZiAob3duZXJJRCkge1xuICAgIG93bmVyTmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUob3duZXJJRCk7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZWxlbWVudCwgJ1JlYWN0Q29tcG9uZW50VHJlZUhvb2s6IE1pc3NpbmcgUmVhY3QgZWxlbWVudCBmb3IgZGVidWdJRCAlcyB3aGVuICcgKyAnYnVpbGRpbmcgc3RhY2snLCBpZCkgOiB2b2lkIDA7XG4gIHJldHVybiBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIGVsZW1lbnQgJiYgZWxlbWVudC5fc291cmNlLCBvd25lck5hbWUpO1xufVxuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHtcbiAgb25TZXRDaGlsZHJlbjogZnVuY3Rpb24gKGlkLCBuZXh0Q2hpbGRJRHMpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgaXRlbS5jaGlsZElEcyA9IG5leHRDaGlsZElEcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV4dENoaWxkSURzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dENoaWxkSUQgPSBuZXh0Q2hpbGRJRHNbaV07XG4gICAgICB2YXIgbmV4dENoaWxkID0gZ2V0KG5leHRDaGlsZElEKTtcbiAgICAgICFuZXh0Q2hpbGQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgaG9vayBldmVudHMgdG8gZmlyZSBmb3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDAnKSA6IHZvaWQgMDtcbiAgICAgICEobmV4dENoaWxkLmNoaWxkSURzICE9IG51bGwgfHwgdHlwZW9mIG5leHRDaGlsZC5lbGVtZW50ICE9PSAnb2JqZWN0JyB8fCBuZXh0Q2hpbGQuZWxlbWVudCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvblNldENoaWxkcmVuKCkgdG8gZmlyZSBmb3IgYSBjb250YWluZXIgY2hpbGQgYmVmb3JlIGl0cyBwYXJlbnQgaW5jbHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MScpIDogdm9pZCAwO1xuICAgICAgIW5leHRDaGlsZC5pc01vdW50ZWQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25Nb3VudENvbXBvbmVudCgpIHRvIGZpcmUgZm9yIHRoZSBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnNzEnKSA6IHZvaWQgMDtcbiAgICAgIGlmIChuZXh0Q2hpbGQucGFyZW50SUQgPT0gbnVsbCkge1xuICAgICAgICBuZXh0Q2hpbGQucGFyZW50SUQgPSBpZDtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGJ1dCBtb3VudGluZyBhIG5ldyByb290IGR1cmluZyBpblxuICAgICAgICAvLyBjb21wb25lbnRXaWxsTW91bnQgY3VycmVudGx5IGNhdXNlcyBub3QteWV0LW1vdW50ZWQgY29tcG9uZW50cyB0b1xuICAgICAgICAvLyBiZSBwdXJnZWQgZnJvbSBvdXIgdHJlZSBkYXRhIHNvIHRoZWlyIHBhcmVudCBJRCBpcyBtaXNzaW5nLlxuICAgICAgfVxuICAgICAgIShuZXh0Q2hpbGQucGFyZW50SUQgPT09IGlkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbkJlZm9yZU1vdW50Q29tcG9uZW50KCkgcGFyZW50IGFuZCBvblNldENoaWxkcmVuKCkgdG8gYmUgY29uc2lzdGVudCAoJXMgaGFzIHBhcmVudHMgJXMgYW5kICVzKS4nLCBuZXh0Q2hpbGRJRCwgbmV4dENoaWxkLnBhcmVudElELCBpZCkgOiBfcHJvZEludmFyaWFudCgnMTQyJywgbmV4dENoaWxkSUQsIG5leHRDaGlsZC5wYXJlbnRJRCwgaWQpIDogdm9pZCAwO1xuICAgIH1cbiAgfSxcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50LCBwYXJlbnRJRCkge1xuICAgIGNyZWF0ZShpZCwgZWxlbWVudCwgcGFyZW50SUQpO1xuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50KSB7XG4gICAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICAgIGlmICghaXRlbSB8fCAhaXRlbS5pc01vdW50ZWQpIHtcbiAgICAgIC8vIFdlIG1heSBlbmQgdXAgaGVyZSBhcyBhIHJlc3VsdCBvZiBzZXRTdGF0ZSgpIGluIGNvbXBvbmVudFdpbGxVbm1vdW50KCkuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIGlnbm9yZSB0aGUgZWxlbWVudC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbS5lbGVtZW50ID0gZWxlbWVudDtcbiAgfSxcbiAgb25Nb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICAgIGl0ZW0uaXNNb3VudGVkID0gdHJ1ZTtcbiAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICBhZGRSb290KGlkKTtcbiAgICB9XG4gIH0sXG4gIG9uVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgaWYgKCFpdGVtIHx8ICFpdGVtLmlzTW91bnRlZCkge1xuICAgICAgLy8gV2UgbWF5IGVuZCB1cCBoZXJlIGFzIGEgcmVzdWx0IG9mIHNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVubW91bnQoKS5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBlbGVtZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZUNvdW50Kys7XG4gIH0sXG4gIG9uVW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIGl0IGV4aXN0cy5cbiAgICAgIC8vIGBpdGVtYCBtaWdodCBub3QgZXhpc3QgaWYgaXQgaXMgaW5zaWRlIGFuIGVycm9yIGJvdW5kYXJ5LCBhbmQgYSBzaWJsaW5nXG4gICAgICAvLyBlcnJvciBib3VuZGFyeSBjaGlsZCB0aHJldyB3aGlsZSBtb3VudGluZy4gVGhlbiB0aGlzIGluc3RhbmNlIG5ldmVyXG4gICAgICAvLyBnb3QgYSBjaGFuY2UgdG8gbW91bnQsIGJ1dCBpdCBzdGlsbCBnZXRzIGFuIHVubW91bnRpbmcgZXZlbnQgZHVyaW5nXG4gICAgICAvLyB0aGUgZXJyb3IgYm91bmRhcnkgY2xlYW51cC5cbiAgICAgIGl0ZW0uaXNNb3VudGVkID0gZmFsc2U7XG4gICAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDtcbiAgICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgICAgcmVtb3ZlUm9vdChpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHVubW91bnRlZElEcy5wdXNoKGlkKTtcbiAgfSxcbiAgcHVyZ2VVbm1vdW50ZWRDb21wb25lbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKFJlYWN0Q29tcG9uZW50VHJlZUhvb2suX3ByZXZlbnRQdXJnaW5nKSB7XG4gICAgICAvLyBTaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudGVkSURzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWQgPSB1bm1vdW50ZWRJRHNbaV07XG4gICAgICBwdXJnZURlZXAoaWQpO1xuICAgIH1cbiAgICB1bm1vdW50ZWRJRHMubGVuZ3RoID0gMDtcbiAgfSxcbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmlzTW91bnRlZCA6IGZhbHNlO1xuICB9LFxuICBnZXRDdXJyZW50U3RhY2tBZGRlbmR1bTogZnVuY3Rpb24gKHRvcEVsZW1lbnQpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIGlmICh0b3BFbGVtZW50KSB7XG4gICAgICB2YXIgdHlwZSA9IHRvcEVsZW1lbnQudHlwZTtcbiAgICAgIHZhciBuYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSA6IHR5cGU7XG4gICAgICB2YXIgb3duZXIgPSB0b3BFbGVtZW50Ll9vd25lcjtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lIHx8ICdVbmtub3duJywgdG9wRWxlbWVudC5fc291cmNlLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkpO1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50T3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIHZhciBpZCA9IGN1cnJlbnRPd25lciAmJiBjdXJyZW50T3duZXIuX2RlYnVnSUQ7XG5cbiAgICBpbmZvICs9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoaWQpO1xuICAgIHJldHVybiBpbmZvO1xuICB9LFxuICBnZXRTdGFja0FkZGVuZHVtQnlJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB3aGlsZSAoaWQpIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVJRChpZCk7XG4gICAgICBpZCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfSxcbiAgZ2V0Q2hpbGRJRHM6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0KGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uY2hpbGRJRHMgOiBbXTtcbiAgfSxcbiAgZ2V0RGlzcGxheU5hbWU6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoZWxlbWVudCk7XG4gIH0sXG4gIGdldEVsZW1lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0KGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uZWxlbWVudCA6IG51bGw7XG4gIH0sXG4gIGdldE93bmVySUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuX293bmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQuX293bmVyLl9kZWJ1Z0lEO1xuICB9LFxuICBnZXRQYXJlbnRJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5wYXJlbnRJRCA6IG51bGw7XG4gIH0sXG4gIGdldFNvdXJjZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbSA/IGl0ZW0uZWxlbWVudCA6IG51bGw7XG4gICAgdmFyIHNvdXJjZSA9IGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQuX3NvdXJjZSA6IG51bGw7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSxcbiAgZ2V0VGV4dDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gJycgKyBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGdldFVwZGF0ZUNvdW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLnVwZGF0ZUNvdW50IDogMDtcbiAgfSxcblxuXG4gIGdldFJlZ2lzdGVyZWRJRHM6IGdldFJlZ2lzdGVyZWRJRHMsXG5cbiAgZ2V0Um9vdElEczogZ2V0Um9vdElEc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rOyJdfQ== | |
| },{"./ReactCurrentOwner":9,"./reactProdInvariant":24,"_process":1,"fbjs/lib/invariant":28,"fbjs/lib/warning":31}],9:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactCurrentOwner | |
| */ | |
| 'use strict'; | |
| /** | |
| * Keeps track of the current owner. | |
| * | |
| * The current owner is the component who should own any components that are | |
| * currently being constructed. | |
| */ | |
| var ReactCurrentOwner = { | |
| /** | |
| * @internal | |
| * @type {ReactComponent} | |
| */ | |
| current: null | |
| }; | |
| module.exports = ReactCurrentOwner; | |
| },{}],10:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactDOMFactories | |
| */ | |
| 'use strict'; | |
| var ReactElement = require('./ReactElement'); | |
| /** | |
| * Create a factory that creates HTML tag elements. | |
| * | |
| * @private | |
| */ | |
| var createDOMFactory = ReactElement.createFactory; | |
| if (process.env.NODE_ENV !== 'production') { | |
| var ReactElementValidator = require('./ReactElementValidator'); | |
| createDOMFactory = ReactElementValidator.createFactory; | |
| } | |
| /** | |
| * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes. | |
| * This is also accessible via `React.DOM`. | |
| * | |
| * @public | |
| */ | |
| var ReactDOMFactories = { | |
| a: createDOMFactory('a'), | |
| abbr: createDOMFactory('abbr'), | |
| address: createDOMFactory('address'), | |
| area: createDOMFactory('area'), | |
| article: createDOMFactory('article'), | |
| aside: createDOMFactory('aside'), | |
| audio: createDOMFactory('audio'), | |
| b: createDOMFactory('b'), | |
| base: createDOMFactory('base'), | |
| bdi: createDOMFactory('bdi'), | |
| bdo: createDOMFactory('bdo'), | |
| big: createDOMFactory('big'), | |
| blockquote: createDOMFactory('blockquote'), | |
| body: createDOMFactory('body'), | |
| br: createDOMFactory('br'), | |
| button: createDOMFactory('button'), | |
| canvas: createDOMFactory('canvas'), | |
| caption: createDOMFactory('caption'), | |
| cite: createDOMFactory('cite'), | |
| code: createDOMFactory('code'), | |
| col: createDOMFactory('col'), | |
| colgroup: createDOMFactory('colgroup'), | |
| data: createDOMFactory('data'), | |
| datalist: createDOMFactory('datalist'), | |
| dd: createDOMFactory('dd'), | |
| del: createDOMFactory('del'), | |
| details: createDOMFactory('details'), | |
| dfn: createDOMFactory('dfn'), | |
| dialog: createDOMFactory('dialog'), | |
| div: createDOMFactory('div'), | |
| dl: createDOMFactory('dl'), | |
| dt: createDOMFactory('dt'), | |
| em: createDOMFactory('em'), | |
| embed: createDOMFactory('embed'), | |
| fieldset: createDOMFactory('fieldset'), | |
| figcaption: createDOMFactory('figcaption'), | |
| figure: createDOMFactory('figure'), | |
| footer: createDOMFactory('footer'), | |
| form: createDOMFactory('form'), | |
| h1: createDOMFactory('h1'), | |
| h2: createDOMFactory('h2'), | |
| h3: createDOMFactory('h3'), | |
| h4: createDOMFactory('h4'), | |
| h5: createDOMFactory('h5'), | |
| h6: createDOMFactory('h6'), | |
| head: createDOMFactory('head'), | |
| header: createDOMFactory('header'), | |
| hgroup: createDOMFactory('hgroup'), | |
| hr: createDOMFactory('hr'), | |
| html: createDOMFactory('html'), | |
| i: createDOMFactory('i'), | |
| iframe: createDOMFactory('iframe'), | |
| img: createDOMFactory('img'), | |
| input: createDOMFactory('input'), | |
| ins: createDOMFactory('ins'), | |
| kbd: createDOMFactory('kbd'), | |
| keygen: createDOMFactory('keygen'), | |
| label: createDOMFactory('label'), | |
| legend: createDOMFactory('legend'), | |
| li: createDOMFactory('li'), | |
| link: createDOMFactory('link'), | |
| main: createDOMFactory('main'), | |
| map: createDOMFactory('map'), | |
| mark: createDOMFactory('mark'), | |
| menu: createDOMFactory('menu'), | |
| menuitem: createDOMFactory('menuitem'), | |
| meta: createDOMFactory('meta'), | |
| meter: createDOMFactory('meter'), | |
| nav: createDOMFactory('nav'), | |
| noscript: createDOMFactory('noscript'), | |
| object: createDOMFactory('object'), | |
| ol: createDOMFactory('ol'), | |
| optgroup: createDOMFactory('optgroup'), | |
| option: createDOMFactory('option'), | |
| output: createDOMFactory('output'), | |
| p: createDOMFactory('p'), | |
| param: createDOMFactory('param'), | |
| picture: createDOMFactory('picture'), | |
| pre: createDOMFactory('pre'), | |
| progress: createDOMFactory('progress'), | |
| q: createDOMFactory('q'), | |
| rp: createDOMFactory('rp'), | |
| rt: createDOMFactory('rt'), | |
| ruby: createDOMFactory('ruby'), | |
| s: createDOMFactory('s'), | |
| samp: createDOMFactory('samp'), | |
| script: createDOMFactory('script'), | |
| section: createDOMFactory('section'), | |
| select: createDOMFactory('select'), | |
| small: createDOMFactory('small'), | |
| source: createDOMFactory('source'), | |
| span: createDOMFactory('span'), | |
| strong: createDOMFactory('strong'), | |
| style: createDOMFactory('style'), | |
| sub: createDOMFactory('sub'), | |
| summary: createDOMFactory('summary'), | |
| sup: createDOMFactory('sup'), | |
| table: createDOMFactory('table'), | |
| tbody: createDOMFactory('tbody'), | |
| td: createDOMFactory('td'), | |
| textarea: createDOMFactory('textarea'), | |
| tfoot: createDOMFactory('tfoot'), | |
| th: createDOMFactory('th'), | |
| thead: createDOMFactory('thead'), | |
| time: createDOMFactory('time'), | |
| title: createDOMFactory('title'), | |
| tr: createDOMFactory('tr'), | |
| track: createDOMFactory('track'), | |
| u: createDOMFactory('u'), | |
| ul: createDOMFactory('ul'), | |
| 'var': createDOMFactory('var'), | |
| video: createDOMFactory('video'), | |
| wbr: createDOMFactory('wbr'), | |
| // SVG | |
| circle: createDOMFactory('circle'), | |
| clipPath: createDOMFactory('clipPath'), | |
| defs: createDOMFactory('defs'), | |
| ellipse: createDOMFactory('ellipse'), | |
| g: createDOMFactory('g'), | |
| image: createDOMFactory('image'), | |
| line: createDOMFactory('line'), | |
| linearGradient: createDOMFactory('linearGradient'), | |
| mask: createDOMFactory('mask'), | |
| path: createDOMFactory('path'), | |
| pattern: createDOMFactory('pattern'), | |
| polygon: createDOMFactory('polygon'), | |
| polyline: createDOMFactory('polyline'), | |
| radialGradient: createDOMFactory('radialGradient'), | |
| rect: createDOMFactory('rect'), | |
| stop: createDOMFactory('stop'), | |
| svg: createDOMFactory('svg'), | |
| text: createDOMFactory('text'), | |
| tspan: createDOMFactory('tspan') | |
| }; | |
| module.exports = ReactDOMFactories; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdERPTUZhY3Rvcmllcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0RE9NRmFjdG9yaWVzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBIVE1MIHRhZyBlbGVtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgY3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50VmFsaWRhdG9yJyk7XG4gIGNyZWF0ZURPTUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwcGluZyBmcm9tIHN1cHBvcnRlZCBIVE1MIHRhZ3MgdG8gYFJlYWN0RE9NQ29tcG9uZW50YCBjbGFzc2VzLlxuICogVGhpcyBpcyBhbHNvIGFjY2Vzc2libGUgdmlhIGBSZWFjdC5ET01gLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xudmFyIFJlYWN0RE9NRmFjdG9yaWVzID0ge1xuICBhOiBjcmVhdGVET01GYWN0b3J5KCdhJyksXG4gIGFiYnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2FiYnInKSxcbiAgYWRkcmVzczogY3JlYXRlRE9NRmFjdG9yeSgnYWRkcmVzcycpLFxuICBhcmVhOiBjcmVhdGVET01GYWN0b3J5KCdhcmVhJyksXG4gIGFydGljbGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FydGljbGUnKSxcbiAgYXNpZGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FzaWRlJyksXG4gIGF1ZGlvOiBjcmVhdGVET01GYWN0b3J5KCdhdWRpbycpLFxuICBiOiBjcmVhdGVET01GYWN0b3J5KCdiJyksXG4gIGJhc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2Jhc2UnKSxcbiAgYmRpOiBjcmVhdGVET01GYWN0b3J5KCdiZGknKSxcbiAgYmRvOiBjcmVhdGVET01GYWN0b3J5KCdiZG8nKSxcbiAgYmlnOiBjcmVhdGVET01GYWN0b3J5KCdiaWcnKSxcbiAgYmxvY2txdW90ZTogY3JlYXRlRE9NRmFjdG9yeSgnYmxvY2txdW90ZScpLFxuICBib2R5OiBjcmVhdGVET01GYWN0b3J5KCdib2R5JyksXG4gIGJyOiBjcmVhdGVET01GYWN0b3J5KCdicicpLFxuICBidXR0b246IGNyZWF0ZURPTUZhY3RvcnkoJ2J1dHRvbicpLFxuICBjYW52YXM6IGNyZWF0ZURPTUZhY3RvcnkoJ2NhbnZhcycpLFxuICBjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdjYXB0aW9uJyksXG4gIGNpdGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NpdGUnKSxcbiAgY29kZTogY3JlYXRlRE9NRmFjdG9yeSgnY29kZScpLFxuICBjb2w6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvbCcpLFxuICBjb2xncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnY29sZ3JvdXAnKSxcbiAgZGF0YTogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YScpLFxuICBkYXRhbGlzdDogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YWxpc3QnKSxcbiAgZGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2RkJyksXG4gIGRlbDogY3JlYXRlRE9NRmFjdG9yeSgnZGVsJyksXG4gIGRldGFpbHM6IGNyZWF0ZURPTUZhY3RvcnkoJ2RldGFpbHMnKSxcbiAgZGZuOiBjcmVhdGVET01GYWN0b3J5KCdkZm4nKSxcbiAgZGlhbG9nOiBjcmVhdGVET01GYWN0b3J5KCdkaWFsb2cnKSxcbiAgZGl2OiBjcmVhdGVET01GYWN0b3J5KCdkaXYnKSxcbiAgZGw6IGNyZWF0ZURPTUZhY3RvcnkoJ2RsJyksXG4gIGR0OiBjcmVhdGVET01GYWN0b3J5KCdkdCcpLFxuICBlbTogY3JlYXRlRE9NRmFjdG9yeSgnZW0nKSxcbiAgZW1iZWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2VtYmVkJyksXG4gIGZpZWxkc2V0OiBjcmVhdGVET01GYWN0b3J5KCdmaWVsZHNldCcpLFxuICBmaWdjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdmaWdjYXB0aW9uJyksXG4gIGZpZ3VyZTogY3JlYXRlRE9NRmFjdG9yeSgnZmlndXJlJyksXG4gIGZvb3RlcjogY3JlYXRlRE9NRmFjdG9yeSgnZm9vdGVyJyksXG4gIGZvcm06IGNyZWF0ZURPTUZhY3RvcnkoJ2Zvcm0nKSxcbiAgaDE6IGNyZWF0ZURPTUZhY3RvcnkoJ2gxJyksXG4gIGgyOiBjcmVhdGVET01GYWN0b3J5KCdoMicpLFxuICBoMzogY3JlYXRlRE9NRmFjdG9yeSgnaDMnKSxcbiAgaDQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2g0JyksXG4gIGg1OiBjcmVhdGVET01GYWN0b3J5KCdoNScpLFxuICBoNjogY3JlYXRlRE9NRmFjdG9yeSgnaDYnKSxcbiAgaGVhZDogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZCcpLFxuICBoZWFkZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ2hlYWRlcicpLFxuICBoZ3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ2hncm91cCcpLFxuICBocjogY3JlYXRlRE9NRmFjdG9yeSgnaHInKSxcbiAgaHRtbDogY3JlYXRlRE9NRmFjdG9yeSgnaHRtbCcpLFxuICBpOiBjcmVhdGVET01GYWN0b3J5KCdpJyksXG4gIGlmcmFtZTogY3JlYXRlRE9NRmFjdG9yeSgnaWZyYW1lJyksXG4gIGltZzogY3JlYXRlRE9NRmFjdG9yeSgnaW1nJyksXG4gIGlucHV0OiBjcmVhdGVET01GYWN0b3J5KCdpbnB1dCcpLFxuICBpbnM6IGNyZWF0ZURPTUZhY3RvcnkoJ2lucycpLFxuICBrYmQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2tiZCcpLFxuICBrZXlnZW46IGNyZWF0ZURPTUZhY3RvcnkoJ2tleWdlbicpLFxuICBsYWJlbDogY3JlYXRlRE9NRmFjdG9yeSgnbGFiZWwnKSxcbiAgbGVnZW5kOiBjcmVhdGVET01GYWN0b3J5KCdsZWdlbmQnKSxcbiAgbGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpJyksXG4gIGxpbms6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmsnKSxcbiAgbWFpbjogY3JlYXRlRE9NRmFjdG9yeSgnbWFpbicpLFxuICBtYXA6IGNyZWF0ZURPTUZhY3RvcnkoJ21hcCcpLFxuICBtYXJrOiBjcmVhdGVET01GYWN0b3J5KCdtYXJrJyksXG4gIG1lbnU6IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnUnKSxcbiAgbWVudWl0ZW06IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnVpdGVtJyksXG4gIG1ldGE6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGEnKSxcbiAgbWV0ZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGVyJyksXG4gIG5hdjogY3JlYXRlRE9NRmFjdG9yeSgnbmF2JyksXG4gIG5vc2NyaXB0OiBjcmVhdGVET01GYWN0b3J5KCdub3NjcmlwdCcpLFxuICBvYmplY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ29iamVjdCcpLFxuICBvbDogY3JlYXRlRE9NRmFjdG9yeSgnb2wnKSxcbiAgb3B0Z3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ29wdGdyb3VwJyksXG4gIG9wdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnb3B0aW9uJyksXG4gIG91dHB1dDogY3JlYXRlRE9NRmFjdG9yeSgnb3V0cHV0JyksXG4gIHA6IGNyZWF0ZURPTUZhY3RvcnkoJ3AnKSxcbiAgcGFyYW06IGNyZWF0ZURPTUZhY3RvcnkoJ3BhcmFtJyksXG4gIHBpY3R1cmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3BpY3R1cmUnKSxcbiAgcHJlOiBjcmVhdGVET01GYWN0b3J5KCdwcmUnKSxcbiAgcHJvZ3Jlc3M6IGNyZWF0ZURPTUZhY3RvcnkoJ3Byb2dyZXNzJyksXG4gIHE6IGNyZWF0ZURPTUZhY3RvcnkoJ3EnKSxcbiAgcnA6IGNyZWF0ZURPTUZhY3RvcnkoJ3JwJyksXG4gIHJ0OiBjcmVhdGVET01GYWN0b3J5KCdydCcpLFxuICBydWJ5OiBjcmVhdGVET01GYWN0b3J5KCdydWJ5JyksXG4gIHM6IGNyZWF0ZURPTUZhY3RvcnkoJ3MnKSxcbiAgc2FtcDogY3JlYXRlRE9NRmFjdG9yeSgnc2FtcCcpLFxuICBzY3JpcHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3NjcmlwdCcpLFxuICBzZWN0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdzZWN0aW9uJyksXG4gIHNlbGVjdDogY3JlYXRlRE9NRmFjdG9yeSgnc2VsZWN0JyksXG4gIHNtYWxsOiBjcmVhdGVET01GYWN0b3J5KCdzbWFsbCcpLFxuICBzb3VyY2U6IGNyZWF0ZURPTUZhY3RvcnkoJ3NvdXJjZScpLFxuICBzcGFuOiBjcmVhdGVET01GYWN0b3J5KCdzcGFuJyksXG4gIHN0cm9uZzogY3JlYXRlRE9NRmFjdG9yeSgnc3Ryb25nJyksXG4gIHN0eWxlOiBjcmVhdGVET01GYWN0b3J5KCdzdHlsZScpLFxuICBzdWI6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1YicpLFxuICBzdW1tYXJ5OiBjcmVhdGVET01GYWN0b3J5KCdzdW1tYXJ5JyksXG4gIHN1cDogY3JlYXRlRE9NRmFjdG9yeSgnc3VwJyksXG4gIHRhYmxlOiBjcmVhdGVET01GYWN0b3J5KCd0YWJsZScpLFxuICB0Ym9keTogY3JlYXRlRE9NRmFjdG9yeSgndGJvZHknKSxcbiAgdGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RkJyksXG4gIHRleHRhcmVhOiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0YXJlYScpLFxuICB0Zm9vdDogY3JlYXRlRE9NRmFjdG9yeSgndGZvb3QnKSxcbiAgdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoJyksXG4gIHRoZWFkOiBjcmVhdGVET01GYWN0b3J5KCd0aGVhZCcpLFxuICB0aW1lOiBjcmVhdGVET01GYWN0b3J5KCd0aW1lJyksXG4gIHRpdGxlOiBjcmVhdGVET01GYWN0b3J5KCd0aXRsZScpLFxuICB0cjogY3JlYXRlRE9NRmFjdG9yeSgndHInKSxcbiAgdHJhY2s6IGNyZWF0ZURPTUZhY3RvcnkoJ3RyYWNrJyksXG4gIHU6IGNyZWF0ZURPTUZhY3RvcnkoJ3UnKSxcbiAgdWw6IGNyZWF0ZURPTUZhY3RvcnkoJ3VsJyksXG4gICd2YXInOiBjcmVhdGVET01GYWN0b3J5KCd2YXInKSxcbiAgdmlkZW86IGNyZWF0ZURPTUZhY3RvcnkoJ3ZpZGVvJyksXG4gIHdicjogY3JlYXRlRE9NRmFjdG9yeSgnd2JyJyksXG5cbiAgLy8gU1ZHXG4gIGNpcmNsZTogY3JlYXRlRE9NRmFjdG9yeSgnY2lyY2xlJyksXG4gIGNsaXBQYXRoOiBjcmVhdGVET01GYWN0b3J5KCdjbGlwUGF0aCcpLFxuICBkZWZzOiBjcmVhdGVET01GYWN0b3J5KCdkZWZzJyksXG4gIGVsbGlwc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2VsbGlwc2UnKSxcbiAgZzogY3JlYXRlRE9NRmFjdG9yeSgnZycpLFxuICBpbWFnZTogY3JlYXRlRE9NRmFjdG9yeSgnaW1hZ2UnKSxcbiAgbGluZTogY3JlYXRlRE9NRmFjdG9yeSgnbGluZScpLFxuICBsaW5lYXJHcmFkaWVudDogY3JlYXRlRE9NRmFjdG9yeSgnbGluZWFyR3JhZGllbnQnKSxcbiAgbWFzazogY3JlYXRlRE9NRmFjdG9yeSgnbWFzaycpLFxuICBwYXRoOiBjcmVhdGVET01GYWN0b3J5KCdwYXRoJyksXG4gIHBhdHRlcm46IGNyZWF0ZURPTUZhY3RvcnkoJ3BhdHRlcm4nKSxcbiAgcG9seWdvbjogY3JlYXRlRE9NRmFjdG9yeSgncG9seWdvbicpLFxuICBwb2x5bGluZTogY3JlYXRlRE9NRmFjdG9yeSgncG9seWxpbmUnKSxcbiAgcmFkaWFsR3JhZGllbnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3JhZGlhbEdyYWRpZW50JyksXG4gIHJlY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3JlY3QnKSxcbiAgc3RvcDogY3JlYXRlRE9NRmFjdG9yeSgnc3RvcCcpLFxuICBzdmc6IGNyZWF0ZURPTUZhY3RvcnkoJ3N2ZycpLFxuICB0ZXh0OiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0JyksXG4gIHRzcGFuOiBjcmVhdGVET01GYWN0b3J5KCd0c3BhbicpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmFjdG9yaWVzOyJdfQ== | |
| },{"./ReactElement":11,"./ReactElementValidator":12,"_process":1}],11:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2014-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactElement | |
| */ | |
| 'use strict'; | |
| var _assign = require('object-assign'); | |
| var ReactCurrentOwner = require('./ReactCurrentOwner'); | |
| var warning = require('fbjs/lib/warning'); | |
| var canDefineProperty = require('./canDefineProperty'); | |
| var hasOwnProperty = Object.prototype.hasOwnProperty; | |
| // The Symbol used to tag the ReactElement type. If there is no native Symbol | |
| // nor polyfill, then a plain number is used for performance. | |
| var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7; | |
| var RESERVED_PROPS = { | |
| key: true, | |
| ref: true, | |
| __self: true, | |
| __source: true | |
| }; | |
| var specialPropKeyWarningShown, specialPropRefWarningShown; | |
| function hasValidRef(config) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| if (hasOwnProperty.call(config, 'ref')) { | |
| var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; | |
| if (getter && getter.isReactWarning) { | |
| return false; | |
| } | |
| } | |
| } | |
| return config.ref !== undefined; | |
| } | |
| function hasValidKey(config) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| if (hasOwnProperty.call(config, 'key')) { | |
| var getter = Object.getOwnPropertyDescriptor(config, 'key').get; | |
| if (getter && getter.isReactWarning) { | |
| return false; | |
| } | |
| } | |
| } | |
| return config.key !== undefined; | |
| } | |
| function defineKeyPropWarningGetter(props, displayName) { | |
| var warnAboutAccessingKey = function () { | |
| if (!specialPropKeyWarningShown) { | |
| specialPropKeyWarningShown = true; | |
| process.env.NODE_ENV !== 'production' ? warning(false, '%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName) : void 0; | |
| } | |
| }; | |
| warnAboutAccessingKey.isReactWarning = true; | |
| Object.defineProperty(props, 'key', { | |
| get: warnAboutAccessingKey, | |
| configurable: true | |
| }); | |
| } | |
| function defineRefPropWarningGetter(props, displayName) { | |
| var warnAboutAccessingRef = function () { | |
| if (!specialPropRefWarningShown) { | |
| specialPropRefWarningShown = true; | |
| process.env.NODE_ENV !== 'production' ? warning(false, '%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName) : void 0; | |
| } | |
| }; | |
| warnAboutAccessingRef.isReactWarning = true; | |
| Object.defineProperty(props, 'ref', { | |
| get: warnAboutAccessingRef, | |
| configurable: true | |
| }); | |
| } | |
| /** | |
| * Factory method to create a new React element. This no longer adheres to | |
| * the class pattern, so do not use new to call it. Also, no instanceof check | |
| * will work. Instead test $$typeof field against Symbol.for('react.element') to check | |
| * if something is a React Element. | |
| * | |
| * @param {*} type | |
| * @param {*} key | |
| * @param {string|object} ref | |
| * @param {*} self A *temporary* helper to detect places where `this` is | |
| * different from the `owner` when React.createElement is called, so that we | |
| * can warn. We want to get rid of owner and replace string `ref`s with arrow | |
| * functions, and as long as `this` and owner are the same, there will be no | |
| * change in behavior. | |
| * @param {*} source An annotation object (added by a transpiler or otherwise) | |
| * indicating filename, line number, and/or other information. | |
| * @param {*} owner | |
| * @param {*} props | |
| * @internal | |
| */ | |
| var ReactElement = function (type, key, ref, self, source, owner, props) { | |
| var element = { | |
| // This tag allow us to uniquely identify this as a React Element | |
| $$typeof: REACT_ELEMENT_TYPE, | |
| // Built-in properties that belong on the element | |
| type: type, | |
| key: key, | |
| ref: ref, | |
| props: props, | |
| // Record the component responsible for creating this element. | |
| _owner: owner | |
| }; | |
| if (process.env.NODE_ENV !== 'production') { | |
| // The validation flag is currently mutative. We put it on | |
| // an external backing store so that we can freeze the whole object. | |
| // This can be replaced with a WeakMap once they are implemented in | |
| // commonly used development environments. | |
| element._store = {}; | |
| var shadowChildren = Array.isArray(props.children) ? props.children.slice(0) : props.children; | |
| // To make comparing ReactElements easier for testing purposes, we make | |
| // the validation flag non-enumerable (where possible, which should | |
| // include every environment we run tests in), so the test framework | |
| // ignores it. | |
| if (canDefineProperty) { | |
| Object.defineProperty(element._store, 'validated', { | |
| configurable: false, | |
| enumerable: false, | |
| writable: true, | |
| value: false | |
| }); | |
| // self and source are DEV only properties. | |
| Object.defineProperty(element, '_self', { | |
| configurable: false, | |
| enumerable: false, | |
| writable: false, | |
| value: self | |
| }); | |
| Object.defineProperty(element, '_shadowChildren', { | |
| configurable: false, | |
| enumerable: false, | |
| writable: false, | |
| value: shadowChildren | |
| }); | |
| // Two elements created in two different places should be considered | |
| // equal for testing purposes and therefore we hide it from enumeration. | |
| Object.defineProperty(element, '_source', { | |
| configurable: false, | |
| enumerable: false, | |
| writable: false, | |
| value: source | |
| }); | |
| } else { | |
| element._store.validated = false; | |
| element._self = self; | |
| element._shadowChildren = shadowChildren; | |
| element._source = source; | |
| } | |
| if (Object.freeze) { | |
| Object.freeze(element.props); | |
| Object.freeze(element); | |
| } | |
| } | |
| return element; | |
| }; | |
| /** | |
| * Create and return a new ReactElement of the given type. | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.createelement | |
| */ | |
| ReactElement.createElement = function (type, config, children) { | |
| var propName; | |
| // Reserved names are extracted | |
| var props = {}; | |
| var key = null; | |
| var ref = null; | |
| var self = null; | |
| var source = null; | |
| if (config != null) { | |
| if (hasValidRef(config)) { | |
| ref = config.ref; | |
| } | |
| if (hasValidKey(config)) { | |
| key = '' + config.key; | |
| } | |
| self = config.__self === undefined ? null : config.__self; | |
| source = config.__source === undefined ? null : config.__source; | |
| // Remaining properties are added to a new props object | |
| for (propName in config) { | |
| if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { | |
| props[propName] = config[propName]; | |
| } | |
| } | |
| } | |
| // Children can be more than one argument, and those are transferred onto | |
| // the newly allocated props object. | |
| var childrenLength = arguments.length - 2; | |
| if (childrenLength === 1) { | |
| props.children = children; | |
| } else if (childrenLength > 1) { | |
| var childArray = Array(childrenLength); | |
| for (var i = 0; i < childrenLength; i++) { | |
| childArray[i] = arguments[i + 2]; | |
| } | |
| props.children = childArray; | |
| } | |
| // Resolve default props | |
| if (type && type.defaultProps) { | |
| var defaultProps = type.defaultProps; | |
| for (propName in defaultProps) { | |
| if (props[propName] === undefined) { | |
| props[propName] = defaultProps[propName]; | |
| } | |
| } | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| if (key || ref) { | |
| if (typeof props.$$typeof === 'undefined' || props.$$typeof !== REACT_ELEMENT_TYPE) { | |
| var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; | |
| if (key) { | |
| defineKeyPropWarningGetter(props, displayName); | |
| } | |
| if (ref) { | |
| defineRefPropWarningGetter(props, displayName); | |
| } | |
| } | |
| } | |
| } | |
| return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); | |
| }; | |
| /** | |
| * Return a function that produces ReactElements of a given type. | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.createfactory | |
| */ | |
| ReactElement.createFactory = function (type) { | |
| var factory = ReactElement.createElement.bind(null, type); | |
| // Expose the type on the factory and the prototype so that it can be | |
| // easily accessed on elements. E.g. `<Foo />.type === Foo`. | |
| // This should not be named `constructor` since this may not be the function | |
| // that created the element, and it may not even be a constructor. | |
| // Legacy hook TODO: Warn if this is accessed | |
| factory.type = type; | |
| return factory; | |
| }; | |
| ReactElement.cloneAndReplaceKey = function (oldElement, newKey) { | |
| var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); | |
| return newElement; | |
| }; | |
| /** | |
| * Clone and return a new ReactElement using element as the starting point. | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement | |
| */ | |
| ReactElement.cloneElement = function (element, config, children) { | |
| var propName; | |
| // Original props are copied | |
| var props = _assign({}, element.props); | |
| // Reserved names are extracted | |
| var key = element.key; | |
| var ref = element.ref; | |
| // Self is preserved since the owner is preserved. | |
| var self = element._self; | |
| // Source is preserved since cloneElement is unlikely to be targeted by a | |
| // transpiler, and the original source is probably a better indicator of the | |
| // true owner. | |
| var source = element._source; | |
| // Owner will be preserved, unless ref is overridden | |
| var owner = element._owner; | |
| if (config != null) { | |
| if (hasValidRef(config)) { | |
| // Silently steal the ref from the parent. | |
| ref = config.ref; | |
| owner = ReactCurrentOwner.current; | |
| } | |
| if (hasValidKey(config)) { | |
| key = '' + config.key; | |
| } | |
| // Remaining properties override existing props | |
| var defaultProps; | |
| if (element.type && element.type.defaultProps) { | |
| defaultProps = element.type.defaultProps; | |
| } | |
| for (propName in config) { | |
| if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { | |
| if (config[propName] === undefined && defaultProps !== undefined) { | |
| // Resolve default props | |
| props[propName] = defaultProps[propName]; | |
| } else { | |
| props[propName] = config[propName]; | |
| } | |
| } | |
| } | |
| } | |
| // Children can be more than one argument, and those are transferred onto | |
| // the newly allocated props object. | |
| var childrenLength = arguments.length - 2; | |
| if (childrenLength === 1) { | |
| props.children = children; | |
| } else if (childrenLength > 1) { | |
| var childArray = Array(childrenLength); | |
| for (var i = 0; i < childrenLength; i++) { | |
| childArray[i] = arguments[i + 2]; | |
| } | |
| props.children = childArray; | |
| } | |
| return ReactElement(element.type, key, ref, self, source, owner, props); | |
| }; | |
| /** | |
| * Verifies the object is a ReactElement. | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.isvalidelement | |
| * @param {?object} object | |
| * @return {boolean} True if `object` is a valid component. | |
| * @final | |
| */ | |
| ReactElement.isValidElement = function (object) { | |
| return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; | |
| }; | |
| ReactElement.REACT_ELEMENT_TYPE = REACT_ELEMENT_TYPE; | |
| module.exports = ReactElement; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdEVsZW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0RWxlbWVudFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQgdHlwZS4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xuXG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL2ZiLm1lL3JlYWN0LXNwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfTtcbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIG5vIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTtcbiAgICB2YXIgc2hhZG93Q2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KHByb3BzLmNoaWxkcmVuKSA/IHByb3BzLmNoaWxkcmVuLnNsaWNlKDApIDogcHJvcHMuY2hpbGRyZW47XG5cbiAgICAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG4gICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzZWxmXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NoYWRvd0NoaWxkcmVuJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc2hhZG93Q2hpbGRyZW5cbiAgICAgIH0pO1xuICAgICAgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc291cmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gZmFsc2U7XG4gICAgICBlbGVtZW50Ll9zZWxmID0gc2VsZjtcbiAgICAgIGVsZW1lbnQuX3NoYWRvd0NoaWxkcmVuID0gc2hhZG93Q2hpbGRyZW47XG4gICAgICBlbGVtZW50Ll9zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIgcHJvcHMgPSB7fTtcblxuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTtcbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLiQkdHlwZW9mID09PSAndW5kZWZpbmVkJyB8fCBwcm9wcy4kJHR5cGVvZiAhPT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgUmVhY3RFbGVtZW50cyBvZiBhIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY3JlYXRlZmFjdG9yeVxuICovXG5SZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHZhciBmYWN0b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgLy8gRXhwb3NlIHRoZSB0eXBlIG9uIHRoZSBmYWN0b3J5IGFuZCB0aGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY2FuIGJlXG4gIC8vIGVhc2lseSBhY2Nlc3NlZCBvbiBlbGVtZW50cy4gRS5nLiBgPEZvbyAvPi50eXBlID09PSBGb29gLlxuICAvLyBUaGlzIHNob3VsZCBub3QgYmUgbmFtZWQgYGNvbnN0cnVjdG9yYCBzaW5jZSB0aGlzIG1heSBub3QgYmUgdGhlIGZ1bmN0aW9uXG4gIC8vIHRoYXQgY3JlYXRlZCB0aGUgZWxlbWVudCwgYW5kIGl0IG1heSBub3QgZXZlbiBiZSBhIGNvbnN0cnVjdG9yLlxuICAvLyBMZWdhY3kgaG9vayBUT0RPOiBXYXJuIGlmIHRoaXMgaXMgYWNjZXNzZWRcbiAgZmFjdG9yeS50eXBlID0gdHlwZTtcbiAgcmV0dXJuIGZhY3Rvcnk7XG59O1xuXG5SZWFjdEVsZW1lbnQuY2xvbmVBbmRSZXBsYWNlS2V5ID0gZnVuY3Rpb24gKG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuXG4gIHJldHVybiBuZXdFbGVtZW50O1xufTtcblxuLyoqXG4gKiBDbG9uZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCB1c2luZyBlbGVtZW50IGFzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jbG9uZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTtcblxuICAvLyBPcmlnaW5hbCBwcm9wcyBhcmUgY29waWVkXG4gIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpO1xuXG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG4gIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjtcbiAgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYVxuICAvLyB0cmFuc3BpbGVyLCBhbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBwcm9iYWJseSBhIGJldHRlciBpbmRpY2F0b3Igb2YgdGhlXG4gIC8vIHRydWUgb3duZXIuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG5cbiAgLy8gT3duZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHVubGVzcyByZWYgaXMgb3ZlcnJpZGRlblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn07XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5pc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSB2YWxpZCBjb21wb25lbnQuXG4gKiBAZmluYWxcbiAqL1xuUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufTtcblxuUmVhY3RFbGVtZW50LlJFQUNUX0VMRU1FTlRfVFlQRSA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVsZW1lbnQ7Il19 | |
| },{"./ReactCurrentOwner":9,"./canDefineProperty":20,"_process":1,"fbjs/lib/warning":31,"object-assign":32}],12:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2014-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactElementValidator | |
| */ | |
| /** | |
| * ReactElementValidator provides a wrapper around a element factory | |
| * which validates the props passed to the element. This is intended to be | |
| * used only in DEV and could be replaced by a static type checker for languages | |
| * that support it. | |
| */ | |
| 'use strict'; | |
| var ReactCurrentOwner = require('./ReactCurrentOwner'); | |
| var ReactComponentTreeHook = require('./ReactComponentTreeHook'); | |
| var ReactElement = require('./ReactElement'); | |
| var ReactPropTypeLocations = require('./ReactPropTypeLocations'); | |
| var checkReactTypeSpec = require('./checkReactTypeSpec'); | |
| var canDefineProperty = require('./canDefineProperty'); | |
| var getIteratorFn = require('./getIteratorFn'); | |
| var warning = require('fbjs/lib/warning'); | |
| function getDeclarationErrorAddendum() { | |
| if (ReactCurrentOwner.current) { | |
| var name = ReactCurrentOwner.current.getName(); | |
| if (name) { | |
| return ' Check the render method of `' + name + '`.'; | |
| } | |
| } | |
| return ''; | |
| } | |
| /** | |
| * Warn if there's no key explicitly set on dynamic arrays of children or | |
| * object keys are not valid. This allows us to keep track of children between | |
| * updates. | |
| */ | |
| var ownerHasKeyUseWarning = {}; | |
| function getCurrentComponentErrorInfo(parentType) { | |
| var info = getDeclarationErrorAddendum(); | |
| if (!info) { | |
| var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; | |
| if (parentName) { | |
| info = ' Check the top-level render call using <' + parentName + '>.'; | |
| } | |
| } | |
| return info; | |
| } | |
| /** | |
| * Warn if the element doesn't have an explicit key assigned to it. | |
| * This element is in an array. The array could grow and shrink or be | |
| * reordered. All children that haven't already been validated are required to | |
| * have a "key" property assigned to it. Error statuses are cached so a warning | |
| * will only be shown once. | |
| * | |
| * @internal | |
| * @param {ReactElement} element Element that requires a key. | |
| * @param {*} parentType element's parent's type. | |
| */ | |
| function validateExplicitKey(element, parentType) { | |
| if (!element._store || element._store.validated || element.key != null) { | |
| return; | |
| } | |
| element._store.validated = true; | |
| var memoizer = ownerHasKeyUseWarning.uniqueKey || (ownerHasKeyUseWarning.uniqueKey = {}); | |
| var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); | |
| if (memoizer[currentComponentErrorInfo]) { | |
| return; | |
| } | |
| memoizer[currentComponentErrorInfo] = true; | |
| // Usually the current owner is the offender, but if it accepts children as a | |
| // property, it may be the creator of the child that's responsible for | |
| // assigning it a key. | |
| var childOwner = ''; | |
| if (element && element._owner && element._owner !== ReactCurrentOwner.current) { | |
| // Give the component that originally created this child. | |
| childOwner = ' It was passed a child from ' + element._owner.getName() + '.'; | |
| } | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Each child in an array or iterator should have a unique "key" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.%s', currentComponentErrorInfo, childOwner, ReactComponentTreeHook.getCurrentStackAddendum(element)) : void 0; | |
| } | |
| /** | |
| * Ensure that every element either is passed in a static location, in an | |
| * array with an explicit keys property defined, or in an object literal | |
| * with valid key property. | |
| * | |
| * @internal | |
| * @param {ReactNode} node Statically passed child of any type. | |
| * @param {*} parentType node's parent's type. | |
| */ | |
| function validateChildKeys(node, parentType) { | |
| if (typeof node !== 'object') { | |
| return; | |
| } | |
| if (Array.isArray(node)) { | |
| for (var i = 0; i < node.length; i++) { | |
| var child = node[i]; | |
| if (ReactElement.isValidElement(child)) { | |
| validateExplicitKey(child, parentType); | |
| } | |
| } | |
| } else if (ReactElement.isValidElement(node)) { | |
| // This element was passed in a valid location. | |
| if (node._store) { | |
| node._store.validated = true; | |
| } | |
| } else if (node) { | |
| var iteratorFn = getIteratorFn(node); | |
| // Entry iterators provide implicit keys. | |
| if (iteratorFn) { | |
| if (iteratorFn !== node.entries) { | |
| var iterator = iteratorFn.call(node); | |
| var step; | |
| while (!(step = iterator.next()).done) { | |
| if (ReactElement.isValidElement(step.value)) { | |
| validateExplicitKey(step.value, parentType); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| /** | |
| * Given an element, validate that its props follow the propTypes definition, | |
| * provided by the type. | |
| * | |
| * @param {ReactElement} element | |
| */ | |
| function validatePropTypes(element) { | |
| var componentClass = element.type; | |
| if (typeof componentClass !== 'function') { | |
| return; | |
| } | |
| var name = componentClass.displayName || componentClass.name; | |
| if (componentClass.propTypes) { | |
| checkReactTypeSpec(componentClass.propTypes, element.props, ReactPropTypeLocations.prop, name, element, null); | |
| } | |
| if (typeof componentClass.getDefaultProps === 'function') { | |
| process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : void 0; | |
| } | |
| } | |
| var ReactElementValidator = { | |
| createElement: function (type, props, children) { | |
| var validType = typeof type === 'string' || typeof type === 'function'; | |
| // We warn in this case but don't throw. We expect the element creation to | |
| // succeed and there will likely be errors in render. | |
| if (!validType) { | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'React.createElement: type should not be null, undefined, boolean, or ' + 'number. It should be a string (for DOM elements) or a ReactClass ' + '(for composite components).%s', getDeclarationErrorAddendum()) : void 0; | |
| } | |
| var element = ReactElement.createElement.apply(this, arguments); | |
| // The result can be nullish if a mock or a custom function is used. | |
| // TODO: Drop this when these are no longer allowed as the type argument. | |
| if (element == null) { | |
| return element; | |
| } | |
| // Skip key warning if the type isn't valid since our key validation logic | |
| // doesn't expect a non-string/function type and can throw confusing errors. | |
| // We don't want exception behavior to differ between dev and prod. | |
| // (Rendering will throw with a helpful message and as soon as the type is | |
| // fixed, the key warnings will appear.) | |
| if (validType) { | |
| for (var i = 2; i < arguments.length; i++) { | |
| validateChildKeys(arguments[i], type); | |
| } | |
| } | |
| validatePropTypes(element); | |
| return element; | |
| }, | |
| createFactory: function (type) { | |
| var validatedFactory = ReactElementValidator.createElement.bind(null, type); | |
| // Legacy hook TODO: Warn if this is accessed | |
| validatedFactory.type = type; | |
| if (process.env.NODE_ENV !== 'production') { | |
| if (canDefineProperty) { | |
| Object.defineProperty(validatedFactory, 'type', { | |
| enumerable: false, | |
| get: function () { | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : void 0; | |
| Object.defineProperty(this, 'type', { | |
| value: type | |
| }); | |
| return type; | |
| } | |
| }); | |
| } | |
| } | |
| return validatedFactory; | |
| }, | |
| cloneElement: function (element, props, children) { | |
| var newElement = ReactElement.cloneElement.apply(this, arguments); | |
| for (var i = 2; i < arguments.length; i++) { | |
| validateChildKeys(arguments[i], newElement.type); | |
| } | |
| validatePropTypes(newElement); | |
| return newElement; | |
| } | |
| }; | |
| module.exports = ReactElementValidator; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdEVsZW1lbnRWYWxpZGF0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0RWxlbWVudFZhbGlkYXRvclxuICovXG5cbi8qKlxuICogUmVhY3RFbGVtZW50VmFsaWRhdG9yIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgYSBlbGVtZW50IGZhY3RvcnlcbiAqIHdoaWNoIHZhbGlkYXRlcyB0aGUgcHJvcHMgcGFzc2VkIHRvIHRoZSBlbGVtZW50LiBUaGlzIGlzIGludGVuZGVkIHRvIGJlXG4gKiB1c2VkIG9ubHkgaW4gREVWIGFuZCBjb3VsZCBiZSByZXBsYWNlZCBieSBhIHN0YXRpYyB0eXBlIGNoZWNrZXIgZm9yIGxhbmd1YWdlc1xuICogdGhhdCBzdXBwb3J0IGl0LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbnMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbnMnKTtcblxudmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSAnIENoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCcgKyBwYXJlbnROYW1lICsgJz4uJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG5cbiAgdmFyIG1lbW9pemVyID0gb3duZXJIYXNLZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSB8fCAob3duZXJIYXNLZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSA9IHt9KTtcblxuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG4gIGlmIChtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuICBtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7XG5cbiAgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9ICcgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gJyArIGVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJztcbiAgfVxuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRWFjaCBjaGlsZCBpbiBhbiBhcnJheSBvciBpdGVyYXRvciBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4lcycsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oZWxlbWVudCkpIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyBwcm92aWRlIGltcGxpY2l0IGtleXMuXG4gICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAgdmFyIGNvbXBvbmVudENsYXNzID0gZWxlbWVudC50eXBlO1xuICBpZiAodHlwZW9mIGNvbXBvbmVudENsYXNzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuYW1lID0gY29tcG9uZW50Q2xhc3MuZGlzcGxheU5hbWUgfHwgY29tcG9uZW50Q2xhc3MubmFtZTtcbiAgaWYgKGNvbXBvbmVudENsYXNzLnByb3BUeXBlcykge1xuICAgIGNoZWNrUmVhY3RUeXBlU3BlYyhjb21wb25lbnRDbGFzcy5wcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbnMucHJvcCwgbmFtZSwgZWxlbWVudCwgbnVsbCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBjb21wb25lbnRDbGFzcy5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhjb21wb25lbnRDbGFzcy5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQsICdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gIH1cbn1cblxudmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHtcblxuICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgdmFyIHZhbGlkVHlwZSA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBzaG91bGQgbm90IGJlIG51bGwsIHVuZGVmaW5lZCwgYm9vbGVhbiwgb3IgJyArICdudW1iZXIuIEl0IHNob3VsZCBiZSBhIHN0cmluZyAoZm9yIERPTSBlbGVtZW50cykgb3IgYSBSZWFjdENsYXNzICcgKyAnKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykuJXMnLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSkgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZCBwcm9kLlxuICAgIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gICAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuICAgIGlmICh2YWxpZFR5cGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSxcblxuICBjcmVhdGVGYWN0b3J5OiBmdW5jdGlvbiAodHlwZSkge1xuICAgIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgICAvLyBMZWdhY3kgaG9vayBUT0RPOiBXYXJuIGlmIHRoaXMgaXMgYWNjZXNzZWRcbiAgICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsaWRhdGVkRmFjdG9yeSwgJ3R5cGUnLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbiAgfSxcblxuICBjbG9uZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICAgIH1cbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTtcbiAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RWxlbWVudFZhbGlkYXRvcjsiXX0= | |
| },{"./ReactComponentTreeHook":8,"./ReactCurrentOwner":9,"./ReactElement":11,"./ReactPropTypeLocations":15,"./canDefineProperty":20,"./checkReactTypeSpec":21,"./getIteratorFn":22,"_process":1,"fbjs/lib/warning":31}],13:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2015-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactNoopUpdateQueue | |
| */ | |
| 'use strict'; | |
| var warning = require('fbjs/lib/warning'); | |
| function warnNoop(publicInstance, callerName) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| var constructor = publicInstance.constructor; | |
| process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0; | |
| } | |
| } | |
| /** | |
| * This is the abstract API for an update queue. | |
| */ | |
| var ReactNoopUpdateQueue = { | |
| /** | |
| * Checks whether or not this composite component is mounted. | |
| * @param {ReactClass} publicInstance The instance we want to test. | |
| * @return {boolean} True if mounted, false otherwise. | |
| * @protected | |
| * @final | |
| */ | |
| isMounted: function (publicInstance) { | |
| return false; | |
| }, | |
| /** | |
| * Enqueue a callback that will be executed after all the pending updates | |
| * have processed. | |
| * | |
| * @param {ReactClass} publicInstance The instance to use as `this` context. | |
| * @param {?function} callback Called after state is updated. | |
| * @internal | |
| */ | |
| enqueueCallback: function (publicInstance, callback) {}, | |
| /** | |
| * Forces an update. This should only be invoked when it is known with | |
| * certainty that we are **not** in a DOM transaction. | |
| * | |
| * You may want to call this when you know that some deeper aspect of the | |
| * component's state has changed but `setState` was not called. | |
| * | |
| * This will not invoke `shouldComponentUpdate`, but it will invoke | |
| * `componentWillUpdate` and `componentDidUpdate`. | |
| * | |
| * @param {ReactClass} publicInstance The instance that should rerender. | |
| * @internal | |
| */ | |
| enqueueForceUpdate: function (publicInstance) { | |
| warnNoop(publicInstance, 'forceUpdate'); | |
| }, | |
| /** | |
| * Replaces all of the state. Always use this or `setState` to mutate state. | |
| * You should treat `this.state` as immutable. | |
| * | |
| * There is no guarantee that `this.state` will be immediately updated, so | |
| * accessing `this.state` after calling this method may return the old value. | |
| * | |
| * @param {ReactClass} publicInstance The instance that should rerender. | |
| * @param {object} completeState Next state. | |
| * @internal | |
| */ | |
| enqueueReplaceState: function (publicInstance, completeState) { | |
| warnNoop(publicInstance, 'replaceState'); | |
| }, | |
| /** | |
| * Sets a subset of the state. This only exists because _pendingState is | |
| * internal. This provides a merging strategy that is not available to deep | |
| * properties which is confusing. TODO: Expose pendingState or don't use it | |
| * during the merge. | |
| * | |
| * @param {ReactClass} publicInstance The instance that should rerender. | |
| * @param {object} partialState Next partial state to be merged with state. | |
| * @internal | |
| */ | |
| enqueueSetState: function (publicInstance, partialState) { | |
| warnNoop(publicInstance, 'setState'); | |
| } | |
| }; | |
| module.exports = ReactNoopUpdateQueue; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdE5vb3BVcGRhdGVRdWV1ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUmVhY3ROb29wVXBkYXRlUXVldWVcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMoLi4uKTogQ2FuIG9ubHkgdXBkYXRlIGEgbW91bnRlZCBvciBtb3VudGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiAnICsgJ1RoaXMgaXMgYSBuby1vcC4gUGxlYXNlIGNoZWNrIHRoZSBjb2RlIGZvciB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNhbGxlck5hbWUsIGNvbnN0cnVjdG9yICYmIChjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcycpIDogdm9pZCAwO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgQVBJIGZvciBhbiB1cGRhdGUgcXVldWUuXG4gKi9cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXNcbiAgICogaGF2ZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVDYWxsYmFjazogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaykge30sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE5vb3BVcGRhdGVRdWV1ZTsiXX0= | |
| },{"_process":1,"fbjs/lib/warning":31}],14:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactPropTypeLocationNames | |
| */ | |
| 'use strict'; | |
| var ReactPropTypeLocationNames = {}; | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactPropTypeLocationNames = { | |
| prop: 'prop', | |
| context: 'context', | |
| childContext: 'child context' | |
| }; | |
| } | |
| module.exports = ReactPropTypeLocationNames; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHtcbiAgICBwcm9wOiAncHJvcCcsXG4gICAgY29udGV4dDogJ2NvbnRleHQnLFxuICAgIGNoaWxkQ29udGV4dDogJ2NoaWxkIGNvbnRleHQnXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXM7Il19 | |
| },{"_process":1}],15:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactPropTypeLocations | |
| */ | |
| 'use strict'; | |
| var keyMirror = require('fbjs/lib/keyMirror'); | |
| var ReactPropTypeLocations = keyMirror({ | |
| prop: null, | |
| context: null, | |
| childContext: null | |
| }); | |
| module.exports = ReactPropTypeLocations; | |
| },{"fbjs/lib/keyMirror":29}],16:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactPropTypes | |
| */ | |
| 'use strict'; | |
| var ReactElement = require('./ReactElement'); | |
| var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames'); | |
| var ReactPropTypesSecret = require('./ReactPropTypesSecret'); | |
| var emptyFunction = require('fbjs/lib/emptyFunction'); | |
| var getIteratorFn = require('./getIteratorFn'); | |
| var warning = require('fbjs/lib/warning'); | |
| /** | |
| * Collection of methods that allow declaration and validation of props that are | |
| * supplied to React components. Example usage: | |
| * | |
| * var Props = require('ReactPropTypes'); | |
| * var MyArticle = React.createClass({ | |
| * propTypes: { | |
| * // An optional string prop named "description". | |
| * description: Props.string, | |
| * | |
| * // A required enum prop named "category". | |
| * category: Props.oneOf(['News','Photos']).isRequired, | |
| * | |
| * // A prop named "dialog" that requires an instance of Dialog. | |
| * dialog: Props.instanceOf(Dialog).isRequired | |
| * }, | |
| * render: function() { ... } | |
| * }); | |
| * | |
| * A more formal specification of how these methods are used: | |
| * | |
| * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) | |
| * decl := ReactPropTypes.{type}(.isRequired)? | |
| * | |
| * Each and every declaration produces a function with the same signature. This | |
| * allows the creation of custom validation functions. For example: | |
| * | |
| * var MyLink = React.createClass({ | |
| * propTypes: { | |
| * // An optional string or URI prop named "href". | |
| * href: function(props, propName, componentName) { | |
| * var propValue = props[propName]; | |
| * if (propValue != null && typeof propValue !== 'string' && | |
| * !(propValue instanceof URI)) { | |
| * return new Error( | |
| * 'Expected a string or an URI for ' + propName + ' in ' + | |
| * componentName | |
| * ); | |
| * } | |
| * } | |
| * }, | |
| * render: function() {...} | |
| * }); | |
| * | |
| * @internal | |
| */ | |
| var ANONYMOUS = '<<anonymous>>'; | |
| var ReactPropTypes = { | |
| array: createPrimitiveTypeChecker('array'), | |
| bool: createPrimitiveTypeChecker('boolean'), | |
| func: createPrimitiveTypeChecker('function'), | |
| number: createPrimitiveTypeChecker('number'), | |
| object: createPrimitiveTypeChecker('object'), | |
| string: createPrimitiveTypeChecker('string'), | |
| symbol: createPrimitiveTypeChecker('symbol'), | |
| any: createAnyTypeChecker(), | |
| arrayOf: createArrayOfTypeChecker, | |
| element: createElementTypeChecker(), | |
| instanceOf: createInstanceTypeChecker, | |
| node: createNodeChecker(), | |
| objectOf: createObjectOfTypeChecker, | |
| oneOf: createEnumTypeChecker, | |
| oneOfType: createUnionTypeChecker, | |
| shape: createShapeTypeChecker | |
| }; | |
| /** | |
| * inlined Object.is polyfill to avoid requiring consumers ship their own | |
| * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is | |
| */ | |
| /*eslint-disable no-self-compare*/ | |
| function is(x, y) { | |
| // SameValue algorithm | |
| if (x === y) { | |
| // Steps 1-5, 7-10 | |
| // Steps 6.b-6.e: +0 != -0 | |
| return x !== 0 || 1 / x === 1 / y; | |
| } else { | |
| // Step 6.a: NaN == NaN | |
| return x !== x && y !== y; | |
| } | |
| } | |
| /*eslint-enable no-self-compare*/ | |
| /** | |
| * We use an Error-like object for backward compatibility as people may call | |
| * PropTypes directly and inspect their output. However we don't use real | |
| * Errors anymore. We don't inspect their stack anyway, and creating them | |
| * is prohibitively expensive if they are created too often, such as what | |
| * happens in oneOfType() for any type before the one that matched. | |
| */ | |
| function PropTypeError(message) { | |
| this.message = message; | |
| this.stack = ''; | |
| } | |
| // Make `instanceof Error` still work for returned errors. | |
| PropTypeError.prototype = Error.prototype; | |
| function createChainableTypeChecker(validate) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| var manualPropTypeCallCache = {}; | |
| } | |
| function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { | |
| componentName = componentName || ANONYMOUS; | |
| propFullName = propFullName || propName; | |
| if (process.env.NODE_ENV !== 'production') { | |
| if (secret !== ReactPropTypesSecret && typeof console !== 'undefined') { | |
| var cacheKey = componentName + ':' + propName; | |
| if (!manualPropTypeCallCache[cacheKey]) { | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'You are manually calling a React.PropTypes validation ' + 'function for the `%s` prop on `%s`. This is deprecated ' + 'and will not work in the next major version. You may be ' + 'seeing this warning due to a third-party PropTypes library. ' + 'See https://fb.me/react-warning-dont-call-proptypes for details.', propFullName, componentName) : void 0; | |
| manualPropTypeCallCache[cacheKey] = true; | |
| } | |
| } | |
| } | |
| if (props[propName] == null) { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| if (isRequired) { | |
| return new PropTypeError('Required ' + locationName + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.')); | |
| } | |
| return null; | |
| } else { | |
| return validate(props, propName, componentName, location, propFullName); | |
| } | |
| } | |
| var chainedCheckType = checkType.bind(null, false); | |
| chainedCheckType.isRequired = checkType.bind(null, true); | |
| return chainedCheckType; | |
| } | |
| function createPrimitiveTypeChecker(expectedType) { | |
| function validate(props, propName, componentName, location, propFullName, secret) { | |
| var propValue = props[propName]; | |
| var propType = getPropType(propValue); | |
| if (propType !== expectedType) { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| // `propValue` being instance of, say, date/regexp, pass the 'object' | |
| // check, but we can offer a more precise error message here rather than | |
| // 'of type `object`'. | |
| var preciseType = getPreciseType(propValue); | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.')); | |
| } | |
| return null; | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createAnyTypeChecker() { | |
| return createChainableTypeChecker(emptyFunction.thatReturns(null)); | |
| } | |
| function createArrayOfTypeChecker(typeChecker) { | |
| function validate(props, propName, componentName, location, propFullName) { | |
| if (typeof typeChecker !== 'function') { | |
| return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); | |
| } | |
| var propValue = props[propName]; | |
| if (!Array.isArray(propValue)) { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| var propType = getPropType(propValue); | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); | |
| } | |
| for (var i = 0; i < propValue.length; i++) { | |
| var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); | |
| if (error instanceof Error) { | |
| return error; | |
| } | |
| } | |
| return null; | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createElementTypeChecker() { | |
| function validate(props, propName, componentName, location, propFullName) { | |
| var propValue = props[propName]; | |
| if (!ReactElement.isValidElement(propValue)) { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| var propType = getPropType(propValue); | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); | |
| } | |
| return null; | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createInstanceTypeChecker(expectedClass) { | |
| function validate(props, propName, componentName, location, propFullName) { | |
| if (!(props[propName] instanceof expectedClass)) { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| var expectedClassName = expectedClass.name || ANONYMOUS; | |
| var actualClassName = getClassName(props[propName]); | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); | |
| } | |
| return null; | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createEnumTypeChecker(expectedValues) { | |
| if (!Array.isArray(expectedValues)) { | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOf, expected an instance of array.') : void 0; | |
| return emptyFunction.thatReturnsNull; | |
| } | |
| function validate(props, propName, componentName, location, propFullName) { | |
| var propValue = props[propName]; | |
| for (var i = 0; i < expectedValues.length; i++) { | |
| if (is(propValue, expectedValues[i])) { | |
| return null; | |
| } | |
| } | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| var valuesString = JSON.stringify(expectedValues); | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createObjectOfTypeChecker(typeChecker) { | |
| function validate(props, propName, componentName, location, propFullName) { | |
| if (typeof typeChecker !== 'function') { | |
| return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); | |
| } | |
| var propValue = props[propName]; | |
| var propType = getPropType(propValue); | |
| if (propType !== 'object') { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); | |
| } | |
| for (var key in propValue) { | |
| if (propValue.hasOwnProperty(key)) { | |
| var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); | |
| if (error instanceof Error) { | |
| return error; | |
| } | |
| } | |
| } | |
| return null; | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createUnionTypeChecker(arrayOfTypeCheckers) { | |
| if (!Array.isArray(arrayOfTypeCheckers)) { | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOfType, expected an instance of array.') : void 0; | |
| return emptyFunction.thatReturnsNull; | |
| } | |
| function validate(props, propName, componentName, location, propFullName) { | |
| for (var i = 0; i < arrayOfTypeCheckers.length; i++) { | |
| var checker = arrayOfTypeCheckers[i]; | |
| if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) { | |
| return null; | |
| } | |
| } | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.')); | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createNodeChecker() { | |
| function validate(props, propName, componentName, location, propFullName) { | |
| if (!isNode(props[propName])) { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); | |
| } | |
| return null; | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function createShapeTypeChecker(shapeTypes) { | |
| function validate(props, propName, componentName, location, propFullName) { | |
| var propValue = props[propName]; | |
| var propType = getPropType(propValue); | |
| if (propType !== 'object') { | |
| var locationName = ReactPropTypeLocationNames[location]; | |
| return new PropTypeError('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); | |
| } | |
| for (var key in shapeTypes) { | |
| var checker = shapeTypes[key]; | |
| if (!checker) { | |
| continue; | |
| } | |
| var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); | |
| if (error) { | |
| return error; | |
| } | |
| } | |
| return null; | |
| } | |
| return createChainableTypeChecker(validate); | |
| } | |
| function isNode(propValue) { | |
| switch (typeof propValue) { | |
| case 'number': | |
| case 'string': | |
| case 'undefined': | |
| return true; | |
| case 'boolean': | |
| return !propValue; | |
| case 'object': | |
| if (Array.isArray(propValue)) { | |
| return propValue.every(isNode); | |
| } | |
| if (propValue === null || ReactElement.isValidElement(propValue)) { | |
| return true; | |
| } | |
| var iteratorFn = getIteratorFn(propValue); | |
| if (iteratorFn) { | |
| var iterator = iteratorFn.call(propValue); | |
| var step; | |
| if (iteratorFn !== propValue.entries) { | |
| while (!(step = iterator.next()).done) { | |
| if (!isNode(step.value)) { | |
| return false; | |
| } | |
| } | |
| } else { | |
| // Iterator will provide entry [k,v] tuples rather than values. | |
| while (!(step = iterator.next()).done) { | |
| var entry = step.value; | |
| if (entry) { | |
| if (!isNode(entry[1])) { | |
| return false; | |
| } | |
| } | |
| } | |
| } | |
| } else { | |
| return false; | |
| } | |
| return true; | |
| default: | |
| return false; | |
| } | |
| } | |
| function isSymbol(propType, propValue) { | |
| // Native Symbol. | |
| if (propType === 'symbol') { | |
| return true; | |
| } | |
| // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' | |
| if (propValue['@@toStringTag'] === 'Symbol') { | |
| return true; | |
| } | |
| // Fallback for non-spec compliant Symbols which are polyfilled. | |
| if (typeof Symbol === 'function' && propValue instanceof Symbol) { | |
| return true; | |
| } | |
| return false; | |
| } | |
| // Equivalent of `typeof` but with special handling for array and regexp. | |
| function getPropType(propValue) { | |
| var propType = typeof propValue; | |
| if (Array.isArray(propValue)) { | |
| return 'array'; | |
| } | |
| if (propValue instanceof RegExp) { | |
| // Old webkits (at least until Android 4.0) return 'function' rather than | |
| // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ | |
| // passes PropTypes.object. | |
| return 'object'; | |
| } | |
| if (isSymbol(propType, propValue)) { | |
| return 'symbol'; | |
| } | |
| return propType; | |
| } | |
| // This handles more types than `getPropType`. Only used for error messages. | |
| // See `createPrimitiveTypeChecker`. | |
| function getPreciseType(propValue) { | |
| var propType = getPropType(propValue); | |
| if (propType === 'object') { | |
| if (propValue instanceof Date) { | |
| return 'date'; | |
| } else if (propValue instanceof RegExp) { | |
| return 'regexp'; | |
| } | |
| } | |
| return propType; | |
| } | |
| // Returns class name of the object, if any. | |
| function getClassName(propValue) { | |
| if (!propValue.constructor || !propValue.constructor.name) { | |
| return ANONYMOUS; | |
| } | |
| return propValue.constructor.name; | |
| } | |
| module.exports = ReactPropTypes; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9SZWFjdFByb3BUeXBlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0UHJvcFR5cGVzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMnKTtcbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgZ2V0SXRlcmF0b3JGbiA9IHJlcXVpcmUoJy4vZ2V0SXRlcmF0b3JGbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICogICAgIHByb3BUeXBlczoge1xuICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAqXG4gKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gKlxuICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gKiAgICAgfSxcbiAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICogICB9KTtcbiAqXG4gKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gKlxuICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAqXG4gKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gKlxuICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gKiAgICBwcm9wVHlwZXM6IHtcbiAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAqICAgICAgICAgICk7XG4gKiAgICAgICAgfVxuICogICAgICB9XG4gKiAgICB9LFxuICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gKiAgfSk7XG4gKlxuICogQGludGVybmFsXG4gKi9cblxudmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxudmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyXG59O1xuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG4vKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgaWYgKHggPT09IHkpIHtcbiAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cbi8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4vKipcbiAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIgd2UgZG9uJ3QgdXNlIHJlYWxcbiAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlmIHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXRcbiAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAqL1xuZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMuc3RhY2sgPSAnJztcbn1cbi8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cblByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICB9XG4gIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0ICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7XG4gICAgICAgIGlmICghbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICsgJ2Z1bmN0aW9uIGZvciB0aGUgYCVzYCBwcm9wIG9uIGAlc2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICsgJ2FuZCB3aWxsIG5vdCB3b3JrIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uIFlvdSBtYXkgYmUgJyArICdzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyBsaWJyYXJ5LiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyBmb3IgZGV0YWlscy4nLCBwcm9wRnVsbE5hbWUsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwO1xuICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdSZXF1aXJlZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHdhcyBub3Qgc3BlY2lmaWVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMobnVsbCkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICB9XG4gICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgaWYgKCFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgIH1cbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICBpZiAocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgIHZhciBzdGVwO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAvLyBOYXRpdmUgU3ltYm9sLlxuICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG5mdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgIHJldHVybiAnYXJyYXknO1xuICB9XG4gIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgcmV0dXJuICdvYmplY3QnO1xuICB9XG4gIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgIHJldHVybiAnc3ltYm9sJztcbiAgfVxuICByZXR1cm4gcHJvcFR5cGU7XG59XG5cbi8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbi8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJvcFR5cGU7XG59XG5cbi8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG5mdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgIHJldHVybiBBTk9OWU1PVVM7XG4gIH1cbiAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzOyJdfQ== | |
| },{"./ReactElement":11,"./ReactPropTypeLocationNames":14,"./ReactPropTypesSecret":17,"./getIteratorFn":22,"_process":1,"fbjs/lib/emptyFunction":26,"fbjs/lib/warning":31}],17:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactPropTypesSecret | |
| */ | |
| 'use strict'; | |
| var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; | |
| module.exports = ReactPropTypesSecret; | |
| },{}],18:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactPureComponent | |
| */ | |
| 'use strict'; | |
| var _assign = require('object-assign'); | |
| var ReactComponent = require('./ReactComponent'); | |
| var ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue'); | |
| var emptyObject = require('fbjs/lib/emptyObject'); | |
| /** | |
| * Base class helpers for the updating state of a component. | |
| */ | |
| function ReactPureComponent(props, context, updater) { | |
| // Duplicated from ReactComponent. | |
| this.props = props; | |
| this.context = context; | |
| this.refs = emptyObject; | |
| // We initialize the default updater but the real one gets injected by the | |
| // renderer. | |
| this.updater = updater || ReactNoopUpdateQueue; | |
| } | |
| function ComponentDummy() {} | |
| ComponentDummy.prototype = ReactComponent.prototype; | |
| ReactPureComponent.prototype = new ComponentDummy(); | |
| ReactPureComponent.prototype.constructor = ReactPureComponent; | |
| // Avoid an extra prototype jump for these methods. | |
| _assign(ReactPureComponent.prototype, ReactComponent.prototype); | |
| ReactPureComponent.prototype.isPureReactComponent = true; | |
| module.exports = ReactPureComponent; | |
| },{"./ReactComponent":7,"./ReactNoopUpdateQueue":13,"fbjs/lib/emptyObject":27,"object-assign":32}],19:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ReactVersion | |
| */ | |
| 'use strict'; | |
| module.exports = '15.3.2'; | |
| },{}],20:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule canDefineProperty | |
| */ | |
| 'use strict'; | |
| var canDefineProperty = false; | |
| if (process.env.NODE_ENV !== 'production') { | |
| try { | |
| Object.defineProperty({}, 'x', { get: function () {} }); | |
| canDefineProperty = true; | |
| } catch (x) { | |
| // IE will fail on defineProperty | |
| } | |
| } | |
| module.exports = canDefineProperty; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jYW5EZWZpbmVQcm9wZXJ0eS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgY2FuRGVmaW5lUHJvcGVydHlcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd4JywgeyBnZXQ6IGZ1bmN0aW9uICgpIHt9IH0pO1xuICAgIGNhbkRlZmluZVByb3BlcnR5ID0gdHJ1ZTtcbiAgfSBjYXRjaCAoeCkge1xuICAgIC8vIElFIHdpbGwgZmFpbCBvbiBkZWZpbmVQcm9wZXJ0eVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FuRGVmaW5lUHJvcGVydHk7Il19 | |
| },{"_process":1}],21:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule checkReactTypeSpec | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames'); | |
| var ReactPropTypesSecret = require('./ReactPropTypesSecret'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| var warning = require('fbjs/lib/warning'); | |
| var ReactComponentTreeHook; | |
| if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') { | |
| // Temporary hack. | |
| // Inline requires don't work well with Jest: | |
| // https://github.com/facebook/react/issues/7240 | |
| // Remove the inline requires when we don't need them anymore: | |
| // https://github.com/facebook/react/pull/7178 | |
| ReactComponentTreeHook = require('./ReactComponentTreeHook'); | |
| } | |
| var loggedTypeFailures = {}; | |
| /** | |
| * Assert that the values match with the type specs. | |
| * Error messages are memorized and will only be shown once. | |
| * | |
| * @param {object} typeSpecs Map of name to a ReactPropType | |
| * @param {object} values Runtime values that need to be type-checked | |
| * @param {string} location e.g. "prop", "context", "child context" | |
| * @param {string} componentName Name of the component for error messages. | |
| * @param {?object} element The React element that is being type-checked | |
| * @param {?number} debugID The React component instance that is being type-checked | |
| * @private | |
| */ | |
| function checkReactTypeSpec(typeSpecs, values, location, componentName, element, debugID) { | |
| for (var typeSpecName in typeSpecs) { | |
| if (typeSpecs.hasOwnProperty(typeSpecName)) { | |
| var error; | |
| // Prop type validation may throw. In case they do, we don't want to | |
| // fail the render phase where it didn't fail before. So we log it. | |
| // After these have been cleaned up, we'll let them throw. | |
| try { | |
| // This is intentionally an invariant that gets caught. It's the same | |
| // behavior as without this statement except with a better message. | |
| !(typeof typeSpecs[typeSpecName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : _prodInvariant('84', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : void 0; | |
| error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); | |
| } catch (ex) { | |
| error = ex; | |
| } | |
| process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName, typeof error) : void 0; | |
| if (error instanceof Error && !(error.message in loggedTypeFailures)) { | |
| // Only monitor this failure once because there tends to be a lot of the | |
| // same error. | |
| loggedTypeFailures[error.message] = true; | |
| var componentStackInfo = ''; | |
| if (process.env.NODE_ENV !== 'production') { | |
| if (!ReactComponentTreeHook) { | |
| ReactComponentTreeHook = require('./ReactComponentTreeHook'); | |
| } | |
| if (debugID !== null) { | |
| componentStackInfo = ReactComponentTreeHook.getStackAddendumByID(debugID); | |
| } else if (element !== null) { | |
| componentStackInfo = ReactComponentTreeHook.getCurrentStackAddendum(element); | |
| } | |
| } | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Failed %s type: %s%s', location, error.message, componentStackInfo) : void 0; | |
| } | |
| } | |
| } | |
| } | |
| module.exports = checkReactTypeSpec; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaGVja1JlYWN0VHlwZVNwZWMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIGNoZWNrUmVhY3RUeXBlU3BlY1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcycpO1xudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAvLyBUZW1wb3JhcnkgaGFjay5cbiAgLy8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2VsbCB3aXRoIEplc3Q6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0MFxuICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTc4XG4gIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9vYmplY3R9IGVsZW1lbnQgVGhlIFJlYWN0IGVsZW1lbnQgdGhhdCBpcyBiZWluZyB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7P251bWJlcn0gZGVidWdJRCBUaGUgUmVhY3QgY29tcG9uZW50IGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50LCBkZWJ1Z0lEKSB7XG4gIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgIHZhciBlcnJvcjtcbiAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAhKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSBSZWFjdC5Qcm9wVHlwZXMuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiBfcHJvZEludmFyaWFudCgnODQnLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lKSA6IHZvaWQgMDtcbiAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGVycm9yID0gZXg7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghZXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciwgJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvcikgOiB2b2lkIDA7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICB2YXIgY29tcG9uZW50U3RhY2tJbmZvID0gJyc7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhvb2spIHtcbiAgICAgICAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlYnVnSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlvbiwgZXJyb3IubWVzc2FnZSwgY29tcG9uZW50U3RhY2tJbmZvKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7Il19 | |
| },{"./ReactComponentTreeHook":8,"./ReactPropTypeLocationNames":14,"./ReactPropTypesSecret":17,"./reactProdInvariant":24,"_process":1,"fbjs/lib/invariant":28,"fbjs/lib/warning":31}],22:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule getIteratorFn | |
| * | |
| */ | |
| 'use strict'; | |
| /* global Symbol */ | |
| var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; | |
| var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. | |
| /** | |
| * Returns the iterator method function contained on the iterable object. | |
| * | |
| * Be sure to invoke the function with the iterable as context: | |
| * | |
| * var iteratorFn = getIteratorFn(myIterable); | |
| * if (iteratorFn) { | |
| * var iterator = iteratorFn.call(myIterable); | |
| * ... | |
| * } | |
| * | |
| * @param {?object} maybeIterable | |
| * @return {?function} | |
| */ | |
| function getIteratorFn(maybeIterable) { | |
| var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); | |
| if (typeof iteratorFn === 'function') { | |
| return iteratorFn; | |
| } | |
| } | |
| module.exports = getIteratorFn; | |
| },{}],23:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule onlyChild | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var ReactElement = require('./ReactElement'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| /** | |
| * Returns the first child in a collection of children and verifies that there | |
| * is only one child in the collection. | |
| * | |
| * See https://facebook.github.io/react/docs/top-level-api.html#react.children.only | |
| * | |
| * The current implementation of this function assumes that a single child gets | |
| * passed without a wrapper, but the purpose of this helper function is to | |
| * abstract away the particular structure of children. | |
| * | |
| * @param {?object} children Child collection structure. | |
| * @return {ReactElement} The first and only `ReactElement` contained in the | |
| * structure. | |
| */ | |
| function onlyChild(children) { | |
| !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'React.Children.only expected to receive a single React element child.') : _prodInvariant('143') : void 0; | |
| return children; | |
| } | |
| module.exports = onlyChild; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9vbmx5Q2hpbGQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBvbmx5Q2hpbGRcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gICFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MycpIDogdm9pZCAwO1xuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb25seUNoaWxkOyJdfQ== | |
| },{"./ReactElement":11,"./reactProdInvariant":24,"_process":1,"fbjs/lib/invariant":28}],24:[function(require,module,exports){ | |
| /** | |
| * Copyright (c) 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule reactProdInvariant | |
| * | |
| */ | |
| 'use strict'; | |
| /** | |
| * WARNING: DO NOT manually require this module. | |
| * This is a replacement for `invariant(...)` used by the error code system | |
| * and will _only_ be required by the corresponding babel pass. | |
| * It always throws. | |
| */ | |
| function reactProdInvariant(code) { | |
| var argCount = arguments.length - 1; | |
| var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code; | |
| for (var argIdx = 0; argIdx < argCount; argIdx++) { | |
| message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]); | |
| } | |
| message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.'; | |
| var error = new Error(message); | |
| error.name = 'Invariant Violation'; | |
| error.framesToPop = 1; // we don't care about reactProdInvariant's own frame | |
| throw error; | |
| } | |
| module.exports = reactProdInvariant; | |
| },{}],25:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule traverseAllChildren | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var ReactCurrentOwner = require('./ReactCurrentOwner'); | |
| var ReactElement = require('./ReactElement'); | |
| var getIteratorFn = require('./getIteratorFn'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| var KeyEscapeUtils = require('./KeyEscapeUtils'); | |
| var warning = require('fbjs/lib/warning'); | |
| var SEPARATOR = '.'; | |
| var SUBSEPARATOR = ':'; | |
| /** | |
| * TODO: Test that a single child and an array with one item have the same key | |
| * pattern. | |
| */ | |
| var didWarnAboutMaps = false; | |
| /** | |
| * Generate a key string that identifies a component within a set. | |
| * | |
| * @param {*} component A component that could contain a manual key. | |
| * @param {number} index Index that is used if a manual key is not provided. | |
| * @return {string} | |
| */ | |
| function getComponentKey(component, index) { | |
| // Do some typechecking here since we call this blindly. We want to ensure | |
| // that we don't block potential future ES APIs. | |
| if (component && typeof component === 'object' && component.key != null) { | |
| // Explicit key | |
| return KeyEscapeUtils.escape(component.key); | |
| } | |
| // Implicit key determined by the index in the set | |
| return index.toString(36); | |
| } | |
| /** | |
| * @param {?*} children Children tree container. | |
| * @param {!string} nameSoFar Name of the key path so far. | |
| * @param {!function} callback Callback to invoke with each child found. | |
| * @param {?*} traverseContext Used to pass information throughout the traversal | |
| * process. | |
| * @return {!number} The number of children in this subtree. | |
| */ | |
| function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) { | |
| var type = typeof children; | |
| if (type === 'undefined' || type === 'boolean') { | |
| // All of the above are perceived as null. | |
| children = null; | |
| } | |
| if (children === null || type === 'string' || type === 'number' || ReactElement.isValidElement(children)) { | |
| callback(traverseContext, children, | |
| // If it's the only child, treat the name as if it was wrapped in an array | |
| // so that it's consistent if the number of children grows. | |
| nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar); | |
| return 1; | |
| } | |
| var child; | |
| var nextName; | |
| var subtreeCount = 0; // Count of children found in the current subtree. | |
| var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; | |
| if (Array.isArray(children)) { | |
| for (var i = 0; i < children.length; i++) { | |
| child = children[i]; | |
| nextName = nextNamePrefix + getComponentKey(child, i); | |
| subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); | |
| } | |
| } else { | |
| var iteratorFn = getIteratorFn(children); | |
| if (iteratorFn) { | |
| var iterator = iteratorFn.call(children); | |
| var step; | |
| if (iteratorFn !== children.entries) { | |
| var ii = 0; | |
| while (!(step = iterator.next()).done) { | |
| child = step.value; | |
| nextName = nextNamePrefix + getComponentKey(child, ii++); | |
| subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); | |
| } | |
| } else { | |
| if (process.env.NODE_ENV !== 'production') { | |
| var mapsAsChildrenAddendum = ''; | |
| if (ReactCurrentOwner.current) { | |
| var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName(); | |
| if (mapsAsChildrenOwnerName) { | |
| mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.'; | |
| } | |
| } | |
| process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.%s', mapsAsChildrenAddendum) : void 0; | |
| didWarnAboutMaps = true; | |
| } | |
| // Iterator will provide entry [k,v] tuples rather than values. | |
| while (!(step = iterator.next()).done) { | |
| var entry = step.value; | |
| if (entry) { | |
| child = entry[1]; | |
| nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0); | |
| subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); | |
| } | |
| } | |
| } | |
| } else if (type === 'object') { | |
| var addendum = ''; | |
| if (process.env.NODE_ENV !== 'production') { | |
| addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.'; | |
| if (children._isReactElement) { | |
| addendum = ' It looks like you\'re using an element created by a different ' + 'version of React. Make sure to use only one copy of React.'; | |
| } | |
| if (ReactCurrentOwner.current) { | |
| var name = ReactCurrentOwner.current.getName(); | |
| if (name) { | |
| addendum += ' Check the render method of `' + name + '`.'; | |
| } | |
| } | |
| } | |
| var childrenString = String(children); | |
| !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0; | |
| } | |
| } | |
| return subtreeCount; | |
| } | |
| /** | |
| * Traverses children that are typically specified as `props.children`, but | |
| * might also be specified through attributes: | |
| * | |
| * - `traverseAllChildren(this.props.children, ...)` | |
| * - `traverseAllChildren(this.props.leftPanelChildren, ...)` | |
| * | |
| * The `traverseContext` is an optional argument that is passed through the | |
| * entire traversal. It can be used to store accumulations or anything else that | |
| * the callback might find relevant. | |
| * | |
| * @param {?*} children Children tree object. | |
| * @param {!function} callback To invoke upon traversing each child. | |
| * @param {?*} traverseContext Context for traversal. | |
| * @return {!number} The number of children in this subtree. | |
| */ | |
| function traverseAllChildren(children, callback, traverseContext) { | |
| if (children == null) { | |
| return 0; | |
| } | |
| return traverseAllChildrenImpl(children, '', callback, traverseContext); | |
| } | |
| module.exports = traverseAllChildren; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgdHJhdmVyc2VBbGxDaGlsZHJlblxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG5cbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTtcbiAgfVxuICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwgUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIGNhbGxiYWNrKHRyYXZlcnNlQ29udGV4dCwgY2hpbGRyZW4sXG4gICAgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLlxuICAgIG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcbiAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IGNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGlpID0gMDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcnO1xuICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICAgIGlmIChtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07XG4gICAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKSArIFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7XG4gICAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZCBvciB3cmFwIHRoZSBvYmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICsgJ1JlYWN0IGFkZC1vbnMuJztcbiAgICAgICAgaWYgKGNoaWxkcmVuLl9pc1JlYWN0RWxlbWVudCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBJdCBsb29rcyBsaWtlIHlvdVxcJ3JlIHVzaW5nIGFuIGVsZW1lbnQgY3JlYXRlZCBieSBhIGRpZmZlcmVudCAnICsgJ3ZlcnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFjdC4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgYWRkZW5kdW0gKz0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogX3Byb2RJbnZhcmlhbnQoJzMxJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLCBidXRcbiAqIG1pZ2h0IGFsc28gYmUgc3BlY2lmaWVkIHRocm91Z2ggYXR0cmlidXRlczpcbiAqXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4sIC4uLilgXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMubGVmdFBhbmVsQ2hpbGRyZW4sIC4uLilgXG4gKlxuICogVGhlIGB0cmF2ZXJzZUNvbnRleHRgIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggdGhlXG4gKiBlbnRpcmUgdHJhdmVyc2FsLiBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhY2N1bXVsYXRpb25zIG9yIGFueXRoaW5nIGVsc2UgdGhhdFxuICogdGhlIGNhbGxiYWNrIG1pZ2h0IGZpbmQgcmVsZXZhbnQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBvYmplY3QuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgVG8gaW52b2tlIHVwb24gdHJhdmVyc2luZyBlYWNoIGNoaWxkLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgZm9yIHRyYXZlcnNhbC5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sICcnLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmF2ZXJzZUFsbENoaWxkcmVuOyJdfQ== | |
| },{"./KeyEscapeUtils":2,"./ReactCurrentOwner":9,"./ReactElement":11,"./getIteratorFn":22,"./reactProdInvariant":24,"_process":1,"fbjs/lib/invariant":28,"fbjs/lib/warning":31}],26:[function(require,module,exports){ | |
| "use strict"; | |
| /** | |
| * Copyright (c) 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * | |
| */ | |
| function makeEmptyFunction(arg) { | |
| return function () { | |
| return arg; | |
| }; | |
| } | |
| /** | |
| * This function accepts and discards inputs; it has no side effects. This is | |
| * primarily useful idiomatically for overridable function endpoints which | |
| * always need to be callable, since JS lacks a null-call idiom ala Cocoa. | |
| */ | |
| var emptyFunction = function emptyFunction() {}; | |
| emptyFunction.thatReturns = makeEmptyFunction; | |
| emptyFunction.thatReturnsFalse = makeEmptyFunction(false); | |
| emptyFunction.thatReturnsTrue = makeEmptyFunction(true); | |
| emptyFunction.thatReturnsNull = makeEmptyFunction(null); | |
| emptyFunction.thatReturnsThis = function () { | |
| return this; | |
| }; | |
| emptyFunction.thatReturnsArgument = function (arg) { | |
| return arg; | |
| }; | |
| module.exports = emptyFunction; | |
| },{}],27:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright (c) 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| */ | |
| 'use strict'; | |
| var emptyObject = {}; | |
| if (process.env.NODE_ENV !== 'production') { | |
| Object.freeze(emptyObject); | |
| } | |
| module.exports = emptyObject; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eU9iamVjdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZW1wdHlPYmplY3Q7Il19 | |
| },{"_process":1}],28:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright (c) 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| */ | |
| 'use strict'; | |
| /** | |
| * Use invariant() to assert state which your program assumes to be true. | |
| * | |
| * Provide sprintf-style format (only %s is supported) and arguments | |
| * to provide information about what broke and what you were | |
| * expecting. | |
| * | |
| * The invariant message will be stripped in production, but the invariant | |
| * will remain to ensure logic does not differ in production. | |
| */ | |
| function invariant(condition, format, a, b, c, d, e, f) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| if (format === undefined) { | |
| throw new Error('invariant requires an error message argument'); | |
| } | |
| } | |
| if (!condition) { | |
| var error; | |
| if (format === undefined) { | |
| error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); | |
| } else { | |
| var args = [a, b, c, d, e, f]; | |
| var argIndex = 0; | |
| error = new Error(format.replace(/%s/g, function () { | |
| return args[argIndex++]; | |
| })); | |
| error.name = 'Invariant Violation'; | |
| } | |
| error.framesToPop = 1; // we don't care about invariant's own frame | |
| throw error; | |
| } | |
| } | |
| module.exports = invariant; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9pbnZhcmlhbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50OyJdfQ== | |
| },{"_process":1}],29:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright (c) 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @typechecks static-only | |
| */ | |
| 'use strict'; | |
| var invariant = require('./invariant'); | |
| /** | |
| * Constructs an enumeration with keys equal to their value. | |
| * | |
| * For example: | |
| * | |
| * var COLORS = keyMirror({blue: null, red: null}); | |
| * var myColor = COLORS.blue; | |
| * var isColorValid = !!COLORS[myColor]; | |
| * | |
| * The last line could not be performed if the values of the generated enum were | |
| * not equal to their keys. | |
| * | |
| * Input: {key1: val1, key2: val2} | |
| * Output: {key1: key1, key2: key2} | |
| * | |
| * @param {object} obj | |
| * @return {object} | |
| */ | |
| var keyMirror = function keyMirror(obj) { | |
| var ret = {}; | |
| var key; | |
| !(obj instanceof Object && !Array.isArray(obj)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'keyMirror(...): Argument must be an object.') : invariant(false) : void 0; | |
| for (key in obj) { | |
| if (!obj.hasOwnProperty(key)) { | |
| continue; | |
| } | |
| ret[key] = key; | |
| } | |
| return ret; | |
| }; | |
| module.exports = keyMirror; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9rZXlNaXJyb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrcyBzdGF0aWMtb25seVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJy4vaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhbiBlbnVtZXJhdGlvbiB3aXRoIGtleXMgZXF1YWwgdG8gdGhlaXIgdmFsdWUuXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICB2YXIgQ09MT1JTID0ga2V5TWlycm9yKHtibHVlOiBudWxsLCByZWQ6IG51bGx9KTtcbiAqICAgdmFyIG15Q29sb3IgPSBDT0xPUlMuYmx1ZTtcbiAqICAgdmFyIGlzQ29sb3JWYWxpZCA9ICEhQ09MT1JTW215Q29sb3JdO1xuICpcbiAqIFRoZSBsYXN0IGxpbmUgY291bGQgbm90IGJlIHBlcmZvcm1lZCBpZiB0aGUgdmFsdWVzIG9mIHRoZSBnZW5lcmF0ZWQgZW51bSB3ZXJlXG4gKiBub3QgZXF1YWwgdG8gdGhlaXIga2V5cy5cbiAqXG4gKiAgIElucHV0OiAge2tleTE6IHZhbDEsIGtleTI6IHZhbDJ9XG4gKiAgIE91dHB1dDoge2tleTE6IGtleTEsIGtleTI6IGtleTJ9XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG52YXIga2V5TWlycm9yID0gZnVuY3Rpb24ga2V5TWlycm9yKG9iaikge1xuICB2YXIgcmV0ID0ge307XG4gIHZhciBrZXk7XG4gICEob2JqIGluc3RhbmNlb2YgT2JqZWN0ICYmICFBcnJheS5pc0FycmF5KG9iaikpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2tleU1pcnJvciguLi4pOiBBcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGZvciAoa2V5IGluIG9iaikge1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXRba2V5XSA9IGtleTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBrZXlNaXJyb3I7Il19 | |
| },{"./invariant":28,"_process":1}],30:[function(require,module,exports){ | |
| "use strict"; | |
| /** | |
| * Copyright (c) 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| */ | |
| /** | |
| * Allows extraction of a minified key. Let's the build system minify keys | |
| * without losing the ability to dynamically use key strings as values | |
| * themselves. Pass in an object with a single key/val pair and it will return | |
| * you the string key of that single record. Suppose you want to grab the | |
| * value for a key 'className' inside of an object. Key/val minification may | |
| * have aliased that key to be 'xa12'. keyOf({className: null}) will return | |
| * 'xa12' in that case. Resolve keys you want to use once at startup time, then | |
| * reuse those resolutions. | |
| */ | |
| var keyOf = function keyOf(oneKeyObj) { | |
| var key; | |
| for (key in oneKeyObj) { | |
| if (!oneKeyObj.hasOwnProperty(key)) { | |
| continue; | |
| } | |
| return key; | |
| } | |
| return null; | |
| }; | |
| module.exports = keyOf; | |
| },{}],31:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2014-2015, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| */ | |
| 'use strict'; | |
| var emptyFunction = require('./emptyFunction'); | |
| /** | |
| * Similar to invariant but only logs a warning if the condition is not met. | |
| * This can be used to log issues in development environments in critical | |
| * paths. Removing the logging code for production environments will keep the | |
| * same logic and follow the same code paths. | |
| */ | |
| var warning = emptyFunction; | |
| if (process.env.NODE_ENV !== 'production') { | |
| (function () { | |
| var printWarning = function printWarning(format) { | |
| for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | |
| args[_key - 1] = arguments[_key]; | |
| } | |
| var argIndex = 0; | |
| var message = 'Warning: ' + format.replace(/%s/g, function () { | |
| return args[argIndex++]; | |
| }); | |
| if (typeof console !== 'undefined') { | |
| console.error(message); | |
| } | |
| try { | |
| // --- Welcome to debugging React --- | |
| // This error was thrown as a convenience so that you can use this stack | |
| // to find the callsite that caused this warning to fire. | |
| throw new Error(message); | |
| } catch (x) {} | |
| }; | |
| warning = function warning(condition, format) { | |
| if (format === undefined) { | |
| throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); | |
| } | |
| if (format.indexOf('Failed Composite propType: ') === 0) { | |
| return; // Ignore CompositeComponent proptype check. | |
| } | |
| if (!condition) { | |
| for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { | |
| args[_key2 - 2] = arguments[_key2]; | |
| } | |
| printWarning.apply(undefined, [format].concat(args)); | |
| } | |
| }; | |
| })(); | |
| } | |
| module.exports = warning; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi93YXJuaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gZW1wdHlGdW5jdGlvbjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCAoeCkge31cbiAgICB9O1xuXG4gICAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQpIHtcbiAgICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybWF0LmluZGV4T2YoJ0ZhaWxlZCBDb21wb3NpdGUgcHJvcFR5cGU6ICcpID09PSAwKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JlIENvbXBvc2l0ZUNvbXBvbmVudCBwcm9wdHlwZSBjaGVjay5cbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDogMCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFdhcm5pbmcuYXBwbHkodW5kZWZpbmVkLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZzsiXX0= | |
| },{"./emptyFunction":26,"_process":1}],32:[function(require,module,exports){ | |
| 'use strict'; | |
| /* eslint-disable no-unused-vars */ | |
| var hasOwnProperty = Object.prototype.hasOwnProperty; | |
| var propIsEnumerable = Object.prototype.propertyIsEnumerable; | |
| function toObject(val) { | |
| if (val === null || val === undefined) { | |
| throw new TypeError('Object.assign cannot be called with null or undefined'); | |
| } | |
| return Object(val); | |
| } | |
| function shouldUseNative() { | |
| try { | |
| if (!Object.assign) { | |
| return false; | |
| } | |
| // Detect buggy property enumeration order in older V8 versions. | |
| // https://bugs.chromium.org/p/v8/issues/detail?id=4118 | |
| var test1 = new String('abc'); // eslint-disable-line | |
| test1[5] = 'de'; | |
| if (Object.getOwnPropertyNames(test1)[0] === '5') { | |
| return false; | |
| } | |
| // https://bugs.chromium.org/p/v8/issues/detail?id=3056 | |
| var test2 = {}; | |
| for (var i = 0; i < 10; i++) { | |
| test2['_' + String.fromCharCode(i)] = i; | |
| } | |
| var order2 = Object.getOwnPropertyNames(test2).map(function (n) { | |
| return test2[n]; | |
| }); | |
| if (order2.join('') !== '0123456789') { | |
| return false; | |
| } | |
| // https://bugs.chromium.org/p/v8/issues/detail?id=3056 | |
| var test3 = {}; | |
| 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { | |
| test3[letter] = letter; | |
| }); | |
| if (Object.keys(Object.assign({}, test3)).join('') !== | |
| 'abcdefghijklmnopqrst') { | |
| return false; | |
| } | |
| return true; | |
| } catch (e) { | |
| // We don't expect any of the above to throw, but better to be safe. | |
| return false; | |
| } | |
| } | |
| module.exports = shouldUseNative() ? Object.assign : function (target, source) { | |
| var from; | |
| var to = toObject(target); | |
| var symbols; | |
| for (var s = 1; s < arguments.length; s++) { | |
| from = Object(arguments[s]); | |
| for (var key in from) { | |
| if (hasOwnProperty.call(from, key)) { | |
| to[key] = from[key]; | |
| } | |
| } | |
| if (Object.getOwnPropertySymbols) { | |
| symbols = Object.getOwnPropertySymbols(from); | |
| for (var i = 0; i < symbols.length; i++) { | |
| if (propIsEnumerable.call(from, symbols[i])) { | |
| to[symbols[i]] = from[symbols[i]]; | |
| } | |
| } | |
| } | |
| } | |
| return to; | |
| }; | |
| },{}],"react":[function(require,module,exports){ | |
| 'use strict'; | |
| module.exports = require('./lib/React'); | |
| },{"./lib/React":4}]},{},[]) | |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImxpYi9LZXlFc2NhcGVVdGlscy5qcyIsImxpYi9Qb29sZWRDbGFzcy5qcyIsImxpYi9SZWFjdC5qcyIsImxpYi9SZWFjdENoaWxkcmVuLmpzIiwibGliL1JlYWN0Q2xhc3MuanMiLCJsaWIvUmVhY3RDb21wb25lbnQuanMiLCJsaWIvUmVhY3RDb21wb25lbnRUcmVlSG9vay5qcyIsImxpYi9SZWFjdEN1cnJlbnRPd25lci5qcyIsImxpYi9SZWFjdERPTUZhY3Rvcmllcy5qcyIsImxpYi9SZWFjdEVsZW1lbnQuanMiLCJsaWIvUmVhY3RFbGVtZW50VmFsaWRhdG9yLmpzIiwibGliL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlLmpzIiwibGliL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzLmpzIiwibGliL1JlYWN0UHJvcFR5cGVMb2NhdGlvbnMuanMiLCJsaWIvUmVhY3RQcm9wVHlwZXMuanMiLCJsaWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJsaWIvUmVhY3RQdXJlQ29tcG9uZW50LmpzIiwibGliL1JlYWN0VmVyc2lvbi5qcyIsImxpYi9jYW5EZWZpbmVQcm9wZXJ0eS5qcyIsImxpYi9jaGVja1JlYWN0VHlwZVNwZWMuanMiLCJsaWIvZ2V0SXRlcmF0b3JGbi5qcyIsImxpYi9vbmx5Q2hpbGQuanMiLCJsaWIvcmVhY3RQcm9kSW52YXJpYW50LmpzIiwibGliL3RyYXZlcnNlQWxsQ2hpbGRyZW4uanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvZW1wdHlGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eU9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIva2V5TWlycm9yLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2tleU9mLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL3dhcm5pbmcuanMiLCJub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsInJlYWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzl0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxucHJvY2Vzcy5uZXh0VGljayA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNhblNldEltbWVkaWF0ZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnNldEltbWVkaWF0ZTtcbiAgICB2YXIgY2FuTXV0YXRpb25PYnNlcnZlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICBpZiAoY2FuTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICB2YXIgaGlkZGVuRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXVlTGlzdCA9IHF1ZXVlLnNsaWNlKCk7XG4gICAgICAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgcXVldWVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGhpZGRlbkRpdiwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBoaWRkZW5EaXYuc2V0QXR0cmlidXRlKCd5ZXMnLCAnbm8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjYW5Qb3N0KSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXYuc291cmNlO1xuICAgICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBLZXlFc2NhcGVVdGlsc1xuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuXG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuXG4vKipcbiAqIFVuZXNjYXBlIGFuZCB1bndyYXAga2V5IGZvciBodW1hbi1yZWFkYWJsZSBkaXNwbGF5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byB1bmVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHVuZXNjYXBlZCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlKGtleSkge1xuICB2YXIgdW5lc2NhcGVSZWdleCA9IC8oPTB8PTIpL2c7XG4gIHZhciB1bmVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0wJzogJz0nLFxuICAgICc9Mic6ICc6J1xuICB9O1xuICB2YXIga2V5U3Vic3RyaW5nID0ga2V5WzBdID09PSAnLicgJiYga2V5WzFdID09PSAnJCcgPyBrZXkuc3Vic3RyaW5nKDIpIDoga2V5LnN1YnN0cmluZygxKTtcblxuICByZXR1cm4gKCcnICsga2V5U3Vic3RyaW5nKS5yZXBsYWNlKHVuZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiB1bmVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbn1cblxudmFyIEtleUVzY2FwZVV0aWxzID0ge1xuICBlc2NhcGU6IGVzY2FwZSxcbiAgdW5lc2NhcGU6IHVuZXNjYXBlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleUVzY2FwZVV0aWxzOyIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUG9vbGVkQ2xhc3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBTdGF0aWMgcG9vbGVycy4gU2V2ZXJhbCBjdXN0b20gdmVyc2lvbnMgZm9yIGVhY2ggcG90ZW50aWFsIG51bWJlciBvZlxuICogYXJndW1lbnRzLiBBIGNvbXBsZXRlbHkgZ2VuZXJpYyBwb29sZXIgaXMgZWFzeSB0byBpbXBsZW1lbnQsIGJ1dCB3b3VsZFxuICogcmVxdWlyZSBhY2Nlc3NpbmcgdGhlIGBhcmd1bWVudHNgIG9iamVjdC4gSW4gZWFjaCBvZiB0aGVzZSwgYHRoaXNgIHJlZmVycyB0b1xuICogdGhlIENsYXNzIGl0c2VsZiwgbm90IGFuIGluc3RhbmNlLiBJZiBhbnkgb3RoZXJzIGFyZSBuZWVkZWQsIHNpbXBseSBhZGQgdGhlbVxuICogaGVyZSwgb3IgaW4gdGhlaXIgb3duIGZpbGVzLlxuICovXG52YXIgb25lQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoY29weUZpZWxkc0Zyb20pIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgY29weUZpZWxkc0Zyb20pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGNvcHlGaWVsZHNGcm9tKTtcbiAgfVxufTtcblxudmFyIHR3b0FyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMikge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMik7XG4gIH1cbn07XG5cbnZhciB0aHJlZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMyk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMyk7XG4gIH1cbn07XG5cbnZhciBmb3VyQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMywgYTQpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMywgYTQpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMsIGE0KTtcbiAgfVxufTtcblxudmFyIGZpdmVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMywgYTQsIGE1KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzLCBhNCwgYTUpO1xuICB9XG59O1xuXG52YXIgc3RhbmRhcmRSZWxlYXNlciA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICAhKGluc3RhbmNlIGluc3RhbmNlb2YgS2xhc3MpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyeWluZyB0byByZWxlYXNlIGFuIGluc3RhbmNlIGludG8gYSBwb29sIG9mIGEgZGlmZmVyZW50IHR5cGUuJykgOiBfcHJvZEludmFyaWFudCgnMjUnKSA6IHZvaWQgMDtcbiAgaW5zdGFuY2UuZGVzdHJ1Y3RvcigpO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCA8IEtsYXNzLnBvb2xTaXplKSB7XG4gICAgS2xhc3MuaW5zdGFuY2VQb29sLnB1c2goaW5zdGFuY2UpO1xuICB9XG59O1xuXG52YXIgREVGQVVMVF9QT09MX1NJWkUgPSAxMDtcbnZhciBERUZBVUxUX1BPT0xFUiA9IG9uZUFyZ3VtZW50UG9vbGVyO1xuXG4vKipcbiAqIEF1Z21lbnRzIGBDb3B5Q29uc3RydWN0b3JgIHRvIGJlIGEgcG9vbGFibGUgY2xhc3MsIGF1Z21lbnRpbmcgb25seSB0aGUgY2xhc3NcbiAqIGl0c2VsZiAoc3RhdGljYWxseSkgbm90IGFkZGluZyBhbnkgcHJvdG90eXBpY2FsIGZpZWxkcy4gQW55IENvcHlDb25zdHJ1Y3RvclxuICogeW91IGdpdmUgdGhpcyBtYXkgaGF2ZSBhIGBwb29sU2l6ZWAgcHJvcGVydHksIGFuZCB3aWxsIGxvb2sgZm9yIGFcbiAqIHByb3RvdHlwaWNhbCBgZGVzdHJ1Y3RvcmAgb24gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IENvcHlDb25zdHJ1Y3RvciBDb25zdHJ1Y3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcG9vbGVyIEN1c3RvbWl6YWJsZSBwb29sZXIuXG4gKi9cbnZhciBhZGRQb29saW5nVG8gPSBmdW5jdGlvbiAoQ29weUNvbnN0cnVjdG9yLCBwb29sZXIpIHtcbiAgdmFyIE5ld0tsYXNzID0gQ29weUNvbnN0cnVjdG9yO1xuICBOZXdLbGFzcy5pbnN0YW5jZVBvb2wgPSBbXTtcbiAgTmV3S2xhc3MuZ2V0UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSO1xuICBpZiAoIU5ld0tsYXNzLnBvb2xTaXplKSB7XG4gICAgTmV3S2xhc3MucG9vbFNpemUgPSBERUZBVUxUX1BPT0xfU0laRTtcbiAgfVxuICBOZXdLbGFzcy5yZWxlYXNlID0gc3RhbmRhcmRSZWxlYXNlcjtcbiAgcmV0dXJuIE5ld0tsYXNzO1xufTtcblxudmFyIFBvb2xlZENsYXNzID0ge1xuICBhZGRQb29saW5nVG86IGFkZFBvb2xpbmdUbyxcbiAgb25lQXJndW1lbnRQb29sZXI6IG9uZUFyZ3VtZW50UG9vbGVyLFxuICB0d29Bcmd1bWVudFBvb2xlcjogdHdvQXJndW1lbnRQb29sZXIsXG4gIHRocmVlQXJndW1lbnRQb29sZXI6IHRocmVlQXJndW1lbnRQb29sZXIsXG4gIGZvdXJBcmd1bWVudFBvb2xlcjogZm91ckFyZ3VtZW50UG9vbGVyLFxuICBmaXZlQXJndW1lbnRQb29sZXI6IGZpdmVBcmd1bWVudFBvb2xlclxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBQb29sZWRDbGFzcztcbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW14cFlpOVFiMjlzWldSRGJHRnpjeTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMjl3ZVhKcFoyaDBJREl3TVRNdGNISmxjMlZ1ZEN3Z1JtRmpaV0p2YjJzc0lFbHVZeTVjYmlBcUlFRnNiQ0J5YVdkb2RITWdjbVZ6WlhKMlpXUXVYRzRnS2x4dUlDb2dWR2hwY3lCemIzVnlZMlVnWTI5a1pTQnBjeUJzYVdObGJuTmxaQ0IxYm1SbGNpQjBhR1VnUWxORUxYTjBlV3hsSUd4cFkyVnVjMlVnWm05MWJtUWdhVzRnZEdobFhHNGdLaUJNU1VORlRsTkZJR1pwYkdVZ2FXNGdkR2hsSUhKdmIzUWdaR2x5WldOMGIzSjVJRzltSUhSb2FYTWdjMjkxY21ObElIUnlaV1V1SUVGdUlHRmtaR2wwYVc5dVlXd2daM0poYm5SY2JpQXFJRzltSUhCaGRHVnVkQ0J5YVdkb2RITWdZMkZ1SUdKbElHWnZkVzVrSUdsdUlIUm9aU0JRUVZSRlRsUlRJR1pwYkdVZ2FXNGdkR2hsSUhOaGJXVWdaR2x5WldOMGIzSjVMbHh1SUNwY2JpQXFJRUJ3Y205MmFXUmxjMDF2WkhWc1pTQlFiMjlzWldSRGJHRnpjMXh1SUNvdlhHNWNiaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHVkbUZ5SUY5d2NtOWtTVzUyWVhKcFlXNTBJRDBnY21WeGRXbHlaU2duTGk5eVpXRmpkRkJ5YjJSSmJuWmhjbWxoYm5RbktUdGNibHh1ZG1GeUlHbHVkbUZ5YVdGdWRDQTlJSEpsY1hWcGNtVW9KMlppYW5NdmJHbGlMMmx1ZG1GeWFXRnVkQ2NwTzF4dVhHNHZLaXBjYmlBcUlGTjBZWFJwWXlCd2IyOXNaWEp6TGlCVFpYWmxjbUZzSUdOMWMzUnZiU0IyWlhKemFXOXVjeUJtYjNJZ1pXRmphQ0J3YjNSbGJuUnBZV3dnYm5WdFltVnlJRzltWEc0Z0tpQmhjbWQxYldWdWRITXVJRUVnWTI5dGNHeGxkR1ZzZVNCblpXNWxjbWxqSUhCdmIyeGxjaUJwY3lCbFlYTjVJSFJ2SUdsdGNHeGxiV1Z1ZEN3Z1luVjBJSGR2ZFd4a1hHNGdLaUJ5WlhGMWFYSmxJR0ZqWTJWemMybHVaeUIwYUdVZ1lHRnlaM1Z0Wlc1MGMyQWdiMkpxWldOMExpQkpiaUJsWVdOb0lHOW1JSFJvWlhObExDQmdkR2hwYzJBZ2NtVm1aWEp6SUhSdlhHNGdLaUIwYUdVZ1EyeGhjM01nYVhSelpXeG1MQ0J1YjNRZ1lXNGdhVzV6ZEdGdVkyVXVJRWxtSUdGdWVTQnZkR2hsY25NZ1lYSmxJRzVsWldSbFpDd2djMmx0Y0d4NUlHRmtaQ0IwYUdWdFhHNGdLaUJvWlhKbExDQnZjaUJwYmlCMGFHVnBjaUJ2ZDI0Z1ptbHNaWE11WEc0Z0tpOWNiblpoY2lCdmJtVkJjbWQxYldWdWRGQnZiMnhsY2lBOUlHWjFibU4wYVc5dUlDaGpiM0I1Um1sbGJHUnpSbkp2YlNrZ2UxeHVJQ0IyWVhJZ1MyeGhjM01nUFNCMGFHbHpPMXh1SUNCcFppQW9TMnhoYzNNdWFXNXpkR0Z1WTJWUWIyOXNMbXhsYm1kMGFDa2dlMXh1SUNBZ0lIWmhjaUJwYm5OMFlXNWpaU0E5SUV0c1lYTnpMbWx1YzNSaGJtTmxVRzl2YkM1d2IzQW9LVHRjYmlBZ0lDQkxiR0Z6Y3k1allXeHNLR2x1YzNSaGJtTmxMQ0JqYjNCNVJtbGxiR1J6Um5KdmJTazdYRzRnSUNBZ2NtVjBkWEp1SUdsdWMzUmhibU5sTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhKbGRIVnliaUJ1WlhjZ1MyeGhjM01vWTI5d2VVWnBaV3hrYzBaeWIyMHBPMXh1SUNCOVhHNTlPMXh1WEc1MllYSWdkSGR2UVhKbmRXMWxiblJRYjI5c1pYSWdQU0JtZFc1amRHbHZiaUFvWVRFc0lHRXlLU0I3WEc0Z0lIWmhjaUJMYkdGemN5QTlJSFJvYVhNN1hHNGdJR2xtSUNoTGJHRnpjeTVwYm5OMFlXNWpaVkJ2YjJ3dWJHVnVaM1JvS1NCN1hHNGdJQ0FnZG1GeUlHbHVjM1JoYm1ObElEMGdTMnhoYzNNdWFXNXpkR0Z1WTJWUWIyOXNMbkJ2Y0NncE8xeHVJQ0FnSUV0c1lYTnpMbU5oYkd3b2FXNXpkR0Z1WTJVc0lHRXhMQ0JoTWlrN1hHNGdJQ0FnY21WMGRYSnVJR2x1YzNSaGJtTmxPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnUzJ4aGMzTW9ZVEVzSUdFeUtUdGNiaUFnZlZ4dWZUdGNibHh1ZG1GeUlIUm9jbVZsUVhKbmRXMWxiblJRYjI5c1pYSWdQU0JtZFc1amRHbHZiaUFvWVRFc0lHRXlMQ0JoTXlrZ2UxeHVJQ0IyWVhJZ1MyeGhjM01nUFNCMGFHbHpPMXh1SUNCcFppQW9TMnhoYzNNdWFXNXpkR0Z1WTJWUWIyOXNMbXhsYm1kMGFDa2dlMXh1SUNBZ0lIWmhjaUJwYm5OMFlXNWpaU0E5SUV0c1lYTnpMbWx1YzNSaGJtTmxVRzl2YkM1d2IzQW9LVHRjYmlBZ0lDQkxiR0Z6Y3k1allXeHNLR2x1YzNSaGJtTmxMQ0JoTVN3Z1lUSXNJR0V6S1R0Y2JpQWdJQ0J5WlhSMWNtNGdhVzV6ZEdGdVkyVTdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdjbVYwZFhKdUlHNWxkeUJMYkdGemN5aGhNU3dnWVRJc0lHRXpLVHRjYmlBZ2ZWeHVmVHRjYmx4dWRtRnlJR1p2ZFhKQmNtZDFiV1Z1ZEZCdmIyeGxjaUE5SUdaMWJtTjBhVzl1SUNoaE1Td2dZVElzSUdFekxDQmhOQ2tnZTF4dUlDQjJZWElnUzJ4aGMzTWdQU0IwYUdsek8xeHVJQ0JwWmlBb1MyeGhjM011YVc1emRHRnVZMlZRYjI5c0xteGxibWQwYUNrZ2UxeHVJQ0FnSUhaaGNpQnBibk4wWVc1alpTQTlJRXRzWVhOekxtbHVjM1JoYm1ObFVHOXZiQzV3YjNBb0tUdGNiaUFnSUNCTGJHRnpjeTVqWVd4c0tHbHVjM1JoYm1ObExDQmhNU3dnWVRJc0lHRXpMQ0JoTkNrN1hHNGdJQ0FnY21WMGRYSnVJR2x1YzNSaGJtTmxPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnUzJ4aGMzTW9ZVEVzSUdFeUxDQmhNeXdnWVRRcE8xeHVJQ0I5WEc1OU8xeHVYRzUyWVhJZ1ptbDJaVUZ5WjNWdFpXNTBVRzl2YkdWeUlEMGdablZ1WTNScGIyNGdLR0V4TENCaE1pd2dZVE1zSUdFMExDQmhOU2tnZTF4dUlDQjJZWElnUzJ4aGMzTWdQU0IwYUdsek8xeHVJQ0JwWmlBb1MyeGhjM011YVc1emRHRnVZMlZRYjI5c0xteGxibWQwYUNrZ2UxeHVJQ0FnSUhaaGNpQnBibk4wWVc1alpTQTlJRXRzWVhOekxtbHVjM1JoYm1ObFVHOXZiQzV3YjNBb0tUdGNiaUFnSUNCTGJHRnpjeTVqWVd4c0tHbHVjM1JoYm1ObExDQmhNU3dnWVRJc0lHRXpMQ0JoTkN3Z1lUVXBPMXh1SUNBZ0lISmxkSFZ5YmlCcGJuTjBZVzVqWlR0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCeVpYUjFjbTRnYm1WM0lFdHNZWE56S0dFeExDQmhNaXdnWVRNc0lHRTBMQ0JoTlNrN1hHNGdJSDFjYm4wN1hHNWNiblpoY2lCemRHRnVaR0Z5WkZKbGJHVmhjMlZ5SUQwZ1puVnVZM1JwYjI0Z0tHbHVjM1JoYm1ObEtTQjdYRzRnSUhaaGNpQkxiR0Z6Y3lBOUlIUm9hWE03WEc0Z0lDRW9hVzV6ZEdGdVkyVWdhVzV6ZEdGdVkyVnZaaUJMYkdGemN5a2dQeUJ3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuSUQ4Z2FXNTJZWEpwWVc1MEtHWmhiSE5sTENBblZISjVhVzVuSUhSdklISmxiR1ZoYzJVZ1lXNGdhVzV6ZEdGdVkyVWdhVzUwYnlCaElIQnZiMndnYjJZZ1lTQmthV1ptWlhKbGJuUWdkSGx3WlM0bktTQTZJRjl3Y205a1NXNTJZWEpwWVc1MEtDY3lOU2NwSURvZ2RtOXBaQ0F3TzF4dUlDQnBibk4wWVc1alpTNWtaWE4wY25WamRHOXlLQ2s3WEc0Z0lHbG1JQ2hMYkdGemN5NXBibk4wWVc1alpWQnZiMnd1YkdWdVozUm9JRHdnUzJ4aGMzTXVjRzl2YkZOcGVtVXBJSHRjYmlBZ0lDQkxiR0Z6Y3k1cGJuTjBZVzVqWlZCdmIyd3VjSFZ6YUNocGJuTjBZVzVqWlNrN1hHNGdJSDFjYm4wN1hHNWNiblpoY2lCRVJVWkJWVXhVWDFCUFQweGZVMGxhUlNBOUlERXdPMXh1ZG1GeUlFUkZSa0ZWVEZSZlVFOVBURVZTSUQwZ2IyNWxRWEpuZFcxbGJuUlFiMjlzWlhJN1hHNWNiaThxS2x4dUlDb2dRWFZuYldWdWRITWdZRU52Y0hsRGIyNXpkSEoxWTNSdmNtQWdkRzhnWW1VZ1lTQndiMjlzWVdKc1pTQmpiR0Z6Y3l3Z1lYVm5iV1Z1ZEdsdVp5QnZibXg1SUhSb1pTQmpiR0Z6YzF4dUlDb2dhWFJ6Wld4bUlDaHpkR0YwYVdOaGJHeDVLU0J1YjNRZ1lXUmthVzVuSUdGdWVTQndjbTkwYjNSNWNHbGpZV3dnWm1sbGJHUnpMaUJCYm5rZ1EyOXdlVU52Ym5OMGNuVmpkRzl5WEc0Z0tpQjViM1VnWjJsMlpTQjBhR2x6SUcxaGVTQm9ZWFpsSUdFZ1lIQnZiMnhUYVhwbFlDQndjbTl3WlhKMGVTd2dZVzVrSUhkcGJHd2diRzl2YXlCbWIzSWdZVnh1SUNvZ2NISnZkRzkwZVhCcFkyRnNJR0JrWlhOMGNuVmpkRzl5WUNCdmJpQnBibk4wWVc1alpYTXVYRzRnS2x4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdRMjl3ZVVOdmJuTjBjblZqZEc5eUlFTnZibk4wY25WamRHOXlJSFJvWVhRZ1kyRnVJR0psSUhWelpXUWdkRzhnY21WelpYUXVYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCd2IyOXNaWElnUTNWemRHOXRhWHBoWW14bElIQnZiMnhsY2k1Y2JpQXFMMXh1ZG1GeUlHRmtaRkJ2YjJ4cGJtZFVieUE5SUdaMWJtTjBhVzl1SUNoRGIzQjVRMjl1YzNSeWRXTjBiM0lzSUhCdmIyeGxjaWtnZTF4dUlDQjJZWElnVG1WM1MyeGhjM01nUFNCRGIzQjVRMjl1YzNSeWRXTjBiM0k3WEc0Z0lFNWxkMHRzWVhOekxtbHVjM1JoYm1ObFVHOXZiQ0E5SUZ0ZE8xeHVJQ0JPWlhkTGJHRnpjeTVuWlhSUWIyOXNaV1FnUFNCd2IyOXNaWElnZkh3Z1JFVkdRVlZNVkY5UVQwOU1SVkk3WEc0Z0lHbG1JQ2doVG1WM1MyeGhjM011Y0c5dmJGTnBlbVVwSUh0Y2JpQWdJQ0JPWlhkTGJHRnpjeTV3YjI5c1UybDZaU0E5SUVSRlJrRlZURlJmVUU5UFRGOVRTVnBGTzF4dUlDQjlYRzRnSUU1bGQwdHNZWE56TG5KbGJHVmhjMlVnUFNCemRHRnVaR0Z5WkZKbGJHVmhjMlZ5TzF4dUlDQnlaWFIxY200Z1RtVjNTMnhoYzNNN1hHNTlPMXh1WEc1MllYSWdVRzl2YkdWa1EyeGhjM01nUFNCN1hHNGdJR0ZrWkZCdmIyeHBibWRVYnpvZ1lXUmtVRzl2YkdsdVoxUnZMRnh1SUNCdmJtVkJjbWQxYldWdWRGQnZiMnhsY2pvZ2IyNWxRWEpuZFcxbGJuUlFiMjlzWlhJc1hHNGdJSFIzYjBGeVozVnRaVzUwVUc5dmJHVnlPaUIwZDI5QmNtZDFiV1Z1ZEZCdmIyeGxjaXhjYmlBZ2RHaHlaV1ZCY21kMWJXVnVkRkJ2YjJ4bGNqb2dkR2h5WldWQmNtZDFiV1Z1ZEZCdmIyeGxjaXhjYmlBZ1ptOTFja0Z5WjNWdFpXNTBVRzl2YkdWeU9pQm1iM1Z5UVhKbmRXMWxiblJRYjI5c1pYSXNYRzRnSUdacGRtVkJjbWQxYldWdWRGQnZiMnhsY2pvZ1ptbDJaVUZ5WjNWdFpXNTBVRzl2YkdWeVhHNTlPMXh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUZCdmIyeGxaRU5zWVhOek95SmRmUT09IiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBSZWFjdFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdENoaWxkcmVuID0gcmVxdWlyZSgnLi9SZWFjdENoaWxkcmVuJyk7XG52YXIgUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3RQdXJlQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdFB1cmVDb21wb25lbnQnKTtcbnZhciBSZWFjdENsYXNzID0gcmVxdWlyZSgnLi9SZWFjdENsYXNzJyk7XG52YXIgUmVhY3RET01GYWN0b3JpZXMgPSByZXF1aXJlKCcuL1JlYWN0RE9NRmFjdG9yaWVzJyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcbnZhciBSZWFjdFByb3BUeXBlcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZXMnKTtcbnZhciBSZWFjdFZlcnNpb24gPSByZXF1aXJlKCcuL1JlYWN0VmVyc2lvbicpO1xuXG52YXIgb25seUNoaWxkID0gcmVxdWlyZSgnLi9vbmx5Q2hpbGQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgY3JlYXRlRWxlbWVudCA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50O1xudmFyIGNyZWF0ZUZhY3RvcnkgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeTtcbnZhciBjbG9uZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY2xvbmVFbGVtZW50O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRWYWxpZGF0b3InKTtcbiAgY3JlYXRlRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVFbGVtZW50O1xuICBjcmVhdGVGYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUZhY3Rvcnk7XG4gIGNsb25lRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jbG9uZUVsZW1lbnQ7XG59XG5cbnZhciBfX3NwcmVhZCA9IF9hc3NpZ247XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgX19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmVkLCAnUmVhY3QuX19zcHJlYWQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBVc2UgJyArICdPYmplY3QuYXNzaWduIGRpcmVjdGx5IG9yIGFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIHdpdGggc2ltaWxhciAnICsgJ3NlbWFudGljcy4gWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byB5b3VyIGNvbXBpbGVyLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LXNwcmVhZC1kZXByZWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpIDogdm9pZCAwO1xuICAgIHdhcm5lZCA9IHRydWU7XG4gICAgcmV0dXJuIF9hc3NpZ24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxudmFyIFJlYWN0ID0ge1xuXG4gIC8vIE1vZGVyblxuXG4gIENoaWxkcmVuOiB7XG4gICAgbWFwOiBSZWFjdENoaWxkcmVuLm1hcCxcbiAgICBmb3JFYWNoOiBSZWFjdENoaWxkcmVuLmZvckVhY2gsXG4gICAgY291bnQ6IFJlYWN0Q2hpbGRyZW4uY291bnQsXG4gICAgdG9BcnJheTogUmVhY3RDaGlsZHJlbi50b0FycmF5LFxuICAgIG9ubHk6IG9ubHlDaGlsZFxuICB9LFxuXG4gIENvbXBvbmVudDogUmVhY3RDb21wb25lbnQsXG4gIFB1cmVDb21wb25lbnQ6IFJlYWN0UHVyZUNvbXBvbmVudCxcblxuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuICBjbG9uZUVsZW1lbnQ6IGNsb25lRWxlbWVudCxcbiAgaXNWYWxpZEVsZW1lbnQ6IFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCxcblxuICAvLyBDbGFzc2ljXG5cbiAgUHJvcFR5cGVzOiBSZWFjdFByb3BUeXBlcyxcbiAgY3JlYXRlQ2xhc3M6IFJlYWN0Q2xhc3MuY3JlYXRlQ2xhc3MsXG4gIGNyZWF0ZUZhY3Rvcnk6IGNyZWF0ZUZhY3RvcnksXG4gIGNyZWF0ZU1peGluOiBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICAvLyBDdXJyZW50bHkgYSBub29wLiBXaWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW5kIHRyYWNlIG1peGlucy5cbiAgICByZXR1cm4gbWl4aW47XG4gIH0sXG5cbiAgLy8gVGhpcyBsb29rcyBET00gc3BlY2lmaWMgYnV0IHRoZXNlIGFyZSBhY3R1YWxseSBpc29tb3JwaGljIGhlbHBlcnNcbiAgLy8gc2luY2UgdGhleSBhcmUganVzdCBnZW5lcmF0aW5nIERPTSBzdHJpbmdzLlxuICBET006IFJlYWN0RE9NRmFjdG9yaWVzLFxuXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICAvLyBEZXByZWNhdGVkIGhvb2sgZm9yIEpTWCBzcHJlYWQsIGRvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZy5cbiAgX19zcHJlYWQ6IF9fc3ByZWFkXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0O1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5U1pXRmpkQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvcVhHNGdLaUJEYjNCNWNtbG5hSFFnTWpBeE15MXdjbVZ6Wlc1MExDQkdZV05sWW05dmF5d2dTVzVqTGx4dUlDb2dRV3hzSUhKcFoyaDBjeUJ5WlhObGNuWmxaQzVjYmlBcVhHNGdLaUJVYUdseklITnZkWEpqWlNCamIyUmxJR2x6SUd4cFkyVnVjMlZrSUhWdVpHVnlJSFJvWlNCQ1UwUXRjM1I1YkdVZ2JHbGpaVzV6WlNCbWIzVnVaQ0JwYmlCMGFHVmNiaUFxSUV4SlEwVk9VMFVnWm1sc1pTQnBiaUIwYUdVZ2NtOXZkQ0JrYVhKbFkzUnZjbmtnYjJZZ2RHaHBjeUJ6YjNWeVkyVWdkSEpsWlM0Z1FXNGdZV1JrYVhScGIyNWhiQ0JuY21GdWRGeHVJQ29nYjJZZ2NHRjBaVzUwSUhKcFoyaDBjeUJqWVc0Z1ltVWdabTkxYm1RZ2FXNGdkR2hsSUZCQlZFVk9WRk1nWm1sc1pTQnBiaUIwYUdVZ2MyRnRaU0JrYVhKbFkzUnZjbmt1WEc0Z0tseHVJQ29nUUhCeWIzWnBaR1Z6VFc5a2RXeGxJRkpsWVdOMFhHNGdLaTljYmx4dUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc1MllYSWdYMkZ6YzJsbmJpQTlJSEpsY1hWcGNtVW9KMjlpYW1WamRDMWhjM05wWjI0bktUdGNibHh1ZG1GeUlGSmxZV04wUTJocGJHUnlaVzRnUFNCeVpYRjFhWEpsS0NjdUwxSmxZV04wUTJocGJHUnlaVzRuS1R0Y2JuWmhjaUJTWldGamRFTnZiWEJ2Ym1WdWRDQTlJSEpsY1hWcGNtVW9KeTR2VW1WaFkzUkRiMjF3YjI1bGJuUW5LVHRjYm5aaGNpQlNaV0ZqZEZCMWNtVkRiMjF3YjI1bGJuUWdQU0J5WlhGMWFYSmxLQ2N1TDFKbFlXTjBVSFZ5WlVOdmJYQnZibVZ1ZENjcE8xeHVkbUZ5SUZKbFlXTjBRMnhoYzNNZ1BTQnlaWEYxYVhKbEtDY3VMMUpsWVdOMFEyeGhjM01uS1R0Y2JuWmhjaUJTWldGamRFUlBUVVpoWTNSdmNtbGxjeUE5SUhKbGNYVnBjbVVvSnk0dlVtVmhZM1JFVDAxR1lXTjBiM0pwWlhNbktUdGNiblpoY2lCU1pXRmpkRVZzWlcxbGJuUWdQU0J5WlhGMWFYSmxLQ2N1TDFKbFlXTjBSV3hsYldWdWRDY3BPMXh1ZG1GeUlGSmxZV04wVUhKdmNGUjVjR1Z6SUQwZ2NtVnhkV2x5WlNnbkxpOVNaV0ZqZEZCeWIzQlVlWEJsY3ljcE8xeHVkbUZ5SUZKbFlXTjBWbVZ5YzJsdmJpQTlJSEpsY1hWcGNtVW9KeTR2VW1WaFkzUldaWEp6YVc5dUp5azdYRzVjYm5aaGNpQnZibXg1UTJocGJHUWdQU0J5WlhGMWFYSmxLQ2N1TDI5dWJIbERhR2xzWkNjcE8xeHVkbUZ5SUhkaGNtNXBibWNnUFNCeVpYRjFhWEpsS0NkbVltcHpMMnhwWWk5M1lYSnVhVzVuSnlrN1hHNWNiblpoY2lCamNtVmhkR1ZGYkdWdFpXNTBJRDBnVW1WaFkzUkZiR1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblE3WEc1MllYSWdZM0psWVhSbFJtRmpkRzl5ZVNBOUlGSmxZV04wUld4bGJXVnVkQzVqY21WaGRHVkdZV04wYjNKNU8xeHVkbUZ5SUdOc2IyNWxSV3hsYldWdWRDQTlJRkpsWVdOMFJXeGxiV1Z1ZEM1amJHOXVaVVZzWlcxbGJuUTdYRzVjYm1sbUlDaHdjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5LU0I3WEc0Z0lIWmhjaUJTWldGamRFVnNaVzFsYm5SV1lXeHBaR0YwYjNJZ1BTQnlaWEYxYVhKbEtDY3VMMUpsWVdOMFJXeGxiV1Z1ZEZaaGJHbGtZWFJ2Y2ljcE8xeHVJQ0JqY21WaGRHVkZiR1Z0Wlc1MElEMGdVbVZoWTNSRmJHVnRaVzUwVm1Gc2FXUmhkRzl5TG1OeVpXRjBaVVZzWlcxbGJuUTdYRzRnSUdOeVpXRjBaVVpoWTNSdmNua2dQU0JTWldGamRFVnNaVzFsYm5SV1lXeHBaR0YwYjNJdVkzSmxZWFJsUm1GamRHOXllVHRjYmlBZ1kyeHZibVZGYkdWdFpXNTBJRDBnVW1WaFkzUkZiR1Z0Wlc1MFZtRnNhV1JoZEc5eUxtTnNiMjVsUld4bGJXVnVkRHRjYm4xY2JseHVkbUZ5SUY5ZmMzQnlaV0ZrSUQwZ1gyRnpjMmxuYmp0Y2JseHVhV1lnS0hCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljcElIdGNiaUFnZG1GeUlIZGhjbTVsWkNBOUlHWmhiSE5sTzF4dUlDQmZYM053Y21WaFpDQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0J3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuSUQ4Z2QyRnlibWx1WnloM1lYSnVaV1FzSUNkU1pXRmpkQzVmWDNOd2NtVmhaQ0JwY3lCa1pYQnlaV05oZEdWa0lHRnVaQ0J6YUc5MWJHUWdibTkwSUdKbElIVnpaV1F1SUZWelpTQW5JQ3NnSjA5aWFtVmpkQzVoYzNOcFoyNGdaR2x5WldOMGJIa2diM0lnWVc1dmRHaGxjaUJvWld4d1pYSWdablZ1WTNScGIyNGdkMmwwYUNCemFXMXBiR0Z5SUNjZ0t5QW5jMlZ0WVc1MGFXTnpMaUJaYjNVZ2JXRjVJR0psSUhObFpXbHVaeUIwYUdseklIZGhjbTVwYm1jZ1pIVmxJSFJ2SUhsdmRYSWdZMjl0Y0dsc1pYSXVJQ2NnS3lBblUyVmxJR2gwZEhCek9pOHZabUl1YldVdmNtVmhZM1F0YzNCeVpXRmtMV1JsY0hKbFkyRjBhVzl1SUdadmNpQnRiM0psSUdSbGRHRnBiSE11SnlrZ09pQjJiMmxrSURBN1hHNGdJQ0FnZDJGeWJtVmtJRDBnZEhKMVpUdGNiaUFnSUNCeVpYUjFjbTRnWDJGemMybG5iaTVoY0hCc2VTaHVkV3hzTENCaGNtZDFiV1Z1ZEhNcE8xeHVJQ0I5TzF4dWZWeHVYRzUyWVhJZ1VtVmhZM1FnUFNCN1hHNWNiaUFnTHk4Z1RXOWtaWEp1WEc1Y2JpQWdRMmhwYkdSeVpXNDZJSHRjYmlBZ0lDQnRZWEE2SUZKbFlXTjBRMmhwYkdSeVpXNHViV0Z3TEZ4dUlDQWdJR1p2Y2tWaFkyZzZJRkpsWVdOMFEyaHBiR1J5Wlc0dVptOXlSV0ZqYUN4Y2JpQWdJQ0JqYjNWdWREb2dVbVZoWTNSRGFHbHNaSEpsYmk1amIzVnVkQ3hjYmlBZ0lDQjBiMEZ5Y21GNU9pQlNaV0ZqZEVOb2FXeGtjbVZ1TG5SdlFYSnlZWGtzWEc0Z0lDQWdiMjVzZVRvZ2IyNXNlVU5vYVd4a1hHNGdJSDBzWEc1Y2JpQWdRMjl0Y0c5dVpXNTBPaUJTWldGamRFTnZiWEJ2Ym1WdWRDeGNiaUFnVUhWeVpVTnZiWEJ2Ym1WdWREb2dVbVZoWTNSUWRYSmxRMjl0Y0c5dVpXNTBMRnh1WEc0Z0lHTnlaV0YwWlVWc1pXMWxiblE2SUdOeVpXRjBaVVZzWlcxbGJuUXNYRzRnSUdOc2IyNWxSV3hsYldWdWREb2dZMnh2Ym1WRmJHVnRaVzUwTEZ4dUlDQnBjMVpoYkdsa1JXeGxiV1Z1ZERvZ1VtVmhZM1JGYkdWdFpXNTBMbWx6Vm1Gc2FXUkZiR1Z0Wlc1MExGeHVYRzRnSUM4dklFTnNZWE56YVdOY2JseHVJQ0JRY205d1ZIbHdaWE02SUZKbFlXTjBVSEp2Y0ZSNWNHVnpMRnh1SUNCamNtVmhkR1ZEYkdGemN6b2dVbVZoWTNSRGJHRnpjeTVqY21WaGRHVkRiR0Z6Y3l4Y2JpQWdZM0psWVhSbFJtRmpkRzl5ZVRvZ1kzSmxZWFJsUm1GamRHOXllU3hjYmlBZ1kzSmxZWFJsVFdsNGFXNDZJR1oxYm1OMGFXOXVJQ2h0YVhocGJpa2dlMXh1SUNBZ0lDOHZJRU4xY25KbGJuUnNlU0JoSUc1dmIzQXVJRmRwYkd3Z1ltVWdkWE5sWkNCMGJ5QjJZV3hwWkdGMFpTQmhibVFnZEhKaFkyVWdiV2w0YVc1ekxseHVJQ0FnSUhKbGRIVnliaUJ0YVhocGJqdGNiaUFnZlN4Y2JseHVJQ0F2THlCVWFHbHpJR3h2YjJ0eklFUlBUU0J6Y0dWamFXWnBZeUJpZFhRZ2RHaGxjMlVnWVhKbElHRmpkSFZoYkd4NUlHbHpiMjF2Y25Cb2FXTWdhR1ZzY0dWeWMxeHVJQ0F2THlCemFXNWpaU0IwYUdWNUlHRnlaU0JxZFhOMElHZGxibVZ5WVhScGJtY2dSRTlOSUhOMGNtbHVaM011WEc0Z0lFUlBUVG9nVW1WaFkzUkVUMDFHWVdOMGIzSnBaWE1zWEc1Y2JpQWdkbVZ5YzJsdmJqb2dVbVZoWTNSV1pYSnphVzl1TEZ4dVhHNGdJQzh2SUVSbGNISmxZMkYwWldRZ2FHOXZheUJtYjNJZ1NsTllJSE53Y21WaFpDd2daRzl1SjNRZ2RYTmxJSFJvYVhNZ1ptOXlJR0Z1ZVhSb2FXNW5MbHh1SUNCZlgzTndjbVZoWkRvZ1gxOXpjSEpsWVdSY2JuMDdYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnVW1WaFkzUTdJbDE5IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0Q2hpbGRyZW5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciB0cmF2ZXJzZUFsbENoaWxkcmVuID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7XG5cbnZhciB0d29Bcmd1bWVudFBvb2xlciA9IFBvb2xlZENsYXNzLnR3b0FyZ3VtZW50UG9vbGVyO1xudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcjtcblxudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiAoJycgKyB0ZXh0KS5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG5cbi8qKlxuICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBib29ra2VlcGluZyBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIGNoaWxkXG4gKiB0cmF2ZXJzYWwuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy5cbiAqXG4gKiBAY29uc3RydWN0b3IgRm9yRWFjaEJvb2tLZWVwaW5nXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gZm9yRWFjaEZ1bmN0aW9uIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdHJhdmVyc2FsIHdpdGguXG4gKiBAcGFyYW0gez8qfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IHRvIHBlcmZvcm0gY29udGV4dCB3aXRoLlxuICovXG5mdW5jdGlvbiBGb3JFYWNoQm9va0tlZXBpbmcoZm9yRWFjaEZ1bmN0aW9uLCBmb3JFYWNoQ29udGV4dCkge1xuICB0aGlzLmZ1bmMgPSBmb3JFYWNoRnVuY3Rpb247XG4gIHRoaXMuY29udGV4dCA9IGZvckVhY2hDb250ZXh0O1xuICB0aGlzLmNvdW50ID0gMDtcbn1cbkZvckVhY2hCb29rS2VlcGluZy5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5mdW5jID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jb3VudCA9IDA7XG59O1xuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZvckVhY2hCb29rS2VlcGluZywgdHdvQXJndW1lbnRQb29sZXIpO1xuXG5mdW5jdGlvbiBmb3JFYWNoU2luZ2xlQ2hpbGQoYm9va0tlZXBpbmcsIGNoaWxkLCBuYW1lKSB7XG4gIHZhciBmdW5jID0gYm9va0tlZXBpbmcuZnVuYztcbiAgdmFyIGNvbnRleHQgPSBib29rS2VlcGluZy5jb250ZXh0O1xuXG4gIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBGb3JFYWNoQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCk7XG4gIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hTaW5nbGVDaGlsZCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgRm9yRWFjaEJvb2tLZWVwaW5nLnJlbGVhc2UodHJhdmVyc2VDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBQb29sZWRDbGFzcyByZXByZXNlbnRpbmcgdGhlIGJvb2trZWVwaW5nIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgY2hpbGRcbiAqIG1hcHBpbmcuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy5cbiAqXG4gKiBAY29uc3RydWN0b3IgTWFwQm9va0tlZXBpbmdcbiAqIEBwYXJhbSB7ISp9IG1hcFJlc3VsdCBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBtYXBGdW5jdGlvbiBGdW5jdGlvbiB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC5cbiAqIEBwYXJhbSB7Pyp9IG1hcENvbnRleHQgQ29udGV4dCB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC5cbiAqL1xuZnVuY3Rpb24gTWFwQm9va0tlZXBpbmcobWFwUmVzdWx0LCBrZXlQcmVmaXgsIG1hcEZ1bmN0aW9uLCBtYXBDb250ZXh0KSB7XG4gIHRoaXMucmVzdWx0ID0gbWFwUmVzdWx0O1xuICB0aGlzLmtleVByZWZpeCA9IGtleVByZWZpeDtcbiAgdGhpcy5mdW5jID0gbWFwRnVuY3Rpb247XG4gIHRoaXMuY29udGV4dCA9IG1hcENvbnRleHQ7XG4gIHRoaXMuY291bnQgPSAwO1xufVxuTWFwQm9va0tlZXBpbmcucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucmVzdWx0ID0gbnVsbDtcbiAgdGhpcy5rZXlQcmVmaXggPSBudWxsO1xuICB0aGlzLmZ1bmMgPSBudWxsO1xuICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICB0aGlzLmNvdW50ID0gMDtcbn07XG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oTWFwQm9va0tlZXBpbmcsIGZvdXJBcmd1bWVudFBvb2xlcik7XG5cbmZ1bmN0aW9uIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQoYm9va0tlZXBpbmcsIGNoaWxkLCBjaGlsZEtleSkge1xuICB2YXIgcmVzdWx0ID0gYm9va0tlZXBpbmcucmVzdWx0O1xuICB2YXIga2V5UHJlZml4ID0gYm9va0tlZXBpbmcua2V5UHJlZml4O1xuICB2YXIgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmM7XG4gIHZhciBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuXG4gIHZhciBtYXBwZWRDaGlsZCA9IGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG4gIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hpbGQsIHJlc3VsdCwgY2hpbGRLZXksIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCk7XG4gIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICBtYXBwZWRDaGlsZCA9IFJlYWN0RWxlbWVudC5jbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsXG4gICAgICAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICBrZXlQcmVmaXggKyAobWFwcGVkQ2hpbGQua2V5ICYmICghY2hpbGQgfHwgY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKG1hcHBlZENoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCBhcnJheSwgcHJlZml4LCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBlc2NhcGVkUHJlZml4ID0gJyc7XG4gIGlmIChwcmVmaXggIT0gbnVsbCkge1xuICAgIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkocHJlZml4KSArICcvJztcbiAgfVxuICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gTWFwQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGFycmF5LCBlc2NhcGVkUHJlZml4LCBmdW5jLCBjb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgTWFwQm9va0tlZXBpbmcucmVsZWFzZSh0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGtleSwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZnVuYywgY29udGV4dCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hTaW5nbGVDaGlsZER1bW15KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7XG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSwgbnVsbCk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLnRvYXJyYXlcbiAqL1xuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIFJlYWN0Q2hpbGRyZW4gPSB7XG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbDogbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbCxcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXlcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZHJlbjsiLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0Q2xhc3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudCcpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9ucyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9ucycpO1xudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcycpO1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIGtleU1pcnJvciA9IHJlcXVpcmUoJ2ZianMvbGliL2tleU1pcnJvcicpO1xudmFyIGtleU9mID0gcmVxdWlyZSgnZmJqcy9saWIva2V5T2YnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgTUlYSU5TX0tFWSA9IGtleU9mKHsgbWl4aW5zOiBudWxsIH0pO1xuXG4vKipcbiAqIFBvbGljaWVzIHRoYXQgZGVzY3JpYmUgbWV0aG9kcyBpbiBgUmVhY3RDbGFzc0ludGVyZmFjZWAuXG4gKi9cbnZhciBTcGVjUG9saWN5ID0ga2V5TWlycm9yKHtcbiAgLyoqXG4gICAqIFRoZXNlIG1ldGhvZHMgbWF5IGJlIGRlZmluZWQgb25seSBvbmNlIGJ5IHRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIG9yIG1peGluLlxuICAgKi9cbiAgREVGSU5FX09OQ0U6IG51bGwsXG4gIC8qKlxuICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBkZWZpbmVkIGJ5IGJvdGggdGhlIGNsYXNzIHNwZWNpZmljYXRpb24gYW5kIG1peGlucy5cbiAgICogU3Vic2VxdWVudCBkZWZpbml0aW9ucyB3aWxsIGJlIGNoYWluZWQuIFRoZXNlIG1ldGhvZHMgbXVzdCByZXR1cm4gdm9pZC5cbiAgICovXG4gIERFRklORV9NQU5ZOiBudWxsLFxuICAvKipcbiAgICogVGhlc2UgbWV0aG9kcyBhcmUgb3ZlcnJpZGluZyB0aGUgYmFzZSBjbGFzcy5cbiAgICovXG4gIE9WRVJSSURFX0JBU0U6IG51bGwsXG4gIC8qKlxuICAgKiBUaGVzZSBtZXRob2RzIGFyZSBzaW1pbGFyIHRvIERFRklORV9NQU5ZLCBleGNlcHQgd2UgYXNzdW1lIHRoZXkgcmV0dXJuXG4gICAqIG9iamVjdHMuIFdlIHRyeSB0byBtZXJnZSB0aGUga2V5cyBvZiB0aGUgcmV0dXJuIHZhbHVlcyBvZiBhbGwgdGhlIG1peGVkIGluXG4gICAqIGZ1bmN0aW9ucy4gSWYgdGhlcmUgaXMgYSBrZXkgY29uZmxpY3Qgd2UgdGhyb3cuXG4gICAqL1xuICBERUZJTkVfTUFOWV9NRVJHRUQ6IG51bGxcbn0pO1xuXG52YXIgaW5qZWN0ZWRNaXhpbnMgPSBbXTtcblxuLyoqXG4gKiBDb21wb3NpdGUgY29tcG9uZW50cyBhcmUgaGlnaGVyLWxldmVsIGNvbXBvbmVudHMgdGhhdCBjb21wb3NlIG90aGVyIGNvbXBvc2l0ZVxuICogb3IgaG9zdCBjb21wb25lbnRzLlxuICpcbiAqIFRvIGNyZWF0ZSBhIG5ldyB0eXBlIG9mIGBSZWFjdENsYXNzYCwgcGFzcyBhIHNwZWNpZmljYXRpb24gb2ZcbiAqIHlvdXIgbmV3IGNsYXNzIHRvIGBSZWFjdC5jcmVhdGVDbGFzc2AuIFRoZSBvbmx5IHJlcXVpcmVtZW50IG9mIHlvdXIgY2xhc3NcbiAqIHNwZWNpZmljYXRpb24gaXMgdGhhdCB5b3UgaW1wbGVtZW50IGEgYHJlbmRlcmAgbWV0aG9kLlxuICpcbiAqICAgdmFyIE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gKiAgICAgICByZXR1cm4gPGRpdj5IZWxsbyBXb3JsZDwvZGl2PjtcbiAqICAgICB9XG4gKiAgIH0pO1xuICpcbiAqIFRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIHN1cHBvcnRzIGEgc3BlY2lmaWMgcHJvdG9jb2wgb2YgbWV0aG9kcyB0aGF0IGhhdmVcbiAqIHNwZWNpYWwgbWVhbmluZyAoZS5nLiBgcmVuZGVyYCkuIFNlZSBgUmVhY3RDbGFzc0ludGVyZmFjZWAgZm9yXG4gKiBtb3JlIHRoZSBjb21wcmVoZW5zaXZlIHByb3RvY29sLiBBbnkgb3RoZXIgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBpbiB0aGVcbiAqIGNsYXNzIHNwZWNpZmljYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIHByb3RvdHlwZS5cbiAqXG4gKiBAaW50ZXJmYWNlIFJlYWN0Q2xhc3NJbnRlcmZhY2VcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RDbGFzc0ludGVyZmFjZSA9IHtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgTWl4aW4gb2JqZWN0cyB0byBpbmNsdWRlIHdoZW4gZGVmaW5pbmcgeW91ciBjb21wb25lbnQuXG4gICAqXG4gICAqIEB0eXBlIHthcnJheX1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBtaXhpbnM6IFNwZWNQb2xpY3kuREVGSU5FX01BTlksXG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgZGVmaW5lZCBvblxuICAgKiB0aGUgY29tcG9uZW50J3MgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBpdHMgcHJvdG90eXBlIChzdGF0aWMgbWV0aG9kcykuXG4gICAqXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgc3RhdGljczogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvKipcbiAgICogRGVmaW5pdGlvbiBvZiBwcm9wIHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBwcm9wVHlwZXM6IFNwZWNQb2xpY3kuREVGSU5FX01BTlksXG5cbiAgLyoqXG4gICAqIERlZmluaXRpb24gb2YgY29udGV4dCB0eXBlcyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29udGV4dFR5cGVzOiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8qKlxuICAgKiBEZWZpbml0aW9uIG9mIGNvbnRleHQgdHlwZXMgdGhpcyBjb21wb25lbnQgc2V0cyBmb3IgaXRzIGNoaWxkcmVuLlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNoaWxkQ29udGV4dFR5cGVzOiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8vID09PT0gRGVmaW5pdGlvbiBtZXRob2RzID09PT1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZC4gVmFsdWVzIGluIHRoZSBtYXBwaW5nIHdpbGwgYmUgc2V0IG9uXG4gICAqIGB0aGlzLnByb3BzYCBpZiB0aGF0IHByb3AgaXMgbm90IHNwZWNpZmllZCAoaS5lLiB1c2luZyBhbiBgaW5gIGNoZWNrKS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBiZWZvcmUgYGdldEluaXRpYWxTdGF0ZWAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgcmVseVxuICAgKiBvbiBgdGhpcy5zdGF0ZWAgb3IgdXNlIGB0aGlzLnNldFN0YXRlYC5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGdldERlZmF1bHRQcm9wczogU3BlY1BvbGljeS5ERUZJTkVfTUFOWV9NRVJHRUQsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgb25jZSBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZFxuICAgKiBhcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBgdGhpcy5zdGF0ZWAuXG4gICAqXG4gICAqICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICogICAgIHJldHVybiB7XG4gICAqICAgICAgIGlzT246IGZhbHNlLFxuICAgKiAgICAgICBmb29CYXo6IG5ldyBCYXpGb28oKVxuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGdldEluaXRpYWxTdGF0ZTogU3BlY1BvbGljeS5ERUZJTkVfTUFOWV9NRVJHRUQsXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBnZXRDaGlsZENvbnRleHQ6IFNwZWNQb2xpY3kuREVGSU5FX01BTllfTUVSR0VELFxuXG4gIC8qKlxuICAgKiBVc2VzIHByb3BzIGZyb20gYHRoaXMucHJvcHNgIGFuZCBzdGF0ZSBmcm9tIGB0aGlzLnN0YXRlYCB0byByZW5kZXIgdGhlXG4gICAqIHN0cnVjdHVyZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBObyBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IHdoZW4gb3IgaG93IG9mdGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQsIHNvXG4gICAqIGl0IG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLlxuICAgKlxuICAgKiAgIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAqICAgICB2YXIgbmFtZSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICogICAgIHJldHVybiA8ZGl2PkhlbGxvLCB7bmFtZX0hPC9kaXY+O1xuICAgKiAgIH1cbiAgICpcbiAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9XG4gICAqIEBub3NpZGVlZmZlY3RzXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgcmVuZGVyOiBTcGVjUG9saWN5LkRFRklORV9PTkNFLFxuXG4gIC8vID09PT0gRGVsZWdhdGUgbWV0aG9kcyA9PT09XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxseSBjcmVhdGVkIGFuZCBhYm91dCB0byBiZSBtb3VudGVkLlxuICAgKiBUaGlzIG1heSBoYXZlIHNpZGUgZWZmZWN0cywgYnV0IGFueSBleHRlcm5hbCBzdWJzY3JpcHRpb25zIG9yIGRhdGEgY3JlYXRlZFxuICAgKiBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGNsZWFuZWQgdXAgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YC5cbiAgICpcbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnRXaWxsTW91bnQ6IFNwZWNQb2xpY3kuREVGSU5FX01BTlksXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIG1vdW50ZWQgYW5kIGhhcyBhIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICogSG93ZXZlciwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIERPTSBub2RlIGlzIGluIHRoZSBkb2N1bWVudC5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNvbXBvbmVudCBoYXNcbiAgICogYmVlbiBtb3VudGVkIChpbml0aWFsaXplZCBhbmQgcmVuZGVyZWQpIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC5cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnREaWRNb3VudDogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvKipcbiAgICogSW52b2tlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCByZWNlaXZlcyBuZXcgcHJvcHMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWN0IHRvIGEgcHJvcCB0cmFuc2l0aW9uIGJ5IHVwZGF0aW5nIHRoZVxuICAgKiBzdGF0ZSB1c2luZyBgdGhpcy5zZXRTdGF0ZWAuIEN1cnJlbnQgcHJvcHMgYXJlIGFjY2Vzc2VkIHZpYSBgdGhpcy5wcm9wc2AuXG4gICAqXG4gICAqICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0Q29udGV4dCkge1xuICAgKiAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAqICAgICAgIGxpa2VzSW5jcmVhc2luZzogbmV4dFByb3BzLmxpa2VDb3VudCA+IHRoaXMucHJvcHMubGlrZUNvdW50XG4gICAqICAgICB9KTtcbiAgICogICB9XG4gICAqXG4gICAqIE5PVEU6IFRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgYGNvbXBvbmVudFdpbGxSZWNlaXZlU3RhdGVgLiBBbiBpbmNvbWluZyBwcm9wXG4gICAqIHRyYW5zaXRpb24gbWF5IGNhdXNlIGEgc3RhdGUgY2hhbmdlLCBidXQgdGhlIG9wcG9zaXRlIGlzIG5vdCB0cnVlLiBJZiB5b3VcbiAgICogbmVlZCBpdCwgeW91IGFyZSBwcm9iYWJseSBsb29raW5nIGZvciBgY29tcG9uZW50V2lsbFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoaWxlIGRlY2lkaW5nIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgYSByZXN1bHQgb2ZcbiAgICogcmVjZWl2aW5nIG5ldyBwcm9wcywgc3RhdGUgYW5kL29yIGNvbnRleHQuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGByZXR1cm4gZmFsc2VgIHdoZW4geW91J3JlIGNlcnRhaW4gdGhhdCB0aGVcbiAgICogdHJhbnNpdGlvbiB0byB0aGUgbmV3IHByb3BzL3N0YXRlL2NvbnRleHQgd2lsbCBub3QgcmVxdWlyZSBhIGNvbXBvbmVudFxuICAgKiB1cGRhdGUuXG4gICAqXG4gICAqICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpIHtcbiAgICogICAgIHJldHVybiAhZXF1YWwobmV4dFByb3BzLCB0aGlzLnByb3BzKSB8fFxuICAgKiAgICAgICAhZXF1YWwobmV4dFN0YXRlLCB0aGlzLnN0YXRlKSB8fFxuICAgKiAgICAgICAhZXF1YWwobmV4dENvbnRleHQsIHRoaXMuY29udGV4dCk7XG4gICAqICAgfVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGUuXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlOiBTcGVjUG9saWN5LkRFRklORV9PTkNFLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBhYm91dCB0byB1cGRhdGUgZHVlIHRvIGEgdHJhbnNpdGlvbiBmcm9tXG4gICAqIGB0aGlzLnByb3BzYCwgYHRoaXMuc3RhdGVgIGFuZCBgdGhpcy5jb250ZXh0YCB0byBgbmV4dFByb3BzYCwgYG5leHRTdGF0ZWBcbiAgICogYW5kIGBuZXh0Q29udGV4dGAuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBlcmZvcm0gcHJlcGFyYXRpb24gYmVmb3JlIGFuIHVwZGF0ZSBvY2N1cnMuXG4gICAqXG4gICAqIE5PVEU6IFlvdSAqKmNhbm5vdCoqIHVzZSBgdGhpcy5zZXRTdGF0ZSgpYCBpbiB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDb250ZXh0XG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnRXaWxsVXBkYXRlOiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCdzIERPTSByZXByZXNlbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBvcGVyYXRlIG9uIHRoZSBET00gd2hlbiB0aGUgY29tcG9uZW50IGhhc1xuICAgKiBiZWVuIHVwZGF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcmV2UHJvcHNcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2U3RhdGVcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2Q29udGV4dFxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHJvb3ROb2RlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50LlxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbXBvbmVudERpZFVwZGF0ZTogU3BlY1BvbGljeS5ERUZJTkVfTUFOWSxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgYW5kIGhhdmVcbiAgICogaXRzIERPTSByZXByZXNlbnRhdGlvbiBkZXN0cm95ZWQuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGRlYWxsb2NhdGUgYW55IGV4dGVybmFsIHJlc291cmNlcy5cbiAgICpcbiAgICogTk9URTogVGhlcmUgaXMgbm8gYGNvbXBvbmVudERpZFVubW91bnRgIHNpbmNlIHlvdXIgY29tcG9uZW50IHdpbGwgaGF2ZSBiZWVuXG4gICAqIGRlc3Ryb3llZCBieSB0aGF0IHBvaW50LlxuICAgKlxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50OiBTcGVjUG9saWN5LkRFRklORV9NQU5ZLFxuXG4gIC8vID09PT0gQWR2YW5jZWQgbWV0aG9kcyA9PT09XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGN1cnJlbnRseSBtb3VudGVkIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpbXBsZW1lbnRzIFJlYWN0J3MgcmVuZGVyaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBhbGdvcml0aG0uXG4gICAqIFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAb3ZlcnJpZGFibGVcbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudDogU3BlY1BvbGljeS5PVkVSUklERV9CQVNFXG5cbn07XG5cbi8qKlxuICogTWFwcGluZyBmcm9tIGNsYXNzIHNwZWNpZmljYXRpb24ga2V5cyB0byBzcGVjaWFsIHByb2Nlc3NpbmcgZnVuY3Rpb25zLlxuICpcbiAqIEFsdGhvdWdoIHRoZXNlIGFyZSBkZWNsYXJlZCBsaWtlIGluc3RhbmNlIHByb3BlcnRpZXMgaW4gdGhlIHNwZWNpZmljYXRpb25cbiAqIHdoZW4gZGVmaW5pbmcgY2xhc3NlcyB1c2luZyBgUmVhY3QuY3JlYXRlQ2xhc3NgLCB0aGV5IGFyZSBhY3R1YWxseSBzdGF0aWNcbiAqIGFuZCBhcmUgYWNjZXNzaWJsZSBvbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZCBvZiB0aGUgcHJvdG90eXBlLiBEZXNwaXRlXG4gKiBiZWluZyBzdGF0aWMsIHRoZXkgbXVzdCBiZSBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIFwic3RhdGljc1wiIGtleSB1bmRlclxuICogd2hpY2ggYWxsIG90aGVyIHN0YXRpYyBtZXRob2RzIGFyZSBkZWZpbmVkLlxuICovXG52YXIgUkVTRVJWRURfU1BFQ19LRVlTID0ge1xuICBkaXNwbGF5TmFtZTogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBkaXNwbGF5TmFtZSkge1xuICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gIH0sXG4gIG1peGluczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBtaXhpbnMpIHtcbiAgICBpZiAobWl4aW5zKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1peGlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3RvciwgbWl4aW5zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGNoaWxkQ29udGV4dFR5cGVzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbnMuY2hpbGRDb250ZXh0KTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5jaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0VHlwZXMpO1xuICB9LFxuICBjb250ZXh0VHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzLCBSZWFjdFByb3BUeXBlTG9jYXRpb25zLmNvbnRleHQpO1xuICAgIH1cbiAgICBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMsIGNvbnRleHRUeXBlcyk7XG4gIH0sXG4gIC8qKlxuICAgKiBTcGVjaWFsIGNhc2UgZ2V0RGVmYXVsdFByb3BzIHdoaWNoIHNob3VsZCBtb3ZlIGludG8gc3RhdGljcyBidXQgcmVxdWlyZXNcbiAgICogYXV0b21hdGljIG1lcmdpbmcuXG4gICAqL1xuICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgZ2V0RGVmYXVsdFByb3BzKSB7XG4gICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24oQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLCBnZXREZWZhdWx0UHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHM7XG4gICAgfVxuICB9LFxuICBwcm9wVHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvcFR5cGVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgcHJvcFR5cGVzLCBSZWFjdFByb3BUeXBlTG9jYXRpb25zLnByb3ApO1xuICAgIH1cbiAgICBDb25zdHJ1Y3Rvci5wcm9wVHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5wcm9wVHlwZXMsIHByb3BUeXBlcyk7XG4gIH0sXG4gIHN0YXRpY3M6IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwgc3RhdGljcykge1xuICAgIG1peFN0YXRpY1NwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzdGF0aWNzKTtcbiAgfSxcbiAgYXV0b2JpbmQ6IGZ1bmN0aW9uICgpIHt9IH07XG5cbi8vIG5vb3BcbmZ1bmN0aW9uIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgdHlwZURlZiwgbG9jYXRpb24pIHtcbiAgZm9yICh2YXIgcHJvcE5hbWUgaW4gdHlwZURlZikge1xuICAgIGlmICh0eXBlRGVmLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgLy8gdXNlIGEgd2FybmluZyBpbnN0ZWFkIG9mIGFuIGludmFyaWFudCBzbyBjb21wb25lbnRzXG4gICAgICAvLyBkb24ndCBzaG93IHVwIGluIHByb2QgYnV0IG9ubHkgaW4gX19ERVZfX1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIHR5cGVEZWZbcHJvcE5hbWVdID09PSAnZnVuY3Rpb24nLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSAnICsgJ1JlYWN0LlByb3BUeXBlcy4nLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgcHJvcE5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpIHtcbiAgdmFyIHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpID8gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXSA6IG51bGw7XG5cbiAgLy8gRGlzYWxsb3cgb3ZlcnJpZGluZyBvZiBiYXNlIGNsYXNzIG1ldGhvZHMgdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgaWYgKFJlYWN0Q2xhc3NNaXhpbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICEoc3BlY1BvbGljeSA9PT0gU3BlY1BvbGljeS5PVkVSUklERV9CQVNFKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYCVzYCBmcm9tIHlvdXIgY2xhc3Mgc3BlY2lmaWNhdGlvbi4gRW5zdXJlIHRoYXQgeW91ciBtZXRob2QgbmFtZXMgZG8gbm90IG92ZXJsYXAgd2l0aCBSZWFjdCBtZXRob2RzLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzczJywgbmFtZSkgOiB2b2lkIDA7XG4gIH1cblxuICAvLyBEaXNhbGxvdyBkZWZpbmluZyBtZXRob2RzIG1vcmUgdGhhbiBvbmNlIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7XG4gICAgIShzcGVjUG9saWN5ID09PSBTcGVjUG9saWN5LkRFRklORV9NQU5ZIHx8IHNwZWNQb2xpY3kgPT09IFNwZWNQb2xpY3kuREVGSU5FX01BTllfTUVSR0VEKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGAlc2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc0JywgbmFtZSkgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBNaXhpbiBoZWxwZXIgd2hpY2ggaGFuZGxlcyBwb2xpY3kgdmFsaWRhdGlvbiBhbmQgcmVzZXJ2ZWRcbiAqIHNwZWNpZmljYXRpb24ga2V5cyB3aGVuIGJ1aWxkaW5nIFJlYWN0IGNsYXNzZXMuXG4gKi9cbmZ1bmN0aW9uIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzcGVjKSB7XG4gIGlmICghc3BlYykge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgdHlwZW9mU3BlYyA9IHR5cGVvZiBzcGVjO1xuICAgICAgdmFyIGlzTWl4aW5WYWxpZCA9IHR5cGVvZlNwZWMgPT09ICdvYmplY3QnICYmIHNwZWMgIT09IG51bGw7XG5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGlzTWl4aW5WYWxpZCwgJyVzOiBZb3VcXCdyZSBhdHRlbXB0aW5nIHRvIGluY2x1ZGUgYSBtaXhpbiB0aGF0IGlzIGVpdGhlciBudWxsICcgKyAnb3Igbm90IGFuIG9iamVjdC4gQ2hlY2sgdGhlIG1peGlucyBpbmNsdWRlZCBieSB0aGUgY29tcG9uZW50LCAnICsgJ2FzIHdlbGwgYXMgYW55IG1peGlucyB0aGV5IGluY2x1ZGUgdGhlbXNlbHZlcy4gJyArICdFeHBlY3RlZCBvYmplY3QgYnV0IGdvdCAlcy4nLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsIHNwZWMgPT09IG51bGwgPyBudWxsIDogdHlwZW9mU3BlYykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgISh0eXBlb2Ygc3BlYyAhPT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzczogWW91XFwncmUgYXR0ZW1wdGluZyB0byB1c2UgYSBjb21wb25lbnQgY2xhc3Mgb3IgZnVuY3Rpb24gYXMgYSBtaXhpbi4gSW5zdGVhZCwganVzdCB1c2UgYSByZWd1bGFyIG9iamVjdC4nKSA6IF9wcm9kSW52YXJpYW50KCc3NScpIDogdm9pZCAwO1xuICAhIVJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChzcGVjKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3VcXCdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBvbmVudCBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LicpIDogX3Byb2RJbnZhcmlhbnQoJzc2JykgOiB2b2lkIDA7XG5cbiAgdmFyIHByb3RvID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgYXV0b0JpbmRQYWlycyA9IHByb3RvLl9fcmVhY3RBdXRvQmluZFBhaXJzO1xuXG4gIC8vIEJ5IGhhbmRsaW5nIG1peGlucyBiZWZvcmUgYW55IG90aGVyIHByb3BlcnRpZXMsIHdlIGVuc3VyZSB0aGUgc2FtZVxuICAvLyBjaGFpbmluZyBvcmRlciBpcyBhcHBsaWVkIHRvIG1ldGhvZHMgd2l0aCBERUZJTkVfTUFOWSBwb2xpY3ksIHdoZXRoZXJcbiAgLy8gbWl4aW5zIGFyZSBsaXN0ZWQgYmVmb3JlIG9yIGFmdGVyIHRoZXNlIG1ldGhvZHMgaW4gdGhlIHNwZWMuXG4gIGlmIChzcGVjLmhhc093blByb3BlcnR5KE1JWElOU19LRVkpKSB7XG4gICAgUkVTRVJWRURfU1BFQ19LRVlTLm1peGlucyhDb25zdHJ1Y3Rvciwgc3BlYy5taXhpbnMpO1xuICB9XG5cbiAgZm9yICh2YXIgbmFtZSBpbiBzcGVjKSB7XG4gICAgaWYgKCFzcGVjLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobmFtZSA9PT0gTUlYSU5TX0tFWSkge1xuICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgbWl4aW5zIGluIGEgc3BlY2lhbCBjYXNlIGFib3ZlLlxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5ID0gc3BlY1tuYW1lXTtcbiAgICB2YXIgaXNBbHJlYWR5RGVmaW5lZCA9IHByb3RvLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwgbmFtZSk7XG5cbiAgICBpZiAoUkVTRVJWRURfU1BFQ19LRVlTLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBSRVNFUlZFRF9TUEVDX0tFWVNbbmFtZV0oQ29uc3RydWN0b3IsIHByb3BlcnR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2V0dXAgbWV0aG9kcyBvbiBwcm90b3R5cGU6XG4gICAgICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlciBtZXRob2RzIHNob3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBib3VuZDpcbiAgICAgIC8vIDEuIEV4cGVjdGVkIFJlYWN0Q2xhc3MgbWV0aG9kcyAoaW4gdGhlIFwiaW50ZXJmYWNlXCIpLlxuICAgICAgLy8gMi4gT3ZlcnJpZGRlbiBtZXRob2RzICh0aGF0IHdlcmUgbWl4ZWQgaW4pLlxuICAgICAgdmFyIGlzUmVhY3RDbGFzc01ldGhvZCA9IFJlYWN0Q2xhc3NJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIHZhciBzaG91bGRBdXRvQmluZCA9IGlzRnVuY3Rpb24gJiYgIWlzUmVhY3RDbGFzc01ldGhvZCAmJiAhaXNBbHJlYWR5RGVmaW5lZCAmJiBzcGVjLmF1dG9iaW5kICE9PSBmYWxzZTtcblxuICAgICAgaWYgKHNob3VsZEF1dG9CaW5kKSB7XG4gICAgICAgIGF1dG9CaW5kUGFpcnMucHVzaChuYW1lLCBwcm9wZXJ0eSk7XG4gICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICAgICAgIHZhciBzcGVjUG9saWN5ID0gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXTtcblxuICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIHNob3VsZCBhbHJlYWR5IGJlIGNhdWdodCBieSB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlLlxuICAgICAgICAgICEoaXNSZWFjdENsYXNzTWV0aG9kICYmIChzcGVjUG9saWN5ID09PSBTcGVjUG9saWN5LkRFRklORV9NQU5ZX01FUkdFRCB8fCBzcGVjUG9saWN5ID09PSBTcGVjUG9saWN5LkRFRklORV9NQU5ZKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzczogVW5leHBlY3RlZCBzcGVjIHBvbGljeSAlcyBmb3Iga2V5ICVzIHdoZW4gbWl4aW5nIGluIGNvbXBvbmVudCBzcGVjcy4nLCBzcGVjUG9saWN5LCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3NycsIHNwZWNQb2xpY3ksIG5hbWUpIDogdm9pZCAwO1xuXG4gICAgICAgICAgLy8gRm9yIG1ldGhvZHMgd2hpY2ggYXJlIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UsIGNhbGwgdGhlIGV4aXN0aW5nXG4gICAgICAgICAgLy8gbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGUgbmV3IHByb3BlcnR5LCBtZXJnaW5nIGlmIGFwcHJvcHJpYXRlLlxuICAgICAgICAgIGlmIChzcGVjUG9saWN5ID09PSBTcGVjUG9saWN5LkRFRklORV9NQU5ZX01FUkdFRCkge1xuICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihwcm90b1tuYW1lXSwgcHJvcGVydHkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3BlY1BvbGljeSA9PT0gU3BlY1BvbGljeS5ERUZJTkVfTUFOWSkge1xuICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBjcmVhdGVDaGFpbmVkRnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvdG9bbmFtZV0gPSBwcm9wZXJ0eTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgLy8gQWRkIHZlcmJvc2UgZGlzcGxheU5hbWUgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBoZWxwcyB3aGVuIGxvb2tpbmdcbiAgICAgICAgICAgIC8vIGF0IHByb2ZpbGluZyB0b29scy5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiYgc3BlYy5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgICAgICBwcm90b1tuYW1lXS5kaXNwbGF5TmFtZSA9IHNwZWMuZGlzcGxheU5hbWUgKyAnXycgKyBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtaXhTdGF0aWNTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcykge1xuICBpZiAoIXN0YXRpY3MpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIgbmFtZSBpbiBzdGF0aWNzKSB7XG4gICAgdmFyIHByb3BlcnR5ID0gc3RhdGljc1tuYW1lXTtcbiAgICBpZiAoIXN0YXRpY3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBpc1Jlc2VydmVkID0gbmFtZSBpbiBSRVNFUlZFRF9TUEVDX0tFWVM7XG4gICAgISFpc1Jlc2VydmVkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYSByZXNlcnZlZCBwcm9wZXJ0eSwgYCVzYCwgdGhhdCBzaG91bGRuXFwndCBiZSBvbiB0aGUgXCJzdGF0aWNzXCIga2V5LiBEZWZpbmUgaXQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgaW5zdGVhZDsgaXQgd2lsbCBzdGlsbCBiZSBhY2Nlc3NpYmxlIG9uIHRoZSBjb25zdHJ1Y3Rvci4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3OCcsIG5hbWUpIDogdm9pZCAwO1xuXG4gICAgdmFyIGlzSW5oZXJpdGVkID0gbmFtZSBpbiBDb25zdHJ1Y3RvcjtcbiAgICAhIWlzSW5oZXJpdGVkID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW4uJywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzknLCBuYW1lKSA6IHZvaWQgMDtcbiAgICBDb25zdHJ1Y3RvcltuYW1lXSA9IHByb3BlcnR5O1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9iamVjdHMsIGJ1dCB0aHJvdyBpZiBib3RoIGNvbnRhaW4gdGhlIHNhbWUga2V5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvbmUgVGhlIGZpcnN0IG9iamVjdCwgd2hpY2ggaXMgbXV0YXRlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0d28gVGhlIHNlY29uZCBvYmplY3RcbiAqIEByZXR1cm4ge29iamVjdH0gb25lIGFmdGVyIGl0IGhhcyBiZWVuIG11dGF0ZWQgdG8gY29udGFpbiBldmVyeXRoaW5nIGluIHR3by5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhvbmUsIHR3bykge1xuICAhKG9uZSAmJiB0d28gJiYgdHlwZW9mIG9uZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHR3byA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoKTogQ2Fubm90IG1lcmdlIG5vbi1vYmplY3RzLicpIDogX3Byb2RJbnZhcmlhbnQoJzgwJykgOiB2b2lkIDA7XG5cbiAgZm9yICh2YXIga2V5IGluIHR3bykge1xuICAgIGlmICh0d28uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgIShvbmVba2V5XSA9PT0gdW5kZWZpbmVkKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6IFRyaWVkIHRvIG1lcmdlIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUga2V5OiBgJXNgLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgdG8gYSBtaXhpbjsgaW4gcGFydGljdWxhciwgdGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHR3byBnZXRJbml0aWFsU3RhdGUoKSBvciBnZXREZWZhdWx0UHJvcHMoKSBtZXRob2RzIHJldHVybmluZyBvYmplY3RzIHdpdGggY2xhc2hpbmcga2V5cy4nLCBrZXkpIDogX3Byb2RJbnZhcmlhbnQoJzgxJywga2V5KSA6IHZvaWQgMDtcbiAgICAgIG9uZVtrZXldID0gdHdvW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvbmU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28gZnVuY3Rpb25zIGFuZCBtZXJnZXMgdGhlaXIgcmV0dXJuIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbmUgRnVuY3Rpb24gdG8gaW52b2tlIGZpcnN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHdvIEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ob25lLCB0d28pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZFJlc3VsdCgpIHtcbiAgICB2YXIgYSA9IG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBiID0gdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGI7XG4gICAgfSBlbHNlIGlmIChiID09IG51bGwpIHtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICB2YXIgYyA9IHt9O1xuICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYSk7XG4gICAgbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBiKTtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHR3byBmdW5jdGlvbnMgYW5kIGlnbm9yZXMgdGhlaXIgcmV0dXJuIHZhbGVzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSB0d28gRnVuY3Rpb24gdG8gaW52b2tlIHNlY29uZC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHR3byBhcmd1bWVudCBmdW5jdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24ob25lLCB0d28pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbigpIHtcbiAgICBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0d28uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBCaW5kcyBhIG1ldGhvZCB0byB0aGUgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IHdob3NlIG1ldGhvZCBpcyBnb2luZyB0byBiZSBib3VuZC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZXRob2QgdG8gYmUgYm91bmQuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGJvdW5kIG1ldGhvZC5cbiAqL1xuZnVuY3Rpb24gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKSB7XG4gIHZhciBib3VuZE1ldGhvZCA9IG1ldGhvZC5iaW5kKGNvbXBvbmVudCk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBvbmVudDtcbiAgICBib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRNZXRob2QgPSBtZXRob2Q7XG4gICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQXJndW1lbnRzID0gbnVsbDtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZTtcbiAgICB2YXIgX2JpbmQgPSBib3VuZE1ldGhvZC5iaW5kO1xuICAgIGJvdW5kTWV0aG9kLmJpbmQgPSBmdW5jdGlvbiAobmV3VGhpcykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2VyIGlzIHRyeWluZyB0byBiaW5kKCkgYW4gYXV0b2JvdW5kIG1ldGhvZDsgd2UgZWZmZWN0aXZlbHkgd2lsbFxuICAgICAgLy8gaWdub3JlIHRoZSB2YWx1ZSBvZiBcInRoaXNcIiB0aGF0IHRoZSB1c2VyIGlzIHRyeWluZyB0byB1c2UsIHNvXG4gICAgICAvLyBsZXQncyB3YXJuLlxuICAgICAgaWYgKG5ld1RoaXMgIT09IGNvbXBvbmVudCAmJiBuZXdUaGlzICE9PSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYmluZCgpOiBSZWFjdCBjb21wb25lbnQgbWV0aG9kcyBtYXkgb25seSBiZSBib3VuZCB0byB0aGUgJyArICdjb21wb25lbnQgaW5zdGFuY2UuIFNlZSAlcycsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIGlmICghYXJncy5sZW5ndGgpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdiaW5kKCk6IFlvdSBhcmUgYmluZGluZyBhIGNvbXBvbmVudCBtZXRob2QgdG8gdGhlIGNvbXBvbmVudC4gJyArICdSZWFjdCBkb2VzIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGluIGEgaGlnaC1wZXJmb3JtYW5jZSAnICsgJ3dheSwgc28geW91IGNhbiBzYWZlbHkgcmVtb3ZlIHRoaXMgY2FsbC4gU2VlICVzJywgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIHJldHVybiBib3VuZE1ldGhvZDtcbiAgICAgIH1cbiAgICAgIHZhciByZWJvdW5kTWV0aG9kID0gX2JpbmQuYXBwbHkoYm91bmRNZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7XG4gICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQXJndW1lbnRzID0gYXJncztcbiAgICAgIHJldHVybiByZWJvdW5kTWV0aG9kO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJvdW5kTWV0aG9kO1xufVxuXG4vKipcbiAqIEJpbmRzIGFsbCBhdXRvLWJvdW5kIG1ldGhvZHMgaW4gYSBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudCBDb21wb25lbnQgd2hvc2UgbWV0aG9kIGlzIGdvaW5nIHRvIGJlIGJvdW5kLlxuICovXG5mdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2RzKGNvbXBvbmVudCkge1xuICB2YXIgcGFpcnMgPSBjb21wb25lbnQuX19yZWFjdEF1dG9CaW5kUGFpcnM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYXV0b0JpbmRLZXkgPSBwYWlyc1tpXTtcbiAgICB2YXIgbWV0aG9kID0gcGFpcnNbaSArIDFdO1xuICAgIGNvbXBvbmVudFthdXRvQmluZEtleV0gPSBiaW5kQXV0b0JpbmRNZXRob2QoY29tcG9uZW50LCBtZXRob2QpO1xuICB9XG59XG5cbi8qKlxuICogQWRkIG1vcmUgdG8gdGhlIFJlYWN0Q2xhc3MgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsbCBsZWdhY3kgZmVhdHVyZXMgYW5kXG4gKiB0aGVyZWZvcmUgbm90IGFscmVhZHkgcGFydCBvZiB0aGUgbW9kZXJuIFJlYWN0Q29tcG9uZW50LlxuICovXG52YXIgUmVhY3RDbGFzc01peGluID0ge1xuXG4gIC8qKlxuICAgKiBUT0RPOiBUaGlzIHdpbGwgYmUgZGVwcmVjYXRlZCBiZWNhdXNlIHN0YXRlIHNob3VsZCBhbHdheXMga2VlcCBhIGNvbnNpc3RlbnRcbiAgICogdHlwZSBzaWduYXR1cmUgYW5kIHRoZSBvbmx5IHVzZSBjYXNlIGZvciB0aGlzLCBpcyB0byBhdm9pZCB0aGF0LlxuICAgKi9cbiAgcmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAobmV3U3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUodGhpcywgbmV3U3RhdGUpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZXIuaXNNb3VudGVkKHRoaXMpO1xuICB9XG59O1xuXG52YXIgUmVhY3RDbGFzc0NvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHt9O1xuX2Fzc2lnbihSZWFjdENsYXNzQ29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENsYXNzTWl4aW4pO1xuXG4vKipcbiAqIE1vZHVsZSBmb3IgY3JlYXRpbmcgY29tcG9zaXRlIGNvbXBvbmVudHMuXG4gKlxuICogQGNsYXNzIFJlYWN0Q2xhc3NcbiAqL1xudmFyIFJlYWN0Q2xhc3MgPSB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgY29tcG9uZW50IGNsYXNzIGdpdmVuIGEgY2xhc3Mgc3BlY2lmaWNhdGlvbi5cbiAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzcGVjIENsYXNzIHNwZWNpZmljYXRpb24gKHdoaWNoIG11c3QgZGVmaW5lIGByZW5kZXJgKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb259IENvbXBvbmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY3JlYXRlQ2xhc3M6IGZ1bmN0aW9uIChzcGVjKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGdldHMgb3ZlcnJpZGRlbiBieSBtb2Nrcy4gVGhlIGFyZ3VtZW50IGlzIHVzZWRcbiAgICAgIC8vIGJ5IG1vY2tzIHRvIGFzc2VydCBvbiB3aGF0IGdldHMgbW91bnRlZC5cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodGhpcyBpbnN0YW5jZW9mIENvbnN0cnVjdG9yLCAnU29tZXRoaW5nIGlzIGNhbGxpbmcgYSBSZWFjdCBjb21wb25lbnQgZGlyZWN0bHkuIFVzZSBhIGZhY3Rvcnkgb3IgJyArICdKU1ggaW5zdGVhZC4gU2VlOiBodHRwczovL2ZiLm1lL3JlYWN0LWxlZ2FjeWZhY3RvcnknKSA6IHZvaWQgMDtcbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBhdXRvLWJpbmRpbmdcbiAgICAgIGlmICh0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCkge1xuICAgICAgICBiaW5kQXV0b0JpbmRNZXRob2RzKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuXG4gICAgICB0aGlzLnN0YXRlID0gbnVsbDtcblxuICAgICAgLy8gUmVhY3RDbGFzc2VzIGRvZXNuJ3QgaGF2ZSBjb25zdHJ1Y3RvcnMuIEluc3RlYWQsIHRoZXkgdXNlIHRoZVxuICAgICAgLy8gZ2V0SW5pdGlhbFN0YXRlIGFuZCBjb21wb25lbnRXaWxsTW91bnQgbWV0aG9kcyBmb3IgaW5pdGlhbGl6YXRpb24uXG5cbiAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSA/IHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCkgOiBudWxsO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJuaW5nIG51bGwuXG4gICAgICAgIGlmIChpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmdldEluaXRpYWxTdGF0ZS5faXNNb2NrRnVuY3Rpb24pIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJhZCBwcmFjdGljZS4gQ29uc2lkZXIgd2FybmluZyBoZXJlIGFuZFxuICAgICAgICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuXG4gICAgICAgICAgaW5pdGlhbFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgISh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbml0aWFsU3RhdGUpKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5nZXRJbml0aWFsU3RhdGUoKTogbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIG51bGwnLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCc4MicsIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuXG4gICAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIH07XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFJlYWN0Q2xhc3NDb21wb25lbnQoKTtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19yZWFjdEF1dG9CaW5kUGFpcnMgPSBbXTtcblxuICAgIGluamVjdGVkTWl4aW5zLmZvckVhY2gobWl4U3BlY0ludG9Db21wb25lbnQuYmluZChudWxsLCBDb25zdHJ1Y3RvcikpO1xuXG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHNwZWMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdFByb3BzIHByb3BlcnR5IGFmdGVyIGFsbCBtaXhpbnMgaGF2ZSBiZWVuIG1lcmdlZC5cbiAgICBpZiAoQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzKSB7XG4gICAgICBDb25zdHJ1Y3Rvci5kZWZhdWx0UHJvcHMgPSBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gVGhpcyBpcyBhIHRhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlc2UgbWV0aG9kIG5hbWVzIGlzIG9rLFxuICAgICAgLy8gc2luY2UgaXQncyB1c2VkIHdpdGggY3JlYXRlQ2xhc3MuIElmIGl0J3Mgbm90LCB0aGVuIGl0J3MgbGlrZWx5IGFcbiAgICAgIC8vIG1pc3Rha2Ugc28gd2UnbGwgd2FybiB5b3UgdG8gdXNlIHRoZSBzdGF0aWMgcHJvcGVydHksIHByb3BlcnR5XG4gICAgICAvLyBpbml0aWFsaXplciBvciBjb25zdHJ1Y3RvciByZXNwZWN0aXZlbHkuXG4gICAgICBpZiAoQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKENvbnN0cnVjdG9yLnByb3RvdHlwZS5nZXRJbml0aWFsU3RhdGUpIHtcbiAgICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCA9IHt9O1xuICAgICAgfVxuICAgIH1cblxuICAgICFDb25zdHJ1Y3Rvci5wcm90b3R5cGUucmVuZGVyID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2NyZWF0ZUNsYXNzKC4uLik6IENsYXNzIHNwZWNpZmljYXRpb24gbXVzdCBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuJykgOiBfcHJvZEludmFyaWFudCgnODMnKSA6IHZvaWQgMDtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSwgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gUmVkdWNlIHRpbWUgc3BlbnQgZG9pbmcgbG9va3VwcyBieSBzZXR0aW5nIHRoZXNlIG9uIHRoZSBwcm90b3R5cGUuXG4gICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiBSZWFjdENsYXNzSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUNvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfSxcblxuICBpbmplY3Rpb246IHtcbiAgICBpbmplY3RNaXhpbjogZnVuY3Rpb24gKG1peGluKSB7XG4gICAgICBpbmplY3RlZE1peGlucy5wdXNoKG1peGluKTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENsYXNzO1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5U1pXRmpkRU5zWVhOekxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMjl3ZVhKcFoyaDBJREl3TVRNdGNISmxjMlZ1ZEN3Z1JtRmpaV0p2YjJzc0lFbHVZeTVjYmlBcUlFRnNiQ0J5YVdkb2RITWdjbVZ6WlhKMlpXUXVYRzRnS2x4dUlDb2dWR2hwY3lCemIzVnlZMlVnWTI5a1pTQnBjeUJzYVdObGJuTmxaQ0IxYm1SbGNpQjBhR1VnUWxORUxYTjBlV3hsSUd4cFkyVnVjMlVnWm05MWJtUWdhVzRnZEdobFhHNGdLaUJNU1VORlRsTkZJR1pwYkdVZ2FXNGdkR2hsSUhKdmIzUWdaR2x5WldOMGIzSjVJRzltSUhSb2FYTWdjMjkxY21ObElIUnlaV1V1SUVGdUlHRmtaR2wwYVc5dVlXd2daM0poYm5SY2JpQXFJRzltSUhCaGRHVnVkQ0J5YVdkb2RITWdZMkZ1SUdKbElHWnZkVzVrSUdsdUlIUm9aU0JRUVZSRlRsUlRJR1pwYkdVZ2FXNGdkR2hsSUhOaGJXVWdaR2x5WldOMGIzSjVMbHh1SUNwY2JpQXFJRUJ3Y205MmFXUmxjMDF2WkhWc1pTQlNaV0ZqZEVOc1lYTnpYRzRnS2k5Y2JseHVKM1Z6WlNCemRISnBZM1FuTzF4dVhHNTJZWElnWDNCeWIyUkpiblpoY21saGJuUWdQU0J5WlhGMWFYSmxLQ2N1TDNKbFlXTjBVSEp2WkVsdWRtRnlhV0Z1ZENjcExGeHVJQ0FnSUY5aGMzTnBaMjRnUFNCeVpYRjFhWEpsS0NkdlltcGxZM1F0WVhOemFXZHVKeWs3WEc1Y2JuWmhjaUJTWldGamRFTnZiWEJ2Ym1WdWRDQTlJSEpsY1hWcGNtVW9KeTR2VW1WaFkzUkRiMjF3YjI1bGJuUW5LVHRjYm5aaGNpQlNaV0ZqZEVWc1pXMWxiblFnUFNCeVpYRjFhWEpsS0NjdUwxSmxZV04wUld4bGJXVnVkQ2NwTzF4dWRtRnlJRkpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Ym5NZ1BTQnlaWEYxYVhKbEtDY3VMMUpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Ym5NbktUdGNiblpoY2lCU1pXRmpkRkJ5YjNCVWVYQmxURzlqWVhScGIyNU9ZVzFsY3lBOUlISmxjWFZwY21Vb0p5NHZVbVZoWTNSUWNtOXdWSGx3WlV4dlkyRjBhVzl1VG1GdFpYTW5LVHRjYm5aaGNpQlNaV0ZqZEU1dmIzQlZjR1JoZEdWUmRXVjFaU0E5SUhKbGNYVnBjbVVvSnk0dlVtVmhZM1JPYjI5d1ZYQmtZWFJsVVhWbGRXVW5LVHRjYmx4dWRtRnlJR1Z0Y0hSNVQySnFaV04wSUQwZ2NtVnhkV2x5WlNnblptSnFjeTlzYVdJdlpXMXdkSGxQWW1wbFkzUW5LVHRjYm5aaGNpQnBiblpoY21saGJuUWdQU0J5WlhGMWFYSmxLQ2RtWW1wekwyeHBZaTlwYm5aaGNtbGhiblFuS1R0Y2JuWmhjaUJyWlhsTmFYSnliM0lnUFNCeVpYRjFhWEpsS0NkbVltcHpMMnhwWWk5clpYbE5hWEp5YjNJbktUdGNiblpoY2lCclpYbFBaaUE5SUhKbGNYVnBjbVVvSjJaaWFuTXZiR2xpTDJ0bGVVOW1KeWs3WEc1MllYSWdkMkZ5Ym1sdVp5QTlJSEpsY1hWcGNtVW9KMlppYW5NdmJHbGlMM2RoY201cGJtY25LVHRjYmx4dWRtRnlJRTFKV0VsT1UxOUxSVmtnUFNCclpYbFBaaWg3SUcxcGVHbHVjem9nYm5Wc2JDQjlLVHRjYmx4dUx5b3FYRzRnS2lCUWIyeHBZMmxsY3lCMGFHRjBJR1JsYzJOeWFXSmxJRzFsZEdodlpITWdhVzRnWUZKbFlXTjBRMnhoYzNOSmJuUmxjbVpoWTJWZ0xseHVJQ292WEc1MllYSWdVM0JsWTFCdmJHbGplU0E5SUd0bGVVMXBjbkp2Y2loN1hHNGdJQzhxS2x4dUlDQWdLaUJVYUdWelpTQnRaWFJvYjJSeklHMWhlU0JpWlNCa1pXWnBibVZrSUc5dWJIa2diMjVqWlNCaWVTQjBhR1VnWTJ4aGMzTWdjM0JsWTJsbWFXTmhkR2x2YmlCdmNpQnRhWGhwYmk1Y2JpQWdJQ292WEc0Z0lFUkZSa2xPUlY5UFRrTkZPaUJ1ZFd4c0xGeHVJQ0F2S2lwY2JpQWdJQ29nVkdobGMyVWdiV1YwYUc5a2N5QnRZWGtnWW1VZ1pHVm1hVzVsWkNCaWVTQmliM1JvSUhSb1pTQmpiR0Z6Y3lCemNHVmphV1pwWTJGMGFXOXVJR0Z1WkNCdGFYaHBibk11WEc0Z0lDQXFJRk4xWW5ObGNYVmxiblFnWkdWbWFXNXBkR2x2Ym5NZ2QybHNiQ0JpWlNCamFHRnBibVZrTGlCVWFHVnpaU0J0WlhSb2IyUnpJRzExYzNRZ2NtVjBkWEp1SUhadmFXUXVYRzRnSUNBcUwxeHVJQ0JFUlVaSlRrVmZUVUZPV1RvZ2JuVnNiQ3hjYmlBZ0x5b3FYRzRnSUNBcUlGUm9aWE5sSUcxbGRHaHZaSE1nWVhKbElHOTJaWEp5YVdScGJtY2dkR2hsSUdKaGMyVWdZMnhoYzNNdVhHNGdJQ0FxTDF4dUlDQlBWa1ZTVWtsRVJWOUNRVk5GT2lCdWRXeHNMRnh1SUNBdktpcGNiaUFnSUNvZ1ZHaGxjMlVnYldWMGFHOWtjeUJoY21VZ2MybHRhV3hoY2lCMGJ5QkVSVVpKVGtWZlRVRk9XU3dnWlhoalpYQjBJSGRsSUdGemMzVnRaU0IwYUdWNUlISmxkSFZ5Ymx4dUlDQWdLaUJ2WW1wbFkzUnpMaUJYWlNCMGNua2dkRzhnYldWeVoyVWdkR2hsSUd0bGVYTWdiMllnZEdobElISmxkSFZ5YmlCMllXeDFaWE1nYjJZZ1lXeHNJSFJvWlNCdGFYaGxaQ0JwYmx4dUlDQWdLaUJtZFc1amRHbHZibk11SUVsbUlIUm9aWEpsSUdseklHRWdhMlY1SUdOdmJtWnNhV04wSUhkbElIUm9jbTkzTGx4dUlDQWdLaTljYmlBZ1JFVkdTVTVGWDAxQlRsbGZUVVZTUjBWRU9pQnVkV3hzWEc1OUtUdGNibHh1ZG1GeUlHbHVhbVZqZEdWa1RXbDRhVzV6SUQwZ1cxMDdYRzVjYmk4cUtseHVJQ29nUTI5dGNHOXphWFJsSUdOdmJYQnZibVZ1ZEhNZ1lYSmxJR2hwWjJobGNpMXNaWFpsYkNCamIyMXdiMjVsYm5SeklIUm9ZWFFnWTI5dGNHOXpaU0J2ZEdobGNpQmpiMjF3YjNOcGRHVmNiaUFxSUc5eUlHaHZjM1FnWTI5dGNHOXVaVzUwY3k1Y2JpQXFYRzRnS2lCVWJ5QmpjbVZoZEdVZ1lTQnVaWGNnZEhsd1pTQnZaaUJnVW1WaFkzUkRiR0Z6YzJBc0lIQmhjM01nWVNCemNHVmphV1pwWTJGMGFXOXVJRzltWEc0Z0tpQjViM1Z5SUc1bGR5QmpiR0Z6Y3lCMGJ5QmdVbVZoWTNRdVkzSmxZWFJsUTJ4aGMzTmdMaUJVYUdVZ2IyNXNlU0J5WlhGMWFYSmxiV1Z1ZENCdlppQjViM1Z5SUdOc1lYTnpYRzRnS2lCemNHVmphV1pwWTJGMGFXOXVJR2x6SUhSb1lYUWdlVzkxSUdsdGNHeGxiV1Z1ZENCaElHQnlaVzVrWlhKZ0lHMWxkR2h2WkM1Y2JpQXFYRzRnS2lBZ0lIWmhjaUJOZVVOdmJYQnZibVZ1ZENBOUlGSmxZV04wTG1OeVpXRjBaVU5zWVhOektIdGNiaUFxSUNBZ0lDQnlaVzVrWlhJNklHWjFibU4wYVc5dUtDa2dlMXh1SUNvZ0lDQWdJQ0FnY21WMGRYSnVJRHhrYVhZK1NHVnNiRzhnVjI5eWJHUThMMlJwZGo0N1hHNGdLaUFnSUNBZ2ZWeHVJQ29nSUNCOUtUdGNiaUFxWEc0Z0tpQlVhR1VnWTJ4aGMzTWdjM0JsWTJsbWFXTmhkR2x2YmlCemRYQndiM0owY3lCaElITndaV05wWm1saklIQnliM1J2WTI5c0lHOW1JRzFsZEdodlpITWdkR2hoZENCb1lYWmxYRzRnS2lCemNHVmphV0ZzSUcxbFlXNXBibWNnS0dVdVp5NGdZSEpsYm1SbGNtQXBMaUJUWldVZ1lGSmxZV04wUTJ4aGMzTkpiblJsY21aaFkyVmdJR1p2Y2x4dUlDb2diVzl5WlNCMGFHVWdZMjl0Y0hKbGFHVnVjMmwyWlNCd2NtOTBiMk52YkM0Z1FXNTVJRzkwYUdWeUlIQnliM0JsY25ScFpYTWdZVzVrSUcxbGRHaHZaSE1nYVc0Z2RHaGxYRzRnS2lCamJHRnpjeUJ6Y0dWamFXWnBZMkYwYVc5dUlIZHBiR3dnWW1VZ1lYWmhhV3hoWW14bElHOXVJSFJvWlNCd2NtOTBiM1I1Y0dVdVhHNGdLbHh1SUNvZ1FHbHVkR1Z5Wm1GalpTQlNaV0ZqZEVOc1lYTnpTVzUwWlhKbVlXTmxYRzRnS2lCQWFXNTBaWEp1WVd4Y2JpQXFMMXh1ZG1GeUlGSmxZV04wUTJ4aGMzTkpiblJsY21aaFkyVWdQU0I3WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRUZ1SUdGeWNtRjVJRzltSUUxcGVHbHVJRzlpYW1WamRITWdkRzhnYVc1amJIVmtaU0IzYUdWdUlHUmxabWx1YVc1bklIbHZkWElnWTI5dGNHOXVaVzUwTGx4dUlDQWdLbHh1SUNBZ0tpQkFkSGx3WlNCN1lYSnlZWGw5WEc0Z0lDQXFJRUJ2Y0hScGIyNWhiRnh1SUNBZ0tpOWNiaUFnYldsNGFXNXpPaUJUY0dWalVHOXNhV041TGtSRlJrbE9SVjlOUVU1WkxGeHVYRzRnSUM4cUtseHVJQ0FnS2lCQmJpQnZZbXBsWTNRZ1kyOXVkR0ZwYm1sdVp5QndjbTl3WlhKMGFXVnpJR0Z1WkNCdFpYUm9iMlJ6SUhSb1lYUWdjMmh2ZFd4a0lHSmxJR1JsWm1sdVpXUWdiMjVjYmlBZ0lDb2dkR2hsSUdOdmJYQnZibVZ1ZENkeklHTnZibk4wY25WamRHOXlJR2x1YzNSbFlXUWdiMllnYVhSeklIQnliM1J2ZEhsd1pTQW9jM1JoZEdsaklHMWxkR2h2WkhNcExseHVJQ0FnS2x4dUlDQWdLaUJBZEhsd1pTQjdiMkpxWldOMGZWeHVJQ0FnS2lCQWIzQjBhVzl1WVd4Y2JpQWdJQ292WEc0Z0lITjBZWFJwWTNNNklGTndaV05RYjJ4cFkza3VSRVZHU1U1RlgwMUJUbGtzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRVJsWm1sdWFYUnBiMjRnYjJZZ2NISnZjQ0IwZVhCbGN5Qm1iM0lnZEdocGN5QmpiMjF3YjI1bGJuUXVYRzRnSUNBcVhHNGdJQ0FxSUVCMGVYQmxJSHR2WW1wbFkzUjlYRzRnSUNBcUlFQnZjSFJwYjI1aGJGeHVJQ0FnS2k5Y2JpQWdjSEp2Y0ZSNWNHVnpPaUJUY0dWalVHOXNhV041TGtSRlJrbE9SVjlOUVU1WkxGeHVYRzRnSUM4cUtseHVJQ0FnS2lCRVpXWnBibWwwYVc5dUlHOW1JR052Ym5SbGVIUWdkSGx3WlhNZ1ptOXlJSFJvYVhNZ1kyOXRjRzl1Wlc1MExseHVJQ0FnS2x4dUlDQWdLaUJBZEhsd1pTQjdiMkpxWldOMGZWeHVJQ0FnS2lCQWIzQjBhVzl1WVd4Y2JpQWdJQ292WEc0Z0lHTnZiblJsZUhSVWVYQmxjem9nVTNCbFkxQnZiR2xqZVM1RVJVWkpUa1ZmVFVGT1dTeGNibHh1SUNBdktpcGNiaUFnSUNvZ1JHVm1hVzVwZEdsdmJpQnZaaUJqYjI1MFpYaDBJSFI1Y0dWeklIUm9hWE1nWTI5dGNHOXVaVzUwSUhObGRITWdabTl5SUdsMGN5QmphR2xzWkhKbGJpNWNiaUFnSUNwY2JpQWdJQ29nUUhSNWNHVWdlMjlpYW1WamRIMWNiaUFnSUNvZ1FHOXdkR2x2Ym1Gc1hHNGdJQ0FxTDF4dUlDQmphR2xzWkVOdmJuUmxlSFJVZVhCbGN6b2dVM0JsWTFCdmJHbGplUzVFUlVaSlRrVmZUVUZPV1N4Y2JseHVJQ0F2THlBOVBUMDlJRVJsWm1sdWFYUnBiMjRnYldWMGFHOWtjeUE5UFQwOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVsdWRtOXJaV1FnZDJobGJpQjBhR1VnWTI5dGNHOXVaVzUwSUdseklHMXZkVzUwWldRdUlGWmhiSFZsY3lCcGJpQjBhR1VnYldGd2NHbHVaeUIzYVd4c0lHSmxJSE5sZENCdmJseHVJQ0FnS2lCZ2RHaHBjeTV3Y205d2MyQWdhV1lnZEdoaGRDQndjbTl3SUdseklHNXZkQ0J6Y0dWamFXWnBaV1FnS0drdVpTNGdkWE5wYm1jZ1lXNGdZR2x1WUNCamFHVmpheWt1WEc0Z0lDQXFYRzRnSUNBcUlGUm9hWE1nYldWMGFHOWtJR2x6SUdsdWRtOXJaV1FnWW1WbWIzSmxJR0JuWlhSSmJtbDBhV0ZzVTNSaGRHVmdJR0Z1WkNCMGFHVnlaV1p2Y21VZ1kyRnVibTkwSUhKbGJIbGNiaUFnSUNvZ2IyNGdZSFJvYVhNdWMzUmhkR1ZnSUc5eUlIVnpaU0JnZEdocGN5NXpaWFJUZEdGMFpXQXVYRzRnSUNBcVhHNGdJQ0FxSUVCeVpYUjFjbTRnZTI5aWFtVmpkSDFjYmlBZ0lDb2dRRzl3ZEdsdmJtRnNYRzRnSUNBcUwxeHVJQ0JuWlhSRVpXWmhkV3gwVUhKdmNITTZJRk53WldOUWIyeHBZM2t1UkVWR1NVNUZYMDFCVGxsZlRVVlNSMFZFTEZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJKYm5admEyVmtJRzl1WTJVZ1ltVm1iM0psSUhSb1pTQmpiMjF3YjI1bGJuUWdhWE1nYlc5MWJuUmxaQzRnVkdobElISmxkSFZ5YmlCMllXeDFaU0IzYVd4c0lHSmxJSFZ6WldSY2JpQWdJQ29nWVhNZ2RHaGxJR2x1YVhScFlXd2dkbUZzZFdVZ2IyWWdZSFJvYVhNdWMzUmhkR1ZnTGx4dUlDQWdLbHh1SUNBZ0tpQWdJR2RsZEVsdWFYUnBZV3hUZEdGMFpUb2dablZ1WTNScGIyNG9LU0I3WEc0Z0lDQXFJQ0FnSUNCeVpYUjFjbTRnZTF4dUlDQWdLaUFnSUNBZ0lDQnBjMDl1T2lCbVlXeHpaU3hjYmlBZ0lDb2dJQ0FnSUNBZ1ptOXZRbUY2T2lCdVpYY2dRbUY2Um05dktDbGNiaUFnSUNvZ0lDQWdJSDFjYmlBZ0lDb2dJQ0I5WEc0Z0lDQXFYRzRnSUNBcUlFQnlaWFIxY200Z2UyOWlhbVZqZEgxY2JpQWdJQ29nUUc5d2RHbHZibUZzWEc0Z0lDQXFMMXh1SUNCblpYUkpibWwwYVdGc1UzUmhkR1U2SUZOd1pXTlFiMnhwWTNrdVJFVkdTVTVGWDAxQlRsbGZUVVZTUjBWRUxGeHVYRzRnSUM4cUtseHVJQ0FnS2lCQWNtVjBkWEp1SUh0dlltcGxZM1I5WEc0Z0lDQXFJRUJ2Y0hScGIyNWhiRnh1SUNBZ0tpOWNiaUFnWjJWMFEyaHBiR1JEYjI1MFpYaDBPaUJUY0dWalVHOXNhV041TGtSRlJrbE9SVjlOUVU1WlgwMUZVa2RGUkN4Y2JseHVJQ0F2S2lwY2JpQWdJQ29nVlhObGN5QndjbTl3Y3lCbWNtOXRJR0IwYUdsekxuQnliM0J6WUNCaGJtUWdjM1JoZEdVZ1puSnZiU0JnZEdocGN5NXpkR0YwWldBZ2RHOGdjbVZ1WkdWeUlIUm9aVnh1SUNBZ0tpQnpkSEoxWTNSMWNtVWdiMllnZEdobElHTnZiWEJ2Ym1WdWRDNWNiaUFnSUNwY2JpQWdJQ29nVG04Z1ozVmhjbUZ1ZEdWbGN5QmhjbVVnYldGa1pTQmhZbTkxZENCM2FHVnVJRzl5SUdodmR5QnZablJsYmlCMGFHbHpJRzFsZEdodlpDQnBjeUJwYm5admEyVmtMQ0J6YjF4dUlDQWdLaUJwZENCdGRYTjBJRzV2ZENCb1lYWmxJSE5wWkdVZ1pXWm1aV04wY3k1Y2JpQWdJQ3BjYmlBZ0lDb2dJQ0J5Wlc1a1pYSTZJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdLaUFnSUNBZ2RtRnlJRzVoYldVZ1BTQjBhR2x6TG5CeWIzQnpMbTVoYldVN1hHNGdJQ0FxSUNBZ0lDQnlaWFIxY200Z1BHUnBkajVJWld4c2J5d2dlMjVoYldWOUlUd3ZaR2wyUGp0Y2JpQWdJQ29nSUNCOVhHNGdJQ0FxWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMUpsWVdOMFEyOXRjRzl1Wlc1MGZWeHVJQ0FnS2lCQWJtOXphV1JsWldabVpXTjBjMXh1SUNBZ0tpQkFjbVZ4ZFdseVpXUmNiaUFnSUNvdlhHNGdJSEpsYm1SbGNqb2dVM0JsWTFCdmJHbGplUzVFUlVaSlRrVmZUMDVEUlN4Y2JseHVJQ0F2THlBOVBUMDlJRVJsYkdWbllYUmxJRzFsZEdodlpITWdQVDA5UFZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJKYm5admEyVmtJSGRvWlc0Z2RHaGxJR052YlhCdmJtVnVkQ0JwY3lCcGJtbDBhV0ZzYkhrZ1kzSmxZWFJsWkNCaGJtUWdZV0p2ZFhRZ2RHOGdZbVVnYlc5MWJuUmxaQzVjYmlBZ0lDb2dWR2hwY3lCdFlYa2dhR0YyWlNCemFXUmxJR1ZtWm1WamRITXNJR0oxZENCaGJua2daWGgwWlhKdVlXd2djM1ZpYzJOeWFYQjBhVzl1Y3lCdmNpQmtZWFJoSUdOeVpXRjBaV1JjYmlBZ0lDb2dZbmtnZEdocGN5QnRaWFJvYjJRZ2JYVnpkQ0JpWlNCamJHVmhibVZrSUhWd0lHbHVJR0JqYjIxd2IyNWxiblJYYVd4c1ZXNXRiM1Z1ZEdBdVhHNGdJQ0FxWEc0Z0lDQXFJRUJ2Y0hScGIyNWhiRnh1SUNBZ0tpOWNiaUFnWTI5dGNHOXVaVzUwVjJsc2JFMXZkVzUwT2lCVGNHVmpVRzlzYVdONUxrUkZSa2xPUlY5TlFVNVpMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkpiblp2YTJWa0lIZG9aVzRnZEdobElHTnZiWEJ2Ym1WdWRDQm9ZWE1nWW1WbGJpQnRiM1Z1ZEdWa0lHRnVaQ0JvWVhNZ1lTQkVUMDBnY21Wd2NtVnpaVzUwWVhScGIyNHVYRzRnSUNBcUlFaHZkMlYyWlhJc0lIUm9aWEpsSUdseklHNXZJR2QxWVhKaGJuUmxaU0IwYUdGMElIUm9aU0JFVDAwZ2JtOWtaU0JwY3lCcGJpQjBhR1VnWkc5amRXMWxiblF1WEc0Z0lDQXFYRzRnSUNBcUlGVnpaU0IwYUdseklHRnpJR0Z1SUc5d2NHOXlkSFZ1YVhSNUlIUnZJRzl3WlhKaGRHVWdiMjRnZEdobElFUlBUU0IzYUdWdUlIUm9aU0JqYjIxd2IyNWxiblFnYUdGelhHNGdJQ0FxSUdKbFpXNGdiVzkxYm5SbFpDQW9hVzVwZEdsaGJHbDZaV1FnWVc1a0lISmxibVJsY21Wa0tTQm1iM0lnZEdobElHWnBjbk4wSUhScGJXVXVYRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3UkU5TlJXeGxiV1Z1ZEgwZ2NtOXZkRTV2WkdVZ1JFOU5JR1ZzWlcxbGJuUWdjbVZ3Y21WelpXNTBhVzVuSUhSb1pTQmpiMjF3YjI1bGJuUXVYRzRnSUNBcUlFQnZjSFJwYjI1aGJGeHVJQ0FnS2k5Y2JpQWdZMjl0Y0c5dVpXNTBSR2xrVFc5MWJuUTZJRk53WldOUWIyeHBZM2t1UkVWR1NVNUZYMDFCVGxrc1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUVsdWRtOXJaV1FnWW1WbWIzSmxJSFJvWlNCamIyMXdiMjVsYm5RZ2NtVmpaV2wyWlhNZ2JtVjNJSEJ5YjNCekxseHVJQ0FnS2x4dUlDQWdLaUJWYzJVZ2RHaHBjeUJoY3lCaGJpQnZjSEJ2Y25SMWJtbDBlU0IwYnlCeVpXRmpkQ0IwYnlCaElIQnliM0FnZEhKaGJuTnBkR2x2YmlCaWVTQjFjR1JoZEdsdVp5QjBhR1ZjYmlBZ0lDb2djM1JoZEdVZ2RYTnBibWNnWUhSb2FYTXVjMlYwVTNSaGRHVmdMaUJEZFhKeVpXNTBJSEJ5YjNCeklHRnlaU0JoWTJObGMzTmxaQ0IyYVdFZ1lIUm9hWE11Y0hKdmNITmdMbHh1SUNBZ0tseHVJQ0FnS2lBZ0lHTnZiWEJ2Ym1WdWRGZHBiR3hTWldObGFYWmxVSEp2Y0hNNklHWjFibU4wYVc5dUtHNWxlSFJRY205d2N5d2dibVY0ZEVOdmJuUmxlSFFwSUh0Y2JpQWdJQ29nSUNBZ0lIUm9hWE11YzJWMFUzUmhkR1VvZTF4dUlDQWdLaUFnSUNBZ0lDQnNhV3RsYzBsdVkzSmxZWE5wYm1jNklHNWxlSFJRY205d2N5NXNhV3RsUTI5MWJuUWdQaUIwYUdsekxuQnliM0J6TG14cGEyVkRiM1Z1ZEZ4dUlDQWdLaUFnSUNBZ2ZTazdYRzRnSUNBcUlDQWdmVnh1SUNBZ0tseHVJQ0FnS2lCT1QxUkZPaUJVYUdWeVpTQnBjeUJ1YnlCbGNYVnBkbUZzWlc1MElHQmpiMjF3YjI1bGJuUlhhV3hzVW1WalpXbDJaVk4wWVhSbFlDNGdRVzRnYVc1amIyMXBibWNnY0hKdmNGeHVJQ0FnS2lCMGNtRnVjMmwwYVc5dUlHMWhlU0JqWVhWelpTQmhJSE4wWVhSbElHTm9ZVzVuWlN3Z1luVjBJSFJvWlNCdmNIQnZjMmwwWlNCcGN5QnViM1FnZEhKMVpTNGdTV1lnZVc5MVhHNGdJQ0FxSUc1bFpXUWdhWFFzSUhsdmRTQmhjbVVnY0hKdlltRmliSGtnYkc5dmEybHVaeUJtYjNJZ1lHTnZiWEJ2Ym1WdWRGZHBiR3hWY0dSaGRHVmdMbHh1SUNBZ0tseHVJQ0FnS2lCQWNHRnlZVzBnZTI5aWFtVmpkSDBnYm1WNGRGQnliM0J6WEc0Z0lDQXFJRUJ2Y0hScGIyNWhiRnh1SUNBZ0tpOWNiaUFnWTI5dGNHOXVaVzUwVjJsc2JGSmxZMlZwZG1WUWNtOXdjem9nVTNCbFkxQnZiR2xqZVM1RVJVWkpUa1ZmVFVGT1dTeGNibHh1SUNBdktpcGNiaUFnSUNvZ1NXNTJiMnRsWkNCM2FHbHNaU0JrWldOcFpHbHVaeUJwWmlCMGFHVWdZMjl0Y0c5dVpXNTBJSE5vYjNWc1pDQmlaU0IxY0dSaGRHVmtJR0Z6SUdFZ2NtVnpkV3gwSUc5bVhHNGdJQ0FxSUhKbFkyVnBkbWx1WnlCdVpYY2djSEp2Y0hNc0lITjBZWFJsSUdGdVpDOXZjaUJqYjI1MFpYaDBMbHh1SUNBZ0tseHVJQ0FnS2lCVmMyVWdkR2hwY3lCaGN5QmhiaUJ2Y0hCdmNuUjFibWwwZVNCMGJ5QmdjbVYwZFhKdUlHWmhiSE5sWUNCM2FHVnVJSGx2ZFNkeVpTQmpaWEowWVdsdUlIUm9ZWFFnZEdobFhHNGdJQ0FxSUhSeVlXNXphWFJwYjI0Z2RHOGdkR2hsSUc1bGR5QndjbTl3Y3k5emRHRjBaUzlqYjI1MFpYaDBJSGRwYkd3Z2JtOTBJSEpsY1hWcGNtVWdZU0JqYjIxd2IyNWxiblJjYmlBZ0lDb2dkWEJrWVhSbExseHVJQ0FnS2x4dUlDQWdLaUFnSUhOb2IzVnNaRU52YlhCdmJtVnVkRlZ3WkdGMFpUb2dablZ1WTNScGIyNG9ibVY0ZEZCeWIzQnpMQ0J1WlhoMFUzUmhkR1VzSUc1bGVIUkRiMjUwWlhoMEtTQjdYRzRnSUNBcUlDQWdJQ0J5WlhSMWNtNGdJV1Z4ZFdGc0tHNWxlSFJRY205d2N5d2dkR2hwY3k1d2NtOXdjeWtnZkh4Y2JpQWdJQ29nSUNBZ0lDQWdJV1Z4ZFdGc0tHNWxlSFJUZEdGMFpTd2dkR2hwY3k1emRHRjBaU2tnZkh4Y2JpQWdJQ29nSUNBZ0lDQWdJV1Z4ZFdGc0tHNWxlSFJEYjI1MFpYaDBMQ0IwYUdsekxtTnZiblJsZUhRcE8xeHVJQ0FnS2lBZ0lIMWNiaUFnSUNwY2JpQWdJQ29nUUhCaGNtRnRJSHR2WW1wbFkzUjlJRzVsZUhSUWNtOXdjMXh1SUNBZ0tpQkFjR0Z5WVcwZ2V6OXZZbXBsWTNSOUlHNWxlSFJUZEdGMFpWeHVJQ0FnS2lCQWNHRnlZVzBnZXo5dlltcGxZM1I5SUc1bGVIUkRiMjUwWlhoMFhHNGdJQ0FxSUVCeVpYUjFjbTRnZTJKdmIyeGxZVzU5SUZSeWRXVWdhV1lnZEdobElHTnZiWEJ2Ym1WdWRDQnphRzkxYkdRZ2RYQmtZWFJsTGx4dUlDQWdLaUJBYjNCMGFXOXVZV3hjYmlBZ0lDb3ZYRzRnSUhOb2IzVnNaRU52YlhCdmJtVnVkRlZ3WkdGMFpUb2dVM0JsWTFCdmJHbGplUzVFUlVaSlRrVmZUMDVEUlN4Y2JseHVJQ0F2S2lwY2JpQWdJQ29nU1c1MmIydGxaQ0IzYUdWdUlIUm9aU0JqYjIxd2IyNWxiblFnYVhNZ1lXSnZkWFFnZEc4Z2RYQmtZWFJsSUdSMVpTQjBieUJoSUhSeVlXNXphWFJwYjI0Z1puSnZiVnh1SUNBZ0tpQmdkR2hwY3k1d2NtOXdjMkFzSUdCMGFHbHpMbk4wWVhSbFlDQmhibVFnWUhSb2FYTXVZMjl1ZEdWNGRHQWdkRzhnWUc1bGVIUlFjbTl3YzJBc0lHQnVaWGgwVTNSaGRHVmdYRzRnSUNBcUlHRnVaQ0JnYm1WNGRFTnZiblJsZUhSZ0xseHVJQ0FnS2x4dUlDQWdLaUJWYzJVZ2RHaHBjeUJoY3lCaGJpQnZjSEJ2Y25SMWJtbDBlU0IwYnlCd1pYSm1iM0p0SUhCeVpYQmhjbUYwYVc5dUlHSmxabTl5WlNCaGJpQjFjR1JoZEdVZ2IyTmpkWEp6TGx4dUlDQWdLbHh1SUNBZ0tpQk9UMVJGT2lCWmIzVWdLaXBqWVc1dWIzUXFLaUIxYzJVZ1lIUm9hWE11YzJWMFUzUmhkR1VvS1dBZ2FXNGdkR2hwY3lCdFpYUm9iMlF1WEc0Z0lDQXFYRzRnSUNBcUlFQndZWEpoYlNCN2IySnFaV04wZlNCdVpYaDBVSEp2Y0hOY2JpQWdJQ29nUUhCaGNtRnRJSHMvYjJKcVpXTjBmU0J1WlhoMFUzUmhkR1ZjYmlBZ0lDb2dRSEJoY21GdElIcy9iMkpxWldOMGZTQnVaWGgwUTI5dWRHVjRkRnh1SUNBZ0tpQkFjR0Z5WVcwZ2UxSmxZV04wVW1WamIyNWphV3hsVkhKaGJuTmhZM1JwYjI1OUlIUnlZVzV6WVdOMGFXOXVYRzRnSUNBcUlFQnZjSFJwYjI1aGJGeHVJQ0FnS2k5Y2JpQWdZMjl0Y0c5dVpXNTBWMmxzYkZWd1pHRjBaVG9nVTNCbFkxQnZiR2xqZVM1RVJVWkpUa1ZmVFVGT1dTeGNibHh1SUNBdktpcGNiaUFnSUNvZ1NXNTJiMnRsWkNCM2FHVnVJSFJvWlNCamIyMXdiMjVsYm5RbmN5QkVUMDBnY21Wd2NtVnpaVzUwWVhScGIyNGdhR0Z6SUdKbFpXNGdkWEJrWVhSbFpDNWNiaUFnSUNwY2JpQWdJQ29nVlhObElIUm9hWE1nWVhNZ1lXNGdiM0J3YjNKMGRXNXBkSGtnZEc4Z2IzQmxjbUYwWlNCdmJpQjBhR1VnUkU5TklIZG9aVzRnZEdobElHTnZiWEJ2Ym1WdWRDQm9ZWE5jYmlBZ0lDb2dZbVZsYmlCMWNHUmhkR1ZrTGx4dUlDQWdLbHh1SUNBZ0tpQkFjR0Z5WVcwZ2UyOWlhbVZqZEgwZ2NISmxkbEJ5YjNCelhHNGdJQ0FxSUVCd1lYSmhiU0I3UDI5aWFtVmpkSDBnY0hKbGRsTjBZWFJsWEc0Z0lDQXFJRUJ3WVhKaGJTQjdQMjlpYW1WamRIMGdjSEpsZGtOdmJuUmxlSFJjYmlBZ0lDb2dRSEJoY21GdElIdEVUMDFGYkdWdFpXNTBmU0J5YjI5MFRtOWtaU0JFVDAwZ1pXeGxiV1Z1ZENCeVpYQnlaWE5sYm5ScGJtY2dkR2hsSUdOdmJYQnZibVZ1ZEM1Y2JpQWdJQ29nUUc5d2RHbHZibUZzWEc0Z0lDQXFMMXh1SUNCamIyMXdiMjVsYm5SRWFXUlZjR1JoZEdVNklGTndaV05RYjJ4cFkza3VSRVZHU1U1RlgwMUJUbGtzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRWx1ZG05clpXUWdkMmhsYmlCMGFHVWdZMjl0Y0c5dVpXNTBJR2x6SUdGaWIzVjBJSFJ2SUdKbElISmxiVzkyWldRZ1puSnZiU0JwZEhNZ2NHRnlaVzUwSUdGdVpDQm9ZWFpsWEc0Z0lDQXFJR2wwY3lCRVQwMGdjbVZ3Y21WelpXNTBZWFJwYjI0Z1pHVnpkSEp2ZVdWa0xseHVJQ0FnS2x4dUlDQWdLaUJWYzJVZ2RHaHBjeUJoY3lCaGJpQnZjSEJ2Y25SMWJtbDBlU0IwYnlCa1pXRnNiRzlqWVhSbElHRnVlU0JsZUhSbGNtNWhiQ0J5WlhOdmRYSmpaWE11WEc0Z0lDQXFYRzRnSUNBcUlFNVBWRVU2SUZSb1pYSmxJR2x6SUc1dklHQmpiMjF3YjI1bGJuUkVhV1JWYm0xdmRXNTBZQ0J6YVc1alpTQjViM1Z5SUdOdmJYQnZibVZ1ZENCM2FXeHNJR2hoZG1VZ1ltVmxibHh1SUNBZ0tpQmtaWE4wY205NVpXUWdZbmtnZEdoaGRDQndiMmx1ZEM1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzl3ZEdsdmJtRnNYRzRnSUNBcUwxeHVJQ0JqYjIxd2IyNWxiblJYYVd4c1ZXNXRiM1Z1ZERvZ1UzQmxZMUJ2YkdsamVTNUVSVVpKVGtWZlRVRk9XU3hjYmx4dUlDQXZMeUE5UFQwOUlFRmtkbUZ1WTJWa0lHMWxkR2h2WkhNZ1BUMDlQVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlZjR1JoZEdWeklIUm9aU0JqYjIxd2IyNWxiblFuY3lCamRYSnlaVzUwYkhrZ2JXOTFiblJsWkNCRVQwMGdjbVZ3Y21WelpXNTBZWFJwYjI0dVhHNGdJQ0FxWEc0Z0lDQXFJRUo1SUdSbFptRjFiSFFzSUhSb2FYTWdhVzF3YkdWdFpXNTBjeUJTWldGamRDZHpJSEpsYm1SbGNtbHVaeUJoYm1RZ2NtVmpiMjVqYVd4cFlYUnBiMjRnWVd4bmIzSnBkR2h0TGx4dUlDQWdLaUJUYjNCb2FYTjBhV05oZEdWa0lHTnNhV1Z1ZEhNZ2JXRjVJSGRwYzJnZ2RHOGdiM1psY25KcFpHVWdkR2hwY3k1Y2JpQWdJQ3BjYmlBZ0lDb2dRSEJoY21GdElIdFNaV0ZqZEZKbFkyOXVZMmxzWlZSeVlXNXpZV04wYVc5dWZTQjBjbUZ1YzJGamRHbHZibHh1SUNBZ0tpQkFhVzUwWlhKdVlXeGNiaUFnSUNvZ1FHOTJaWEp5YVdSaFlteGxYRzRnSUNBcUwxeHVJQ0IxY0dSaGRHVkRiMjF3YjI1bGJuUTZJRk53WldOUWIyeHBZM2t1VDFaRlVsSkpSRVZmUWtGVFJWeHVYRzU5TzF4dVhHNHZLaXBjYmlBcUlFMWhjSEJwYm1jZ1puSnZiU0JqYkdGemN5QnpjR1ZqYVdacFkyRjBhVzl1SUd0bGVYTWdkRzhnYzNCbFkybGhiQ0J3Y205alpYTnphVzVuSUdaMWJtTjBhVzl1Y3k1Y2JpQXFYRzRnS2lCQmJIUm9iM1ZuYUNCMGFHVnpaU0JoY21VZ1pHVmpiR0Z5WldRZ2JHbHJaU0JwYm5OMFlXNWpaU0J3Y205d1pYSjBhV1Z6SUdsdUlIUm9aU0J6Y0dWamFXWnBZMkYwYVc5dVhHNGdLaUIzYUdWdUlHUmxabWx1YVc1bklHTnNZWE56WlhNZ2RYTnBibWNnWUZKbFlXTjBMbU55WldGMFpVTnNZWE56WUN3Z2RHaGxlU0JoY21VZ1lXTjBkV0ZzYkhrZ2MzUmhkR2xqWEc0Z0tpQmhibVFnWVhKbElHRmpZMlZ6YzJsaWJHVWdiMjRnZEdobElHTnZibk4wY25WamRHOXlJR2x1YzNSbFlXUWdiMllnZEdobElIQnliM1J2ZEhsd1pTNGdSR1Z6Y0dsMFpWeHVJQ29nWW1WcGJtY2djM1JoZEdsakxDQjBhR1Y1SUcxMWMzUWdZbVVnWkdWbWFXNWxaQ0J2ZFhSemFXUmxJRzltSUhSb1pTQmNJbk4wWVhScFkzTmNJaUJyWlhrZ2RXNWtaWEpjYmlBcUlIZG9hV05vSUdGc2JDQnZkR2hsY2lCemRHRjBhV01nYldWMGFHOWtjeUJoY21VZ1pHVm1hVzVsWkM1Y2JpQXFMMXh1ZG1GeUlGSkZVMFZTVmtWRVgxTlFSVU5mUzBWWlV5QTlJSHRjYmlBZ1pHbHpjR3hoZVU1aGJXVTZJR1oxYm1OMGFXOXVJQ2hEYjI1emRISjFZM1J2Y2l3Z1pHbHpjR3hoZVU1aGJXVXBJSHRjYmlBZ0lDQkRiMjV6ZEhKMVkzUnZjaTVrYVhOd2JHRjVUbUZ0WlNBOUlHUnBjM0JzWVhsT1lXMWxPMXh1SUNCOUxGeHVJQ0J0YVhocGJuTTZJR1oxYm1OMGFXOXVJQ2hEYjI1emRISjFZM1J2Y2l3Z2JXbDRhVzV6S1NCN1hHNGdJQ0FnYVdZZ0tHMXBlR2x1Y3lrZ2UxeHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQnRhWGhwYm5NdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnYldsNFUzQmxZMGx1ZEc5RGIyMXdiMjVsYm5Rb1EyOXVjM1J5ZFdOMGIzSXNJRzFwZUdsdWMxdHBYU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOUxGeHVJQ0JqYUdsc1pFTnZiblJsZUhSVWVYQmxjem9nWm5WdVkzUnBiMjRnS0VOdmJuTjBjblZqZEc5eUxDQmphR2xzWkVOdmJuUmxlSFJVZVhCbGN5a2dlMXh1SUNBZ0lHbG1JQ2h3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNCMllXeHBaR0YwWlZSNWNHVkVaV1lvUTI5dWMzUnlkV04wYjNJc0lHTm9hV3hrUTI5dWRHVjRkRlI1Y0dWekxDQlNaV0ZqZEZCeWIzQlVlWEJsVEc5allYUnBiMjV6TG1Ob2FXeGtRMjl1ZEdWNGRDazdYRzRnSUNBZ2ZWeHVJQ0FnSUVOdmJuTjBjblZqZEc5eUxtTm9hV3hrUTI5dWRHVjRkRlI1Y0dWeklEMGdYMkZ6YzJsbmJpaDdmU3dnUTI5dWMzUnlkV04wYjNJdVkyaHBiR1JEYjI1MFpYaDBWSGx3WlhNc0lHTm9hV3hrUTI5dWRHVjRkRlI1Y0dWektUdGNiaUFnZlN4Y2JpQWdZMjl1ZEdWNGRGUjVjR1Z6T2lCbWRXNWpkR2x2YmlBb1EyOXVjM1J5ZFdOMGIzSXNJR052Ym5SbGVIUlVlWEJsY3lrZ2UxeHVJQ0FnSUdsbUlDaHdjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0IyWVd4cFpHRjBaVlI1Y0dWRVpXWW9RMjl1YzNSeWRXTjBiM0lzSUdOdmJuUmxlSFJVZVhCbGN5d2dVbVZoWTNSUWNtOXdWSGx3WlV4dlkyRjBhVzl1Y3k1amIyNTBaWGgwS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdRMjl1YzNSeWRXTjBiM0l1WTI5dWRHVjRkRlI1Y0dWeklEMGdYMkZ6YzJsbmJpaDdmU3dnUTI5dWMzUnlkV04wYjNJdVkyOXVkR1Y0ZEZSNWNHVnpMQ0JqYjI1MFpYaDBWSGx3WlhNcE8xeHVJQ0I5TEZ4dUlDQXZLaXBjYmlBZ0lDb2dVM0JsWTJsaGJDQmpZWE5sSUdkbGRFUmxabUYxYkhSUWNtOXdjeUIzYUdsamFDQnphRzkxYkdRZ2JXOTJaU0JwYm5SdklITjBZWFJwWTNNZ1luVjBJSEpsY1hWcGNtVnpYRzRnSUNBcUlHRjFkRzl0WVhScFl5QnRaWEpuYVc1bkxseHVJQ0FnS2k5Y2JpQWdaMlYwUkdWbVlYVnNkRkJ5YjNCek9pQm1kVzVqZEdsdmJpQW9RMjl1YzNSeWRXTjBiM0lzSUdkbGRFUmxabUYxYkhSUWNtOXdjeWtnZTF4dUlDQWdJR2xtSUNoRGIyNXpkSEoxWTNSdmNpNW5aWFJFWldaaGRXeDBVSEp2Y0hNcElIdGNiaUFnSUNBZ0lFTnZibk4wY25WamRHOXlMbWRsZEVSbFptRjFiSFJRY205d2N5QTlJR055WldGMFpVMWxjbWRsWkZKbGMzVnNkRVoxYm1OMGFXOXVLRU52Ym5OMGNuVmpkRzl5TG1kbGRFUmxabUYxYkhSUWNtOXdjeXdnWjJWMFJHVm1ZWFZzZEZCeWIzQnpLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ1EyOXVjM1J5ZFdOMGIzSXVaMlYwUkdWbVlYVnNkRkJ5YjNCeklEMGdaMlYwUkdWbVlYVnNkRkJ5YjNCek8xeHVJQ0FnSUgxY2JpQWdmU3hjYmlBZ2NISnZjRlI1Y0dWek9pQm1kVzVqZEdsdmJpQW9RMjl1YzNSeWRXTjBiM0lzSUhCeWIzQlVlWEJsY3lrZ2UxeHVJQ0FnSUdsbUlDaHdjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0IyWVd4cFpHRjBaVlI1Y0dWRVpXWW9RMjl1YzNSeWRXTjBiM0lzSUhCeWIzQlVlWEJsY3l3Z1VtVmhZM1JRY205d1ZIbHdaVXh2WTJGMGFXOXVjeTV3Y205d0tUdGNiaUFnSUNCOVhHNGdJQ0FnUTI5dWMzUnlkV04wYjNJdWNISnZjRlI1Y0dWeklEMGdYMkZ6YzJsbmJpaDdmU3dnUTI5dWMzUnlkV04wYjNJdWNISnZjRlI1Y0dWekxDQndjbTl3Vkhsd1pYTXBPMXh1SUNCOUxGeHVJQ0J6ZEdGMGFXTnpPaUJtZFc1amRHbHZiaUFvUTI5dWMzUnlkV04wYjNJc0lITjBZWFJwWTNNcElIdGNiaUFnSUNCdGFYaFRkR0YwYVdOVGNHVmpTVzUwYjBOdmJYQnZibVZ1ZENoRGIyNXpkSEoxWTNSdmNpd2djM1JoZEdsamN5azdYRzRnSUgwc1hHNGdJR0YxZEc5aWFXNWtPaUJtZFc1amRHbHZiaUFvS1NCN2ZTQjlPMXh1WEc0dkx5QnViMjl3WEc1bWRXNWpkR2x2YmlCMllXeHBaR0YwWlZSNWNHVkVaV1lvUTI5dWMzUnlkV04wYjNJc0lIUjVjR1ZFWldZc0lHeHZZMkYwYVc5dUtTQjdYRzRnSUdadmNpQW9kbUZ5SUhCeWIzQk9ZVzFsSUdsdUlIUjVjR1ZFWldZcElIdGNiaUFnSUNCcFppQW9kSGx3WlVSbFppNW9ZWE5QZDI1UWNtOXdaWEowZVNod2NtOXdUbUZ0WlNrcElIdGNiaUFnSUNBZ0lDOHZJSFZ6WlNCaElIZGhjbTVwYm1jZ2FXNXpkR1ZoWkNCdlppQmhiaUJwYm5aaGNtbGhiblFnYzI4Z1kyOXRjRzl1Wlc1MGMxeHVJQ0FnSUNBZ0x5OGdaRzl1SjNRZ2MyaHZkeUIxY0NCcGJpQndjbTlrSUdKMWRDQnZibXg1SUdsdUlGOWZSRVZXWDE5Y2JpQWdJQ0FnSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QjNZWEp1YVc1bktIUjVjR1Z2WmlCMGVYQmxSR1ZtVzNCeWIzQk9ZVzFsWFNBOVBUMGdKMloxYm1OMGFXOXVKeXdnSnlWek9pQWxjeUIwZVhCbElHQWxjMkFnYVhNZ2FXNTJZV3hwWkRzZ2FYUWdiWFZ6ZENCaVpTQmhJR1oxYm1OMGFXOXVMQ0IxYzNWaGJHeDVJR1p5YjIwZ0p5QXJJQ2RTWldGamRDNVFjbTl3Vkhsd1pYTXVKeXdnUTI5dWMzUnlkV04wYjNJdVpHbHpjR3hoZVU1aGJXVWdmSHdnSjFKbFlXTjBRMnhoYzNNbkxDQlNaV0ZqZEZCeWIzQlVlWEJsVEc5allYUnBiMjVPWVcxbGMxdHNiMk5oZEdsdmJsMHNJSEJ5YjNCT1lXMWxLU0E2SUhadmFXUWdNRHRjYmlBZ0lDQjlYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnZG1Gc2FXUmhkR1ZOWlhSb2IyUlBkbVZ5Y21sa1pTaHBjMEZzY21WaFpIbEVaV1pwYm1Wa0xDQnVZVzFsS1NCN1hHNGdJSFpoY2lCemNHVmpVRzlzYVdONUlEMGdVbVZoWTNSRGJHRnpjMGx1ZEdWeVptRmpaUzVvWVhOUGQyNVFjbTl3WlhKMGVTaHVZVzFsS1NBL0lGSmxZV04wUTJ4aGMzTkpiblJsY21aaFkyVmJibUZ0WlYwZ09pQnVkV3hzTzF4dVhHNGdJQzh2SUVScGMyRnNiRzkzSUc5MlpYSnlhV1JwYm1jZ2IyWWdZbUZ6WlNCamJHRnpjeUJ0WlhSb2IyUnpJSFZ1YkdWemN5QmxlSEJzYVdOcGRHeDVJR0ZzYkc5M1pXUXVYRzRnSUdsbUlDaFNaV0ZqZEVOc1lYTnpUV2w0YVc0dWFHRnpUM2R1VUhKdmNHVnlkSGtvYm1GdFpTa3BJSHRjYmlBZ0lDQWhLSE53WldOUWIyeHBZM2tnUFQwOUlGTndaV05RYjJ4cFkza3VUMVpGVWxKSlJFVmZRa0ZUUlNrZ1B5QndjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5JRDhnYVc1MllYSnBZVzUwS0daaGJITmxMQ0FuVW1WaFkzUkRiR0Z6YzBsdWRHVnlabUZqWlRvZ1dXOTFJR0Z5WlNCaGRIUmxiWEIwYVc1bklIUnZJRzkyWlhKeWFXUmxJR0FsYzJBZ1puSnZiU0I1YjNWeUlHTnNZWE56SUhOd1pXTnBabWxqWVhScGIyNHVJRVZ1YzNWeVpTQjBhR0YwSUhsdmRYSWdiV1YwYUc5a0lHNWhiV1Z6SUdSdklHNXZkQ0J2ZG1WeWJHRndJSGRwZEdnZ1VtVmhZM1FnYldWMGFHOWtjeTRuTENCdVlXMWxLU0E2SUY5d2NtOWtTVzUyWVhKcFlXNTBLQ2MzTXljc0lHNWhiV1VwSURvZ2RtOXBaQ0F3TzF4dUlDQjlYRzVjYmlBZ0x5OGdSR2x6WVd4c2IzY2daR1ZtYVc1cGJtY2diV1YwYUc5a2N5QnRiM0psSUhSb1lXNGdiMjVqWlNCMWJteGxjM01nWlhod2JHbGphWFJzZVNCaGJHeHZkMlZrTGx4dUlDQnBaaUFvYVhOQmJISmxZV1I1UkdWbWFXNWxaQ2tnZTF4dUlDQWdJQ0VvYzNCbFkxQnZiR2xqZVNBOVBUMGdVM0JsWTFCdmJHbGplUzVFUlVaSlRrVmZUVUZPV1NCOGZDQnpjR1ZqVUc5c2FXTjVJRDA5UFNCVGNHVmpVRzlzYVdONUxrUkZSa2xPUlY5TlFVNVpYMDFGVWtkRlJDa2dQeUJ3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuSUQ4Z2FXNTJZWEpwWVc1MEtHWmhiSE5sTENBblVtVmhZM1JEYkdGemMwbHVkR1Z5Wm1GalpUb2dXVzkxSUdGeVpTQmhkSFJsYlhCMGFXNW5JSFJ2SUdSbFptbHVaU0JnSlhOZ0lHOXVJSGx2ZFhJZ1kyOXRjRzl1Wlc1MElHMXZjbVVnZEdoaGJpQnZibU5sTGlCVWFHbHpJR052Ym1ac2FXTjBJRzFoZVNCaVpTQmtkV1VnZEc4Z1lTQnRhWGhwYmk0bkxDQnVZVzFsS1NBNklGOXdjbTlrU1c1MllYSnBZVzUwS0NjM05DY3NJRzVoYldVcElEb2dkbTlwWkNBd08xeHVJQ0I5WEc1OVhHNWNiaThxS2x4dUlDb2dUV2w0YVc0Z2FHVnNjR1Z5SUhkb2FXTm9JR2hoYm1Sc1pYTWdjRzlzYVdONUlIWmhiR2xrWVhScGIyNGdZVzVrSUhKbGMyVnlkbVZrWEc0Z0tpQnpjR1ZqYVdacFkyRjBhVzl1SUd0bGVYTWdkMmhsYmlCaWRXbHNaR2x1WnlCU1pXRmpkQ0JqYkdGemMyVnpMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQnRhWGhUY0dWalNXNTBiME52YlhCdmJtVnVkQ2hEYjI1emRISjFZM1J2Y2l3Z2MzQmxZeWtnZTF4dUlDQnBaaUFvSVhOd1pXTXBJSHRjYmlBZ0lDQnBaaUFvY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlrZ2UxeHVJQ0FnSUNBZ2RtRnlJSFI1Y0dWdlpsTndaV01nUFNCMGVYQmxiMllnYzNCbFl6dGNiaUFnSUNBZ0lIWmhjaUJwYzAxcGVHbHVWbUZzYVdRZ1BTQjBlWEJsYjJaVGNHVmpJRDA5UFNBbmIySnFaV04wSnlBbUppQnpjR1ZqSUNFOVBTQnVkV3hzTzF4dVhHNGdJQ0FnSUNCd2NtOWpaWE56TG1WdWRpNU9UMFJGWDBWT1ZpQWhQVDBnSjNCeWIyUjFZM1JwYjI0bklEOGdkMkZ5Ym1sdVp5aHBjMDFwZUdsdVZtRnNhV1FzSUNjbGN6b2dXVzkxWEZ3bmNtVWdZWFIwWlcxd2RHbHVaeUIwYnlCcGJtTnNkV1JsSUdFZ2JXbDRhVzRnZEdoaGRDQnBjeUJsYVhSb1pYSWdiblZzYkNBbklDc2dKMjl5SUc1dmRDQmhiaUJ2WW1wbFkzUXVJRU5vWldOcklIUm9aU0J0YVhocGJuTWdhVzVqYkhWa1pXUWdZbmtnZEdobElHTnZiWEJ2Ym1WdWRDd2dKeUFySUNkaGN5QjNaV3hzSUdGeklHRnVlU0J0YVhocGJuTWdkR2hsZVNCcGJtTnNkV1JsSUhSb1pXMXpaV3gyWlhNdUlDY2dLeUFuUlhod1pXTjBaV1FnYjJKcVpXTjBJR0oxZENCbmIzUWdKWE11Snl3Z1EyOXVjM1J5ZFdOMGIzSXVaR2x6Y0d4aGVVNWhiV1VnZkh3Z0oxSmxZV04wUTJ4aGMzTW5MQ0J6Y0dWaklEMDlQU0J1ZFd4c0lEOGdiblZzYkNBNklIUjVjR1Z2WmxOd1pXTXBJRG9nZG05cFpDQXdPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5Ymp0Y2JpQWdmVnh1WEc0Z0lDRW9kSGx3Wlc5bUlITndaV01nSVQwOUlDZG1kVzVqZEdsdmJpY3BJRDhnY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlBL0lHbHVkbUZ5YVdGdWRDaG1ZV3h6WlN3Z0oxSmxZV04wUTJ4aGMzTTZJRmx2ZFZ4Y0ozSmxJR0YwZEdWdGNIUnBibWNnZEc4Z2RYTmxJR0VnWTI5dGNHOXVaVzUwSUdOc1lYTnpJRzl5SUdaMWJtTjBhVzl1SUdGeklHRWdiV2w0YVc0dUlFbHVjM1JsWVdRc0lHcDFjM1FnZFhObElHRWdjbVZuZFd4aGNpQnZZbXBsWTNRdUp5a2dPaUJmY0hKdlpFbHVkbUZ5YVdGdWRDZ25OelVuS1NBNklIWnZhV1FnTUR0Y2JpQWdJU0ZTWldGamRFVnNaVzFsYm5RdWFYTldZV3hwWkVWc1pXMWxiblFvYzNCbFl5a2dQeUJ3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuSUQ4Z2FXNTJZWEpwWVc1MEtHWmhiSE5sTENBblVtVmhZM1JEYkdGemN6b2dXVzkxWEZ3bmNtVWdZWFIwWlcxd2RHbHVaeUIwYnlCMWMyVWdZU0JqYjIxd2IyNWxiblFnWVhNZ1lTQnRhWGhwYmk0Z1NXNXpkR1ZoWkN3Z2FuVnpkQ0IxYzJVZ1lTQnlaV2QxYkdGeUlHOWlhbVZqZEM0bktTQTZJRjl3Y205a1NXNTJZWEpwWVc1MEtDYzNOaWNwSURvZ2RtOXBaQ0F3TzF4dVhHNGdJSFpoY2lCd2NtOTBieUE5SUVOdmJuTjBjblZqZEc5eUxuQnliM1J2ZEhsd1pUdGNiaUFnZG1GeUlHRjFkRzlDYVc1a1VHRnBjbk1nUFNCd2NtOTBieTVmWDNKbFlXTjBRWFYwYjBKcGJtUlFZV2x5Y3p0Y2JseHVJQ0F2THlCQ2VTQm9ZVzVrYkdsdVp5QnRhWGhwYm5NZ1ltVm1iM0psSUdGdWVTQnZkR2hsY2lCd2NtOXdaWEowYVdWekxDQjNaU0JsYm5OMWNtVWdkR2hsSUhOaGJXVmNiaUFnTHk4Z1kyaGhhVzVwYm1jZ2IzSmtaWElnYVhNZ1lYQndiR2xsWkNCMGJ5QnRaWFJvYjJSeklIZHBkR2dnUkVWR1NVNUZYMDFCVGxrZ2NHOXNhV041TENCM2FHVjBhR1Z5WEc0Z0lDOHZJRzFwZUdsdWN5QmhjbVVnYkdsemRHVmtJR0psWm05eVpTQnZjaUJoWm5SbGNpQjBhR1Z6WlNCdFpYUm9iMlJ6SUdsdUlIUm9aU0J6Y0dWakxseHVJQ0JwWmlBb2MzQmxZeTVvWVhOUGQyNVFjbTl3WlhKMGVTaE5TVmhKVGxOZlMwVlpLU2tnZTF4dUlDQWdJRkpGVTBWU1ZrVkVYMU5RUlVOZlMwVlpVeTV0YVhocGJuTW9RMjl1YzNSeWRXTjBiM0lzSUhOd1pXTXViV2w0YVc1ektUdGNiaUFnZlZ4dVhHNGdJR1p2Y2lBb2RtRnlJRzVoYldVZ2FXNGdjM0JsWXlrZ2UxeHVJQ0FnSUdsbUlDZ2hjM0JsWXk1b1lYTlBkMjVRY205d1pYSjBlU2h1WVcxbEtTa2dlMXh1SUNBZ0lDQWdZMjl1ZEdsdWRXVTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLRzVoYldVZ1BUMDlJRTFKV0VsT1UxOUxSVmtwSUh0Y2JpQWdJQ0FnSUM4dklGZGxJR2hoZG1VZ1lXeHlaV0ZrZVNCb1lXNWtiR1ZrSUcxcGVHbHVjeUJwYmlCaElITndaV05wWVd3Z1kyRnpaU0JoWW05MlpTNWNiaUFnSUNBZ0lHTnZiblJwYm5WbE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQndjbTl3WlhKMGVTQTlJSE53WldOYmJtRnRaVjA3WEc0Z0lDQWdkbUZ5SUdselFXeHlaV0ZrZVVSbFptbHVaV1FnUFNCd2NtOTBieTVvWVhOUGQyNVFjbTl3WlhKMGVTaHVZVzFsS1R0Y2JpQWdJQ0IyWVd4cFpHRjBaVTFsZEdodlpFOTJaWEp5YVdSbEtHbHpRV3h5WldGa2VVUmxabWx1WldRc0lHNWhiV1VwTzF4dVhHNGdJQ0FnYVdZZ0tGSkZVMFZTVmtWRVgxTlFSVU5mUzBWWlV5NW9ZWE5QZDI1UWNtOXdaWEowZVNodVlXMWxLU2tnZTF4dUlDQWdJQ0FnVWtWVFJWSldSVVJmVTFCRlExOUxSVmxUVzI1aGJXVmRLRU52Ym5OMGNuVmpkRzl5TENCd2NtOXdaWEowZVNrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQzh2SUZObGRIVndJRzFsZEdodlpITWdiMjRnY0hKdmRHOTBlWEJsT2x4dUlDQWdJQ0FnTHk4Z1ZHaGxJR1p2Ykd4dmQybHVaeUJ0WlcxaVpYSWdiV1YwYUc5a2N5QnphRzkxYkdRZ2JtOTBJR0psSUdGMWRHOXRZWFJwWTJGc2JIa2dZbTkxYm1RNlhHNGdJQ0FnSUNBdkx5QXhMaUJGZUhCbFkzUmxaQ0JTWldGamRFTnNZWE56SUcxbGRHaHZaSE1nS0dsdUlIUm9aU0JjSW1sdWRHVnlabUZqWlZ3aUtTNWNiaUFnSUNBZ0lDOHZJREl1SUU5MlpYSnlhV1JrWlc0Z2JXVjBhRzlrY3lBb2RHaGhkQ0IzWlhKbElHMXBlR1ZrSUdsdUtTNWNiaUFnSUNBZ0lIWmhjaUJwYzFKbFlXTjBRMnhoYzNOTlpYUm9iMlFnUFNCU1pXRmpkRU5zWVhOelNXNTBaWEptWVdObExtaGhjMDkzYmxCeWIzQmxjblI1S0c1aGJXVXBPMXh1SUNBZ0lDQWdkbUZ5SUdselJuVnVZM1JwYjI0Z1BTQjBlWEJsYjJZZ2NISnZjR1Z5ZEhrZ1BUMDlJQ2RtZFc1amRHbHZiaWM3WEc0Z0lDQWdJQ0IyWVhJZ2MyaHZkV3hrUVhWMGIwSnBibVFnUFNCcGMwWjFibU4wYVc5dUlDWW1JQ0ZwYzFKbFlXTjBRMnhoYzNOTlpYUm9iMlFnSmlZZ0lXbHpRV3h5WldGa2VVUmxabWx1WldRZ0ppWWdjM0JsWXk1aGRYUnZZbWx1WkNBaFBUMGdabUZzYzJVN1hHNWNiaUFnSUNBZ0lHbG1JQ2h6YUc5MWJHUkJkWFJ2UW1sdVpDa2dlMXh1SUNBZ0lDQWdJQ0JoZFhSdlFtbHVaRkJoYVhKekxuQjFjMmdvYm1GdFpTd2djSEp2Y0dWeWRIa3BPMXh1SUNBZ0lDQWdJQ0J3Y205MGIxdHVZVzFsWFNBOUlIQnliM0JsY25SNU8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR2x6UVd4eVpXRmtlVVJsWm1sdVpXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNCMllYSWdjM0JsWTFCdmJHbGplU0E5SUZKbFlXTjBRMnhoYzNOSmJuUmxjbVpoWTJWYmJtRnRaVjA3WEc1Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJVYUdWelpTQmpZWE5sY3lCemFHOTFiR1FnWVd4eVpXRmtlU0JpWlNCallYVm5hSFFnWW5rZ2RtRnNhV1JoZEdWTlpYUm9iMlJQZG1WeWNtbGtaUzVjYmlBZ0lDQWdJQ0FnSUNBaEtHbHpVbVZoWTNSRGJHRnpjMDFsZEdodlpDQW1KaUFvYzNCbFkxQnZiR2xqZVNBOVBUMGdVM0JsWTFCdmJHbGplUzVFUlVaSlRrVmZUVUZPV1Y5TlJWSkhSVVFnZkh3Z2MzQmxZMUJ2YkdsamVTQTlQVDBnVTNCbFkxQnZiR2xqZVM1RVJVWkpUa1ZmVFVGT1dTa3BJRDhnY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlBL0lHbHVkbUZ5YVdGdWRDaG1ZV3h6WlN3Z0oxSmxZV04wUTJ4aGMzTTZJRlZ1Wlhod1pXTjBaV1FnYzNCbFl5QndiMnhwWTNrZ0pYTWdabTl5SUd0bGVTQWxjeUIzYUdWdUlHMXBlR2x1WnlCcGJpQmpiMjF3YjI1bGJuUWdjM0JsWTNNdUp5d2djM0JsWTFCdmJHbGplU3dnYm1GdFpTa2dPaUJmY0hKdlpFbHVkbUZ5YVdGdWRDZ25OemNuTENCemNHVmpVRzlzYVdONUxDQnVZVzFsS1NBNklIWnZhV1FnTUR0Y2JseHVJQ0FnSUNBZ0lDQWdJQzh2SUVadmNpQnRaWFJvYjJSeklIZG9hV05vSUdGeVpTQmtaV1pwYm1Wa0lHMXZjbVVnZEdoaGJpQnZibU5sTENCallXeHNJSFJvWlNCbGVHbHpkR2x1WjF4dUlDQWdJQ0FnSUNBZ0lDOHZJRzFsZEdodlpITWdZbVZtYjNKbElHTmhiR3hwYm1jZ2RHaGxJRzVsZHlCd2NtOXdaWEowZVN3Z2JXVnlaMmx1WnlCcFppQmhjSEJ5YjNCeWFXRjBaUzVjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jM0JsWTFCdmJHbGplU0E5UFQwZ1UzQmxZMUJ2YkdsamVTNUVSVVpKVGtWZlRVRk9XVjlOUlZKSFJVUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnliM1J2VzI1aGJXVmRJRDBnWTNKbFlYUmxUV1Z5WjJWa1VtVnpkV3gwUm5WdVkzUnBiMjRvY0hKdmRHOWJibUZ0WlYwc0lIQnliM0JsY25SNUtUdGNiaUFnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hOd1pXTlFiMnhwWTNrZ1BUMDlJRk53WldOUWIyeHBZM2t1UkVWR1NVNUZYMDFCVGxrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhCeWIzUnZXMjVoYldWZElEMGdZM0psWVhSbFEyaGhhVzVsWkVaMWJtTjBhVzl1S0hCeWIzUnZXMjVoYldWZExDQndjbTl3WlhKMGVTazdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lIQnliM1J2VzI1aGJXVmRJRDBnY0hKdmNHVnlkSGs3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUVGa1pDQjJaWEppYjNObElHUnBjM0JzWVhsT1lXMWxJSFJ2SUhSb1pTQm1kVzVqZEdsdmJpd2dkMmhwWTJnZ2FHVnNjSE1nZDJobGJpQnNiMjlyYVc1blhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCaGRDQndjbTltYVd4cGJtY2dkRzl2YkhNdVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhCeWIzQmxjblI1SUQwOVBTQW5ablZ1WTNScGIyNG5JQ1ltSUhOd1pXTXVaR2x6Y0d4aGVVNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnY0hKdmRHOWJibUZ0WlYwdVpHbHpjR3hoZVU1aGJXVWdQU0J6Y0dWakxtUnBjM0JzWVhsT1lXMWxJQ3NnSjE4bklDc2dibUZ0WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYm4xY2JseHVablZ1WTNScGIyNGdiV2w0VTNSaGRHbGpVM0JsWTBsdWRHOURiMjF3YjI1bGJuUW9RMjl1YzNSeWRXTjBiM0lzSUhOMFlYUnBZM01wSUh0Y2JpQWdhV1lnS0NGemRHRjBhV056S1NCN1hHNGdJQ0FnY21WMGRYSnVPMXh1SUNCOVhHNGdJR1p2Y2lBb2RtRnlJRzVoYldVZ2FXNGdjM1JoZEdsamN5a2dlMXh1SUNBZ0lIWmhjaUJ3Y205d1pYSjBlU0E5SUhOMFlYUnBZM05iYm1GdFpWMDdYRzRnSUNBZ2FXWWdLQ0Z6ZEdGMGFXTnpMbWhoYzA5M2JsQnliM0JsY25SNUtHNWhiV1VwS1NCN1hHNGdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2FYTlNaWE5sY25abFpDQTlJRzVoYldVZ2FXNGdVa1ZUUlZKV1JVUmZVMUJGUTE5TFJWbFRPMXh1SUNBZ0lDRWhhWE5TWlhObGNuWmxaQ0EvSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QnBiblpoY21saGJuUW9abUZzYzJVc0lDZFNaV0ZqZEVOc1lYTnpPaUJaYjNVZ1lYSmxJR0YwZEdWdGNIUnBibWNnZEc4Z1pHVm1hVzVsSUdFZ2NtVnpaWEoyWldRZ2NISnZjR1Z5ZEhrc0lHQWxjMkFzSUhSb1lYUWdjMmh2ZFd4a2JseGNKM1FnWW1VZ2IyNGdkR2hsSUZ3aWMzUmhkR2xqYzF3aUlHdGxlUzRnUkdWbWFXNWxJR2wwSUdGeklHRnVJR2x1YzNSaGJtTmxJSEJ5YjNCbGNuUjVJR2x1YzNSbFlXUTdJR2wwSUhkcGJHd2djM1JwYkd3Z1ltVWdZV05qWlhOemFXSnNaU0J2YmlCMGFHVWdZMjl1YzNSeWRXTjBiM0l1Snl3Z2JtRnRaU2tnT2lCZmNISnZaRWx1ZG1GeWFXRnVkQ2duTnpnbkxDQnVZVzFsS1NBNklIWnZhV1FnTUR0Y2JseHVJQ0FnSUhaaGNpQnBjMGx1YUdWeWFYUmxaQ0E5SUc1aGJXVWdhVzRnUTI5dWMzUnlkV04wYjNJN1hHNGdJQ0FnSVNGcGMwbHVhR1Z5YVhSbFpDQS9JSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNnUHlCcGJuWmhjbWxoYm5Rb1ptRnNjMlVzSUNkU1pXRmpkRU5zWVhOek9pQlpiM1VnWVhKbElHRjBkR1Z0Y0hScGJtY2dkRzhnWkdWbWFXNWxJR0FsYzJBZ2IyNGdlVzkxY2lCamIyMXdiMjVsYm5RZ2JXOXlaU0IwYUdGdUlHOXVZMlV1SUZSb2FYTWdZMjl1Wm14cFkzUWdiV0Y1SUdKbElHUjFaU0IwYnlCaElHMXBlR2x1TGljc0lHNWhiV1VwSURvZ1gzQnliMlJKYm5aaGNtbGhiblFvSnpjNUp5d2dibUZ0WlNrZ09pQjJiMmxrSURBN1hHNGdJQ0FnUTI5dWMzUnlkV04wYjNKYmJtRnRaVjBnUFNCd2NtOXdaWEowZVR0Y2JpQWdmVnh1ZlZ4dVhHNHZLaXBjYmlBcUlFMWxjbWRsSUhSM2J5QnZZbXBsWTNSekxDQmlkWFFnZEdoeWIzY2dhV1lnWW05MGFDQmpiMjUwWVdsdUlIUm9aU0J6WVcxbElHdGxlUzVjYmlBcVhHNGdLaUJBY0dGeVlXMGdlMjlpYW1WamRIMGdiMjVsSUZSb1pTQm1hWEp6ZENCdlltcGxZM1FzSUhkb2FXTm9JR2x6SUcxMWRHRjBaV1F1WEc0Z0tpQkFjR0Z5WVcwZ2UyOWlhbVZqZEgwZ2RIZHZJRlJvWlNCelpXTnZibVFnYjJKcVpXTjBYRzRnS2lCQWNtVjBkWEp1SUh0dlltcGxZM1I5SUc5dVpTQmhablJsY2lCcGRDQm9ZWE1nWW1WbGJpQnRkWFJoZEdWa0lIUnZJR052Ym5SaGFXNGdaWFpsY25sMGFHbHVaeUJwYmlCMGQyOHVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHMWxjbWRsU1c1MGIxZHBkR2hPYjBSMWNHeHBZMkYwWlV0bGVYTW9iMjVsTENCMGQyOHBJSHRjYmlBZ0lTaHZibVVnSmlZZ2RIZHZJQ1ltSUhSNWNHVnZaaUJ2Ym1VZ1BUMDlJQ2R2WW1wbFkzUW5JQ1ltSUhSNWNHVnZaaUIwZDI4Z1BUMDlJQ2R2WW1wbFkzUW5LU0EvSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QnBiblpoY21saGJuUW9abUZzYzJVc0lDZHRaWEpuWlVsdWRHOVhhWFJvVG05RWRYQnNhV05oZEdWTFpYbHpLQ2s2SUVOaGJtNXZkQ0J0WlhKblpTQnViMjR0YjJKcVpXTjBjeTRuS1NBNklGOXdjbTlrU1c1MllYSnBZVzUwS0NjNE1DY3BJRG9nZG05cFpDQXdPMXh1WEc0Z0lHWnZjaUFvZG1GeUlHdGxlU0JwYmlCMGQyOHBJSHRjYmlBZ0lDQnBaaUFvZEhkdkxtaGhjMDkzYmxCeWIzQmxjblI1S0d0bGVTa3BJSHRjYmlBZ0lDQWdJQ0VvYjI1bFcydGxlVjBnUFQwOUlIVnVaR1ZtYVc1bFpDa2dQeUJ3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuSUQ4Z2FXNTJZWEpwWVc1MEtHWmhiSE5sTENBbmJXVnlaMlZKYm5SdlYybDBhRTV2UkhWd2JHbGpZWFJsUzJWNWN5Z3BPaUJVY21sbFpDQjBieUJ0WlhKblpTQjBkMjhnYjJKcVpXTjBjeUIzYVhSb0lIUm9aU0J6WVcxbElHdGxlVG9nWUNWellDNGdWR2hwY3lCamIyNW1iR2xqZENCdFlYa2dZbVVnWkhWbElIUnZJR0VnYldsNGFXNDdJR2x1SUhCaGNuUnBZM1ZzWVhJc0lIUm9hWE1nYldGNUlHSmxJR05oZFhObFpDQmllU0IwZDI4Z1oyVjBTVzVwZEdsaGJGTjBZWFJsS0NrZ2IzSWdaMlYwUkdWbVlYVnNkRkJ5YjNCektDa2diV1YwYUc5a2N5QnlaWFIxY201cGJtY2diMkpxWldOMGN5QjNhWFJvSUdOc1lYTm9hVzVuSUd0bGVYTXVKeXdnYTJWNUtTQTZJRjl3Y205a1NXNTJZWEpwWVc1MEtDYzRNU2NzSUd0bGVTa2dPaUIyYjJsa0lEQTdYRzRnSUNBZ0lDQnZibVZiYTJWNVhTQTlJSFIzYjF0clpYbGRPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnlaWFIxY200Z2IyNWxPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFTnlaV0YwWlhNZ1lTQm1kVzVqZEdsdmJpQjBhR0YwSUdsdWRtOXJaWE1nZEhkdklHWjFibU4wYVc5dWN5QmhibVFnYldWeVoyVnpJSFJvWldseUlISmxkSFZ5YmlCMllXeDFaWE11WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnYjI1bElFWjFibU4wYVc5dUlIUnZJR2x1ZG05clpTQm1hWEp6ZEM1Y2JpQXFJRUJ3WVhKaGJTQjdablZ1WTNScGIyNTlJSFIzYnlCR2RXNWpkR2x2YmlCMGJ5QnBiblp2YTJVZ2MyVmpiMjVrTGx4dUlDb2dRSEpsZEhWeWJpQjdablZ1WTNScGIyNTlJRVoxYm1OMGFXOXVJSFJvWVhRZ2FXNTJiMnRsY3lCMGFHVWdkSGR2SUdGeVozVnRaVzUwSUdaMWJtTjBhVzl1Y3k1Y2JpQXFJRUJ3Y21sMllYUmxYRzRnS2k5Y2JtWjFibU4wYVc5dUlHTnlaV0YwWlUxbGNtZGxaRkpsYzNWc2RFWjFibU4wYVc5dUtHOXVaU3dnZEhkdktTQjdYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaUJ0WlhKblpXUlNaWE4xYkhRb0tTQjdYRzRnSUNBZ2RtRnlJR0VnUFNCdmJtVXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0IyWVhJZ1lpQTlJSFIzYnk1aGNIQnNlU2gwYUdsekxDQmhjbWQxYldWdWRITXBPMXh1SUNBZ0lHbG1JQ2hoSUQwOUlHNTFiR3dwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJpTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvWWlBOVBTQnVkV3hzS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnWVR0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUdNZ1BTQjdmVHRjYmlBZ0lDQnRaWEpuWlVsdWRHOVhhWFJvVG05RWRYQnNhV05oZEdWTFpYbHpLR01zSUdFcE8xeHVJQ0FnSUcxbGNtZGxTVzUwYjFkcGRHaE9iMFIxY0d4cFkyRjBaVXRsZVhNb1l5d2dZaWs3WEc0Z0lDQWdjbVYwZFhKdUlHTTdYRzRnSUgwN1hHNTlYRzVjYmk4cUtseHVJQ29nUTNKbFlYUmxjeUJoSUdaMWJtTjBhVzl1SUhSb1lYUWdhVzUyYjJ0bGN5QjBkMjhnWm5WdVkzUnBiMjV6SUdGdVpDQnBaMjV2Y21WeklIUm9aV2x5SUhKbGRIVnliaUIyWVd4bGN5NWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dWZTQnZibVVnUm5WdVkzUnBiMjRnZEc4Z2FXNTJiMnRsSUdacGNuTjBMbHh1SUNvZ1FIQmhjbUZ0SUh0bWRXNWpkR2x2Ym4wZ2RIZHZJRVoxYm1OMGFXOXVJSFJ2SUdsdWRtOXJaU0J6WldOdmJtUXVYRzRnS2lCQWNtVjBkWEp1SUh0bWRXNWpkR2x2Ym4wZ1JuVnVZM1JwYjI0Z2RHaGhkQ0JwYm5admEyVnpJSFJvWlNCMGQyOGdZWEpuZFcxbGJuUWdablZ1WTNScGIyNXpMbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFMMXh1Wm5WdVkzUnBiMjRnWTNKbFlYUmxRMmhoYVc1bFpFWjFibU4wYVc5dUtHOXVaU3dnZEhkdktTQjdYRzRnSUhKbGRIVnliaUJtZFc1amRHbHZiaUJqYUdGcGJtVmtSblZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdiMjVsTG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ2RIZHZMbUZ3Y0d4NUtIUm9hWE1zSUdGeVozVnRaVzUwY3lrN1hHNGdJSDA3WEc1OVhHNWNiaThxS2x4dUlDb2dRbWx1WkhNZ1lTQnRaWFJvYjJRZ2RHOGdkR2hsSUdOdmJYQnZibVZ1ZEM1Y2JpQXFYRzRnS2lCQWNHRnlZVzBnZTI5aWFtVmpkSDBnWTI5dGNHOXVaVzUwSUVOdmJYQnZibVZ1ZENCM2FHOXpaU0J0WlhSb2IyUWdhWE1nWjI5cGJtY2dkRzhnWW1VZ1ltOTFibVF1WEc0Z0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dWZTQnRaWFJvYjJRZ1RXVjBhRzlrSUhSdklHSmxJR0p2ZFc1a0xseHVJQ29nUUhKbGRIVnliaUI3Wm5WdVkzUnBiMjU5SUZSb1pTQmliM1Z1WkNCdFpYUm9iMlF1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR0pwYm1SQmRYUnZRbWx1WkUxbGRHaHZaQ2hqYjIxd2IyNWxiblFzSUcxbGRHaHZaQ2tnZTF4dUlDQjJZWElnWW05MWJtUk5aWFJvYjJRZ1BTQnRaWFJvYjJRdVltbHVaQ2hqYjIxd2IyNWxiblFwTzF4dUlDQnBaaUFvY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlrZ2UxeHVJQ0FnSUdKdmRXNWtUV1YwYUc5a0xsOWZjbVZoWTNSQ2IzVnVaRU52Ym5SbGVIUWdQU0JqYjIxd2IyNWxiblE3WEc0Z0lDQWdZbTkxYm1STlpYUm9iMlF1WDE5eVpXRmpkRUp2ZFc1a1RXVjBhRzlrSUQwZ2JXVjBhRzlrTzF4dUlDQWdJR0p2ZFc1a1RXVjBhRzlrTGw5ZmNtVmhZM1JDYjNWdVpFRnlaM1Z0Wlc1MGN5QTlJRzUxYkd3N1hHNGdJQ0FnZG1GeUlHTnZiWEJ2Ym1WdWRFNWhiV1VnUFNCamIyMXdiMjVsYm5RdVkyOXVjM1J5ZFdOMGIzSXVaR2x6Y0d4aGVVNWhiV1U3WEc0Z0lDQWdkbUZ5SUY5aWFXNWtJRDBnWW05MWJtUk5aWFJvYjJRdVltbHVaRHRjYmlBZ0lDQmliM1Z1WkUxbGRHaHZaQzVpYVc1a0lEMGdablZ1WTNScGIyNGdLRzVsZDFSb2FYTXBJSHRjYmlBZ0lDQWdJR1p2Y2lBb2RtRnlJRjlzWlc0Z1BTQmhjbWQxYldWdWRITXViR1Z1WjNSb0xDQmhjbWR6SUQwZ1FYSnlZWGtvWDJ4bGJpQStJREVnUHlCZmJHVnVJQzBnTVNBNklEQXBMQ0JmYTJWNUlEMGdNVHNnWDJ0bGVTQThJRjlzWlc0N0lGOXJaWGtyS3lrZ2UxeHVJQ0FnSUNBZ0lDQmhjbWR6VzE5clpYa2dMU0F4WFNBOUlHRnlaM1Z0Wlc1MGMxdGZhMlY1WFR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdWWE5sY2lCcGN5QjBjbmxwYm1jZ2RHOGdZbWx1WkNncElHRnVJR0YxZEc5aWIzVnVaQ0J0WlhSb2IyUTdJSGRsSUdWbVptVmpkR2wyWld4NUlIZHBiR3hjYmlBZ0lDQWdJQzh2SUdsbmJtOXlaU0IwYUdVZ2RtRnNkV1VnYjJZZ1hDSjBhR2x6WENJZ2RHaGhkQ0IwYUdVZ2RYTmxjaUJwY3lCMGNubHBibWNnZEc4Z2RYTmxMQ0J6YjF4dUlDQWdJQ0FnTHk4Z2JHVjBKM01nZDJGeWJpNWNiaUFnSUNBZ0lHbG1JQ2h1WlhkVWFHbHpJQ0U5UFNCamIyMXdiMjVsYm5RZ0ppWWdibVYzVkdocGN5QWhQVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdJQ0J3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuSUQ4Z2QyRnlibWx1WnlobVlXeHpaU3dnSjJKcGJtUW9LVG9nVW1WaFkzUWdZMjl0Y0c5dVpXNTBJRzFsZEdodlpITWdiV0Y1SUc5dWJIa2dZbVVnWW05MWJtUWdkRzhnZEdobElDY2dLeUFuWTI5dGNHOXVaVzUwSUdsdWMzUmhibU5sTGlCVFpXVWdKWE1uTENCamIyMXdiMjVsYm5ST1lXMWxLU0E2SUhadmFXUWdNRHRjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvSVdGeVozTXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQWdJSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNnUHlCM1lYSnVhVzVuS0daaGJITmxMQ0FuWW1sdVpDZ3BPaUJaYjNVZ1lYSmxJR0pwYm1ScGJtY2dZU0JqYjIxd2IyNWxiblFnYldWMGFHOWtJSFJ2SUhSb1pTQmpiMjF3YjI1bGJuUXVJQ2NnS3lBblVtVmhZM1FnWkc5bGN5QjBhR2x6SUdadmNpQjViM1VnWVhWMGIyMWhkR2xqWVd4c2VTQnBiaUJoSUdocFoyZ3RjR1Z5Wm05eWJXRnVZMlVnSnlBcklDZDNZWGtzSUhOdklIbHZkU0JqWVc0Z2MyRm1aV3g1SUhKbGJXOTJaU0IwYUdseklHTmhiR3d1SUZObFpTQWxjeWNzSUdOdmJYQnZibVZ1ZEU1aGJXVXBJRG9nZG05cFpDQXdPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZbTkxYm1STlpYUm9iMlE3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0IyWVhJZ2NtVmliM1Z1WkUxbGRHaHZaQ0E5SUY5aWFXNWtMbUZ3Y0d4NUtHSnZkVzVrVFdWMGFHOWtMQ0JoY21kMWJXVnVkSE1wTzF4dUlDQWdJQ0FnY21WaWIzVnVaRTFsZEdodlpDNWZYM0psWVdOMFFtOTFibVJEYjI1MFpYaDBJRDBnWTI5dGNHOXVaVzUwTzF4dUlDQWdJQ0FnY21WaWIzVnVaRTFsZEdodlpDNWZYM0psWVdOMFFtOTFibVJOWlhSb2IyUWdQU0J0WlhSb2IyUTdYRzRnSUNBZ0lDQnlaV0p2ZFc1a1RXVjBhRzlrTGw5ZmNtVmhZM1JDYjNWdVpFRnlaM1Z0Wlc1MGN5QTlJR0Z5WjNNN1hHNGdJQ0FnSUNCeVpYUjFjbTRnY21WaWIzVnVaRTFsZEdodlpEdGNiaUFnSUNCOU8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCaWIzVnVaRTFsZEdodlpEdGNibjFjYmx4dUx5b3FYRzRnS2lCQ2FXNWtjeUJoYkd3Z1lYVjBieTFpYjNWdVpDQnRaWFJvYjJSeklHbHVJR0VnWTI5dGNHOXVaVzUwTGx4dUlDcGNiaUFxSUVCd1lYSmhiU0I3YjJKcVpXTjBmU0JqYjIxd2IyNWxiblFnUTI5dGNHOXVaVzUwSUhkb2IzTmxJRzFsZEdodlpDQnBjeUJuYjJsdVp5QjBieUJpWlNCaWIzVnVaQzVjYmlBcUwxeHVablZ1WTNScGIyNGdZbWx1WkVGMWRHOUNhVzVrVFdWMGFHOWtjeWhqYjIxd2IyNWxiblFwSUh0Y2JpQWdkbUZ5SUhCaGFYSnpJRDBnWTI5dGNHOXVaVzUwTGw5ZmNtVmhZM1JCZFhSdlFtbHVaRkJoYVhKek8xeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUhCaGFYSnpMbXhsYm1kMGFEc2dhU0FyUFNBeUtTQjdYRzRnSUNBZ2RtRnlJR0YxZEc5Q2FXNWtTMlY1SUQwZ2NHRnBjbk5iYVYwN1hHNGdJQ0FnZG1GeUlHMWxkR2h2WkNBOUlIQmhhWEp6VzJrZ0t5QXhYVHRjYmlBZ0lDQmpiMjF3YjI1bGJuUmJZWFYwYjBKcGJtUkxaWGxkSUQwZ1ltbHVaRUYxZEc5Q2FXNWtUV1YwYUc5a0tHTnZiWEJ2Ym1WdWRDd2diV1YwYUc5a0tUdGNiaUFnZlZ4dWZWeHVYRzR2S2lwY2JpQXFJRUZrWkNCdGIzSmxJSFJ2SUhSb1pTQlNaV0ZqZEVOc1lYTnpJR0poYzJVZ1kyeGhjM011SUZSb1pYTmxJR0Z5WlNCaGJHd2diR1ZuWVdONUlHWmxZWFIxY21WeklHRnVaRnh1SUNvZ2RHaGxjbVZtYjNKbElHNXZkQ0JoYkhKbFlXUjVJSEJoY25RZ2IyWWdkR2hsSUcxdlpHVnliaUJTWldGamRFTnZiWEJ2Ym1WdWRDNWNiaUFxTDF4dWRtRnlJRkpsWVdOMFEyeGhjM05OYVhocGJpQTlJSHRjYmx4dUlDQXZLaXBjYmlBZ0lDb2dWRTlFVHpvZ1ZHaHBjeUIzYVd4c0lHSmxJR1JsY0hKbFkyRjBaV1FnWW1WallYVnpaU0J6ZEdGMFpTQnphRzkxYkdRZ1lXeDNZWGx6SUd0bFpYQWdZU0JqYjI1emFYTjBaVzUwWEc0Z0lDQXFJSFI1Y0dVZ2MybG5ibUYwZFhKbElHRnVaQ0IwYUdVZ2IyNXNlU0IxYzJVZ1kyRnpaU0JtYjNJZ2RHaHBjeXdnYVhNZ2RHOGdZWFp2YVdRZ2RHaGhkQzVjYmlBZ0lDb3ZYRzRnSUhKbGNHeGhZMlZUZEdGMFpUb2dablZ1WTNScGIyNGdLRzVsZDFOMFlYUmxMQ0JqWVd4c1ltRmpheWtnZTF4dUlDQWdJSFJvYVhNdWRYQmtZWFJsY2k1bGJuRjFaWFZsVW1Wd2JHRmpaVk4wWVhSbEtIUm9hWE1zSUc1bGQxTjBZWFJsS1R0Y2JpQWdJQ0JwWmlBb1kyRnNiR0poWTJzcElIdGNiaUFnSUNBZ0lIUm9hWE11ZFhCa1lYUmxjaTVsYm5GMVpYVmxRMkZzYkdKaFkyc29kR2hwY3l3Z1kyRnNiR0poWTJzc0lDZHlaWEJzWVdObFUzUmhkR1VuS1R0Y2JpQWdJQ0I5WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFTm9aV05yY3lCM2FHVjBhR1Z5SUc5eUlHNXZkQ0IwYUdseklHTnZiWEJ2YzJsMFpTQmpiMjF3YjI1bGJuUWdhWE1nYlc5MWJuUmxaQzVjYmlBZ0lDb2dRSEpsZEhWeWJpQjdZbTl2YkdWaGJuMGdWSEoxWlNCcFppQnRiM1Z1ZEdWa0xDQm1ZV3h6WlNCdmRHaGxjbmRwYzJVdVhHNGdJQ0FxSUVCd2NtOTBaV04wWldSY2JpQWdJQ29nUUdacGJtRnNYRzRnSUNBcUwxeHVJQ0JwYzAxdmRXNTBaV1E2SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NTFjR1JoZEdWeUxtbHpUVzkxYm5SbFpDaDBhR2x6S1R0Y2JpQWdmVnh1ZlR0Y2JseHVkbUZ5SUZKbFlXTjBRMnhoYzNORGIyMXdiMjVsYm5RZ1BTQm1kVzVqZEdsdmJpQW9LU0I3ZlR0Y2JsOWhjM05wWjI0b1VtVmhZM1JEYkdGemMwTnZiWEJ2Ym1WdWRDNXdjbTkwYjNSNWNHVXNJRkpsWVdOMFEyOXRjRzl1Wlc1MExuQnliM1J2ZEhsd1pTd2dVbVZoWTNSRGJHRnpjMDFwZUdsdUtUdGNibHh1THlvcVhHNGdLaUJOYjJSMWJHVWdabTl5SUdOeVpXRjBhVzVuSUdOdmJYQnZjMmwwWlNCamIyMXdiMjVsYm5SekxseHVJQ3BjYmlBcUlFQmpiR0Z6Y3lCU1pXRmpkRU5zWVhOelhHNGdLaTljYm5aaGNpQlNaV0ZqZEVOc1lYTnpJRDBnZTF4dVhHNGdJQzhxS2x4dUlDQWdLaUJEY21WaGRHVnpJR0VnWTI5dGNHOXphWFJsSUdOdmJYQnZibVZ1ZENCamJHRnpjeUJuYVhabGJpQmhJR05zWVhOeklITndaV05wWm1sallYUnBiMjR1WEc0Z0lDQXFJRk5sWlNCb2RIUndjem92TDJaaFkyVmliMjlyTG1kcGRHaDFZaTVwYnk5eVpXRmpkQzlrYjJOekwzUnZjQzFzWlhabGJDMWhjR2t1YUhSdGJDTnlaV0ZqZEM1amNtVmhkR1ZqYkdGemMxeHVJQ0FnS2x4dUlDQWdLaUJBY0dGeVlXMGdlMjlpYW1WamRIMGdjM0JsWXlCRGJHRnpjeUJ6Y0dWamFXWnBZMkYwYVc5dUlDaDNhR2xqYUNCdGRYTjBJR1JsWm1sdVpTQmdjbVZ1WkdWeVlDa3VYRzRnSUNBcUlFQnlaWFIxY200Z2UyWjFibU4wYVc5dWZTQkRiMjF3YjI1bGJuUWdZMjl1YzNSeWRXTjBiM0lnWm5WdVkzUnBiMjR1WEc0Z0lDQXFJRUJ3ZFdKc2FXTmNiaUFnSUNvdlhHNGdJR055WldGMFpVTnNZWE56T2lCbWRXNWpkR2x2YmlBb2MzQmxZeWtnZTF4dUlDQWdJSFpoY2lCRGIyNXpkSEoxWTNSdmNpQTlJR1oxYm1OMGFXOXVJQ2h3Y205d2N5d2dZMjl1ZEdWNGRDd2dkWEJrWVhSbGNpa2dlMXh1SUNBZ0lDQWdMeThnVkdocGN5QmpiMjV6ZEhKMVkzUnZjaUJuWlhSeklHOTJaWEp5YVdSa1pXNGdZbmtnYlc5amEzTXVJRlJvWlNCaGNtZDFiV1Z1ZENCcGN5QjFjMlZrWEc0Z0lDQWdJQ0F2THlCaWVTQnRiMk5yY3lCMGJ5QmhjM05sY25RZ2IyNGdkMmhoZENCblpYUnpJRzF2ZFc1MFpXUXVYRzVjYmlBZ0lDQWdJR2xtSUNod2NtOWpaWE56TG1WdWRpNU9UMFJGWDBWT1ZpQWhQVDBnSjNCeWIyUjFZM1JwYjI0bktTQjdYRzRnSUNBZ0lDQWdJSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNnUHlCM1lYSnVhVzVuS0hSb2FYTWdhVzV6ZEdGdVkyVnZaaUJEYjI1emRISjFZM1J2Y2l3Z0oxTnZiV1YwYUdsdVp5QnBjeUJqWVd4c2FXNW5JR0VnVW1WaFkzUWdZMjl0Y0c5dVpXNTBJR1JwY21WamRHeDVMaUJWYzJVZ1lTQm1ZV04wYjNKNUlHOXlJQ2NnS3lBblNsTllJR2x1YzNSbFlXUXVJRk5sWlRvZ2FIUjBjSE02THk5bVlpNXRaUzl5WldGamRDMXNaV2RoWTNsbVlXTjBiM0o1SnlrZ09pQjJiMmxrSURBN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJRmRwY21VZ2RYQWdZWFYwYnkxaWFXNWthVzVuWEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTVmWDNKbFlXTjBRWFYwYjBKcGJtUlFZV2x5Y3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0FnSUNBZ1ltbHVaRUYxZEc5Q2FXNWtUV1YwYUc5a2N5aDBhR2x6S1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2RHaHBjeTV3Y205d2N5QTlJSEJ5YjNCek8xeHVJQ0FnSUNBZ2RHaHBjeTVqYjI1MFpYaDBJRDBnWTI5dWRHVjRkRHRjYmlBZ0lDQWdJSFJvYVhNdWNtVm1jeUE5SUdWdGNIUjVUMkpxWldOME8xeHVJQ0FnSUNBZ2RHaHBjeTUxY0dSaGRHVnlJRDBnZFhCa1lYUmxjaUI4ZkNCU1pXRmpkRTV2YjNCVmNHUmhkR1ZSZFdWMVpUdGNibHh1SUNBZ0lDQWdkR2hwY3k1emRHRjBaU0E5SUc1MWJHdzdYRzVjYmlBZ0lDQWdJQzh2SUZKbFlXTjBRMnhoYzNObGN5QmtiMlZ6YmlkMElHaGhkbVVnWTI5dWMzUnlkV04wYjNKekxpQkpibk4wWldGa0xDQjBhR1Y1SUhWelpTQjBhR1ZjYmlBZ0lDQWdJQzh2SUdkbGRFbHVhWFJwWVd4VGRHRjBaU0JoYm1RZ1kyOXRjRzl1Wlc1MFYybHNiRTF2ZFc1MElHMWxkR2h2WkhNZ1ptOXlJR2x1YVhScFlXeHBlbUYwYVc5dUxseHVYRzRnSUNBZ0lDQjJZWElnYVc1cGRHbGhiRk4wWVhSbElEMGdkR2hwY3k1blpYUkpibWwwYVdGc1UzUmhkR1VnUHlCMGFHbHpMbWRsZEVsdWFYUnBZV3hUZEdGMFpTZ3BJRG9nYm5Wc2JEdGNiaUFnSUNBZ0lHbG1JQ2h3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRmRsSUdGc2JHOTNJR0YxZEc4dGJXOWphM01nZEc4Z2NISnZZMlZsWkNCaGN5QnBaaUIwYUdWNUozSmxJSEpsZEhWeWJtbHVaeUJ1ZFd4c0xseHVJQ0FnSUNBZ0lDQnBaaUFvYVc1cGRHbGhiRk4wWVhSbElEMDlQU0IxYm1SbFptbHVaV1FnSmlZZ2RHaHBjeTVuWlhSSmJtbDBhV0ZzVTNSaGRHVXVYMmx6VFc5amEwWjFibU4wYVc5dUtTQjdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z1ZHaHBjeUJwY3lCd2NtOWlZV0pzZVNCaVlXUWdjSEpoWTNScFkyVXVJRU52Ym5OcFpHVnlJSGRoY201cGJtY2dhR1Z5WlNCaGJtUmNiaUFnSUNBZ0lDQWdJQ0F2THlCa1pYQnlaV05oZEdsdVp5QjBhR2x6SUdOdmJuWmxibWxsYm1ObExseHVJQ0FnSUNBZ0lDQWdJR2x1YVhScFlXeFRkR0YwWlNBOUlHNTFiR3c3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUNFb2RIbHdaVzltSUdsdWFYUnBZV3hUZEdGMFpTQTlQVDBnSjI5aWFtVmpkQ2NnSmlZZ0lVRnljbUY1TG1selFYSnlZWGtvYVc1cGRHbGhiRk4wWVhSbEtTa2dQeUJ3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuSUQ4Z2FXNTJZWEpwWVc1MEtHWmhiSE5sTENBbkpYTXVaMlYwU1c1cGRHbGhiRk4wWVhSbEtDazZJRzExYzNRZ2NtVjBkWEp1SUdGdUlHOWlhbVZqZENCdmNpQnVkV3hzSnl3Z1EyOXVjM1J5ZFdOMGIzSXVaR2x6Y0d4aGVVNWhiV1VnZkh3Z0oxSmxZV04wUTI5dGNHOXphWFJsUTI5dGNHOXVaVzUwSnlrZ09pQmZjSEp2WkVsdWRtRnlhV0Z1ZENnbk9ESW5MQ0JEYjI1emRISjFZM1J2Y2k1a2FYTndiR0Y1VG1GdFpTQjhmQ0FuVW1WaFkzUkRiMjF3YjNOcGRHVkRiMjF3YjI1bGJuUW5LU0E2SUhadmFXUWdNRHRjYmx4dUlDQWdJQ0FnZEdocGN5NXpkR0YwWlNBOUlHbHVhWFJwWVd4VGRHRjBaVHRjYmlBZ0lDQjlPMXh1SUNBZ0lFTnZibk4wY25WamRHOXlMbkJ5YjNSdmRIbHdaU0E5SUc1bGR5QlNaV0ZqZEVOc1lYTnpRMjl0Y0c5dVpXNTBLQ2s3WEc0Z0lDQWdRMjl1YzNSeWRXTjBiM0l1Y0hKdmRHOTBlWEJsTG1OdmJuTjBjblZqZEc5eUlEMGdRMjl1YzNSeWRXTjBiM0k3WEc0Z0lDQWdRMjl1YzNSeWRXTjBiM0l1Y0hKdmRHOTBlWEJsTGw5ZmNtVmhZM1JCZFhSdlFtbHVaRkJoYVhKeklEMGdXMTA3WEc1Y2JpQWdJQ0JwYm1wbFkzUmxaRTFwZUdsdWN5NW1iM0pGWVdOb0tHMXBlRk53WldOSmJuUnZRMjl0Y0c5dVpXNTBMbUpwYm1Rb2JuVnNiQ3dnUTI5dWMzUnlkV04wYjNJcEtUdGNibHh1SUNBZ0lHMXBlRk53WldOSmJuUnZRMjl0Y0c5dVpXNTBLRU52Ym5OMGNuVmpkRzl5TENCemNHVmpLVHRjYmx4dUlDQWdJQzh2SUVsdWFYUnBZV3hwZW1VZ2RHaGxJR1JsWm1GMWJIUlFjbTl3Y3lCd2NtOXdaWEowZVNCaFpuUmxjaUJoYkd3Z2JXbDRhVzV6SUdoaGRtVWdZbVZsYmlCdFpYSm5aV1F1WEc0Z0lDQWdhV1lnS0VOdmJuTjBjblZqZEc5eUxtZGxkRVJsWm1GMWJIUlFjbTl3Y3lrZ2UxeHVJQ0FnSUNBZ1EyOXVjM1J5ZFdOMGIzSXVaR1ZtWVhWc2RGQnliM0J6SUQwZ1EyOXVjM1J5ZFdOMGIzSXVaMlYwUkdWbVlYVnNkRkJ5YjNCektDazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNwSUh0Y2JpQWdJQ0FnSUM4dklGUm9hWE1nYVhNZ1lTQjBZV2NnZEc4Z2FXNWthV05oZEdVZ2RHaGhkQ0IwYUdVZ2RYTmxJRzltSUhSb1pYTmxJRzFsZEdodlpDQnVZVzFsY3lCcGN5QnZheXhjYmlBZ0lDQWdJQzh2SUhOcGJtTmxJR2wwSjNNZ2RYTmxaQ0IzYVhSb0lHTnlaV0YwWlVOc1lYTnpMaUJKWmlCcGRDZHpJRzV2ZEN3Z2RHaGxiaUJwZENkeklHeHBhMlZzZVNCaFhHNGdJQ0FnSUNBdkx5QnRhWE4wWVd0bElITnZJSGRsSjJ4c0lIZGhjbTRnZVc5MUlIUnZJSFZ6WlNCMGFHVWdjM1JoZEdsaklIQnliM0JsY25SNUxDQndjbTl3WlhKMGVWeHVJQ0FnSUNBZ0x5OGdhVzVwZEdsaGJHbDZaWElnYjNJZ1kyOXVjM1J5ZFdOMGIzSWdjbVZ6Y0dWamRHbDJaV3g1TGx4dUlDQWdJQ0FnYVdZZ0tFTnZibk4wY25WamRHOXlMbWRsZEVSbFptRjFiSFJRY205d2N5a2dlMXh1SUNBZ0lDQWdJQ0JEYjI1emRISjFZM1J2Y2k1blpYUkVaV1poZFd4MFVISnZjSE11YVhOU1pXRmpkRU5zWVhOelFYQndjbTkyWldRZ1BTQjdmVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR2xtSUNoRGIyNXpkSEoxWTNSdmNpNXdjbTkwYjNSNWNHVXVaMlYwU1c1cGRHbGhiRk4wWVhSbEtTQjdYRzRnSUNBZ0lDQWdJRU52Ym5OMGNuVmpkRzl5TG5CeWIzUnZkSGx3WlM1blpYUkpibWwwYVdGc1UzUmhkR1V1YVhOU1pXRmpkRU5zWVhOelFYQndjbTkyWldRZ1BTQjdmVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQWhRMjl1YzNSeWRXTjBiM0l1Y0hKdmRHOTBlWEJsTG5KbGJtUmxjaUEvSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QnBiblpoY21saGJuUW9abUZzYzJVc0lDZGpjbVZoZEdWRGJHRnpjeWd1TGk0cE9pQkRiR0Z6Y3lCemNHVmphV1pwWTJGMGFXOXVJRzExYzNRZ2FXMXdiR1Z0Wlc1MElHRWdZSEpsYm1SbGNtQWdiV1YwYUc5a0xpY3BJRG9nWDNCeWIyUkpiblpoY21saGJuUW9Kemd6SnlrZ09pQjJiMmxrSURBN1hHNWNiaUFnSUNCcFppQW9jSEp2WTJWemN5NWxibll1VGs5RVJWOUZUbFlnSVQwOUlDZHdjbTlrZFdOMGFXOXVKeWtnZTF4dUlDQWdJQ0FnY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlBL0lIZGhjbTVwYm1jb0lVTnZibk4wY25WamRHOXlMbkJ5YjNSdmRIbHdaUzVqYjIxd2IyNWxiblJUYUc5MWJHUlZjR1JoZEdVc0lDY2xjeUJvWVhNZ1lTQnRaWFJvYjJRZ1kyRnNiR1ZrSUNjZ0t5QW5ZMjl0Y0c5dVpXNTBVMmh2ZFd4a1ZYQmtZWFJsS0NrdUlFUnBaQ0I1YjNVZ2JXVmhiaUJ6YUc5MWJHUkRiMjF3YjI1bGJuUlZjR1JoZEdVb0tUOGdKeUFySUNkVWFHVWdibUZ0WlNCcGN5QndhSEpoYzJWa0lHRnpJR0VnY1hWbGMzUnBiMjRnWW1WallYVnpaU0IwYUdVZ1puVnVZM1JwYjI0Z2FYTWdKeUFySUNkbGVIQmxZM1JsWkNCMGJ5QnlaWFIxY200Z1lTQjJZV3gxWlM0bkxDQnpjR1ZqTG1ScGMzQnNZWGxPWVcxbElIeDhJQ2RCSUdOdmJYQnZibVZ1ZENjcElEb2dkbTlwWkNBd08xeHVJQ0FnSUNBZ2NISnZZMlZ6Y3k1bGJuWXVUazlFUlY5RlRsWWdJVDA5SUNkd2NtOWtkV04wYVc5dUp5QS9JSGRoY201cGJtY29JVU52Ym5OMGNuVmpkRzl5TG5CeWIzUnZkSGx3WlM1amIyMXdiMjVsYm5SWGFXeHNVbVZqYVdWMlpWQnliM0J6TENBbkpYTWdhR0Z6SUdFZ2JXVjBhRzlrSUdOaGJHeGxaQ0FuSUNzZ0oyTnZiWEJ2Ym1WdWRGZHBiR3hTWldOcFpYWmxVSEp2Y0hNb0tTNGdSR2xrSUhsdmRTQnRaV0Z1SUdOdmJYQnZibVZ1ZEZkcGJHeFNaV05sYVhabFVISnZjSE1vS1Q4bkxDQnpjR1ZqTG1ScGMzQnNZWGxPWVcxbElIeDhJQ2RCSUdOdmJYQnZibVZ1ZENjcElEb2dkbTlwWkNBd08xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGSmxaSFZqWlNCMGFXMWxJSE53Wlc1MElHUnZhVzVuSUd4dmIydDFjSE1nWW5rZ2MyVjBkR2x1WnlCMGFHVnpaU0J2YmlCMGFHVWdjSEp2ZEc5MGVYQmxMbHh1SUNBZ0lHWnZjaUFvZG1GeUlHMWxkR2h2WkU1aGJXVWdhVzRnVW1WaFkzUkRiR0Z6YzBsdWRHVnlabUZqWlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZEYjI1emRISjFZM1J2Y2k1d2NtOTBiM1I1Y0dWYmJXVjBhRzlrVG1GdFpWMHBJSHRjYmlBZ0lDQWdJQ0FnUTI5dWMzUnlkV04wYjNJdWNISnZkRzkwZVhCbFcyMWxkR2h2WkU1aGJXVmRJRDBnYm5Wc2JEdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnUTI5dWMzUnlkV04wYjNJN1hHNGdJSDBzWEc1Y2JpQWdhVzVxWldOMGFXOXVPaUI3WEc0Z0lDQWdhVzVxWldOMFRXbDRhVzQ2SUdaMWJtTjBhVzl1SUNodGFYaHBiaWtnZTF4dUlDQWdJQ0FnYVc1cVpXTjBaV1JOYVhocGJuTXVjSFZ6YUNodGFYaHBiaWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNibjA3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1VtVmhZM1JEYkdGemN6c2lYWDA9IiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBSZWFjdENvbXBvbmVudFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIFJlYWN0Q29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuXG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4nKSA6IF9wcm9kSW52YXJpYW50KCc4NScpIDogdm9pZCAwO1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSk7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyk7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlQ2FsbGJhY2sodGhpcywgY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICB9XG59O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50O1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5U1pXRmpkRU52YlhCdmJtVnVkQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUtseHVJQ29nUTI5d2VYSnBaMmgwSURJd01UTXRjSEpsYzJWdWRDd2dSbUZqWldKdmIyc3NJRWx1WXk1Y2JpQXFJRUZzYkNCeWFXZG9kSE1nY21WelpYSjJaV1F1WEc0Z0tseHVJQ29nVkdocGN5QnpiM1Z5WTJVZ1kyOWtaU0JwY3lCc2FXTmxibk5sWkNCMWJtUmxjaUIwYUdVZ1FsTkVMWE4wZVd4bElHeHBZMlZ1YzJVZ1ptOTFibVFnYVc0Z2RHaGxYRzRnS2lCTVNVTkZUbE5GSUdacGJHVWdhVzRnZEdobElISnZiM1FnWkdseVpXTjBiM0o1SUc5bUlIUm9hWE1nYzI5MWNtTmxJSFJ5WldVdUlFRnVJR0ZrWkdsMGFXOXVZV3dnWjNKaGJuUmNiaUFxSUc5bUlIQmhkR1Z1ZENCeWFXZG9kSE1nWTJGdUlHSmxJR1p2ZFc1a0lHbHVJSFJvWlNCUVFWUkZUbFJUSUdacGJHVWdhVzRnZEdobElITmhiV1VnWkdseVpXTjBiM0o1TGx4dUlDcGNiaUFxSUVCd2NtOTJhV1JsYzAxdlpIVnNaU0JTWldGamRFTnZiWEJ2Ym1WdWRGeHVJQ292WEc1Y2JpZDFjMlVnYzNSeWFXTjBKenRjYmx4dWRtRnlJRjl3Y205a1NXNTJZWEpwWVc1MElEMGdjbVZ4ZFdseVpTZ25MaTl5WldGamRGQnliMlJKYm5aaGNtbGhiblFuS1R0Y2JseHVkbUZ5SUZKbFlXTjBUbTl2Y0ZWd1pHRjBaVkYxWlhWbElEMGdjbVZ4ZFdseVpTZ25MaTlTWldGamRFNXZiM0JWY0dSaGRHVlJkV1YxWlNjcE8xeHVYRzUyWVhJZ1kyRnVSR1ZtYVc1bFVISnZjR1Z5ZEhrZ1BTQnlaWEYxYVhKbEtDY3VMMk5oYmtSbFptbHVaVkJ5YjNCbGNuUjVKeWs3WEc1MllYSWdaVzF3ZEhsUFltcGxZM1FnUFNCeVpYRjFhWEpsS0NkbVltcHpMMnhwWWk5bGJYQjBlVTlpYW1WamRDY3BPMXh1ZG1GeUlHbHVkbUZ5YVdGdWRDQTlJSEpsY1hWcGNtVW9KMlppYW5NdmJHbGlMMmx1ZG1GeWFXRnVkQ2NwTzF4dWRtRnlJSGRoY201cGJtY2dQU0J5WlhGMWFYSmxLQ2RtWW1wekwyeHBZaTkzWVhKdWFXNW5KeWs3WEc1Y2JpOHFLbHh1SUNvZ1FtRnpaU0JqYkdGemN5Qm9aV3h3WlhKeklHWnZjaUIwYUdVZ2RYQmtZWFJwYm1jZ2MzUmhkR1VnYjJZZ1lTQmpiMjF3YjI1bGJuUXVYRzRnS2k5Y2JtWjFibU4wYVc5dUlGSmxZV04wUTI5dGNHOXVaVzUwS0hCeWIzQnpMQ0JqYjI1MFpYaDBMQ0IxY0dSaGRHVnlLU0I3WEc0Z0lIUm9hWE11Y0hKdmNITWdQU0J3Y205d2N6dGNiaUFnZEdocGN5NWpiMjUwWlhoMElEMGdZMjl1ZEdWNGREdGNiaUFnZEdocGN5NXlaV1p6SUQwZ1pXMXdkSGxQWW1wbFkzUTdYRzRnSUM4dklGZGxJR2x1YVhScFlXeHBlbVVnZEdobElHUmxabUYxYkhRZ2RYQmtZWFJsY2lCaWRYUWdkR2hsSUhKbFlXd2diMjVsSUdkbGRITWdhVzVxWldOMFpXUWdZbmtnZEdobFhHNGdJQzh2SUhKbGJtUmxjbVZ5TGx4dUlDQjBhR2x6TG5Wd1pHRjBaWElnUFNCMWNHUmhkR1Z5SUh4OElGSmxZV04wVG05dmNGVndaR0YwWlZGMVpYVmxPMXh1ZlZ4dVhHNVNaV0ZqZEVOdmJYQnZibVZ1ZEM1d2NtOTBiM1I1Y0dVdWFYTlNaV0ZqZEVOdmJYQnZibVZ1ZENBOUlIdDlPMXh1WEc0dktpcGNiaUFxSUZObGRITWdZU0J6ZFdKelpYUWdiMllnZEdobElITjBZWFJsTGlCQmJIZGhlWE1nZFhObElIUm9hWE1nZEc4Z2JYVjBZWFJsWEc0Z0tpQnpkR0YwWlM0Z1dXOTFJSE5vYjNWc1pDQjBjbVZoZENCZ2RHaHBjeTV6ZEdGMFpXQWdZWE1nYVcxdGRYUmhZbXhsTGx4dUlDcGNiaUFxSUZSb1pYSmxJR2x6SUc1dklHZDFZWEpoYm5SbFpTQjBhR0YwSUdCMGFHbHpMbk4wWVhSbFlDQjNhV3hzSUdKbElHbHRiV1ZrYVdGMFpXeDVJSFZ3WkdGMFpXUXNJSE52WEc0Z0tpQmhZMk5sYzNOcGJtY2dZSFJvYVhNdWMzUmhkR1ZnSUdGbWRHVnlJR05oYkd4cGJtY2dkR2hwY3lCdFpYUm9iMlFnYldGNUlISmxkSFZ5YmlCMGFHVWdiMnhrSUhaaGJIVmxMbHh1SUNwY2JpQXFJRlJvWlhKbElHbHpJRzV2SUdkMVlYSmhiblJsWlNCMGFHRjBJR05oYkd4eklIUnZJR0J6WlhSVGRHRjBaV0FnZDJsc2JDQnlkVzRnYzNsdVkyaHliMjV2ZFhOc2VTeGNiaUFxSUdGeklIUm9aWGtnYldGNUlHVjJaVzUwZFdGc2JIa2dZbVVnWW1GMFkyaGxaQ0IwYjJkbGRHaGxjaTRnSUZsdmRTQmpZVzRnY0hKdmRtbGtaU0JoYmlCdmNIUnBiMjVoYkZ4dUlDb2dZMkZzYkdKaFkyc2dkR2hoZENCM2FXeHNJR0psSUdWNFpXTjFkR1ZrSUhkb1pXNGdkR2hsSUdOaGJHd2dkRzhnYzJWMFUzUmhkR1VnYVhNZ1lXTjBkV0ZzYkhsY2JpQXFJR052YlhCc1pYUmxaQzVjYmlBcVhHNGdLaUJYYUdWdUlHRWdablZ1WTNScGIyNGdhWE1nY0hKdmRtbGtaV1FnZEc4Z2MyVjBVM1JoZEdVc0lHbDBJSGRwYkd3Z1ltVWdZMkZzYkdWa0lHRjBJSE52YldVZ2NHOXBiblFnYVc1Y2JpQXFJSFJvWlNCbWRYUjFjbVVnS0c1dmRDQnplVzVqYUhKdmJtOTFjMng1S1M0Z1NYUWdkMmxzYkNCaVpTQmpZV3hzWldRZ2QybDBhQ0IwYUdVZ2RYQWdkRzhnWkdGMFpWeHVJQ29nWTI5dGNHOXVaVzUwSUdGeVozVnRaVzUwY3lBb2MzUmhkR1VzSUhCeWIzQnpMQ0JqYjI1MFpYaDBLUzRnVkdobGMyVWdkbUZzZFdWeklHTmhiaUJpWlNCa2FXWm1aWEpsYm5SY2JpQXFJR1p5YjIwZ2RHaHBjeTRxSUdKbFkyRjFjMlVnZVc5MWNpQm1kVzVqZEdsdmJpQnRZWGtnWW1VZ1kyRnNiR1ZrSUdGbWRHVnlJSEpsWTJWcGRtVlFjbTl3Y3lCaWRYUWdZbVZtYjNKbFhHNGdLaUJ6YUc5MWJHUkRiMjF3YjI1bGJuUlZjR1JoZEdVc0lHRnVaQ0IwYUdseklHNWxkeUJ6ZEdGMFpTd2djSEp2Y0hNc0lHRnVaQ0JqYjI1MFpYaDBJSGRwYkd3Z2JtOTBJSGxsZENCaVpWeHVJQ29nWVhOemFXZHVaV1FnZEc4Z2RHaHBjeTVjYmlBcVhHNGdLaUJBY0dGeVlXMGdlMjlpYW1WamRIeG1kVzVqZEdsdmJuMGdjR0Z5ZEdsaGJGTjBZWFJsSUU1bGVIUWdjR0Z5ZEdsaGJDQnpkR0YwWlNCdmNpQm1kVzVqZEdsdmJpQjBiMXh1SUNvZ0lDQWdJQ0FnSUhCeWIyUjFZMlVnYm1WNGRDQndZWEowYVdGc0lITjBZWFJsSUhSdklHSmxJRzFsY21kbFpDQjNhWFJvSUdOMWNuSmxiblFnYzNSaGRHVXVYRzRnS2lCQWNHRnlZVzBnZXo5bWRXNWpkR2x2Ym4wZ1kyRnNiR0poWTJzZ1EyRnNiR1ZrSUdGbWRHVnlJSE4wWVhSbElHbHpJSFZ3WkdGMFpXUXVYRzRnS2lCQVptbHVZV3hjYmlBcUlFQndjbTkwWldOMFpXUmNiaUFxTDF4dVVtVmhZM1JEYjIxd2IyNWxiblF1Y0hKdmRHOTBlWEJsTG5ObGRGTjBZWFJsSUQwZ1puVnVZM1JwYjI0Z0tIQmhjblJwWVd4VGRHRjBaU3dnWTJGc2JHSmhZMnNwSUh0Y2JpQWdJU2gwZVhCbGIyWWdjR0Z5ZEdsaGJGTjBZWFJsSUQwOVBTQW5iMkpxWldOMEp5QjhmQ0IwZVhCbGIyWWdjR0Z5ZEdsaGJGTjBZWFJsSUQwOVBTQW5ablZ1WTNScGIyNG5JSHg4SUhCaGNuUnBZV3hUZEdGMFpTQTlQU0J1ZFd4c0tTQS9JSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNnUHlCcGJuWmhjbWxoYm5Rb1ptRnNjMlVzSUNkelpYUlRkR0YwWlNndUxpNHBPaUIwWVd0bGN5QmhiaUJ2WW1wbFkzUWdiMllnYzNSaGRHVWdkbUZ5YVdGaWJHVnpJSFJ2SUhWd1pHRjBaU0J2Y2lCaElHWjFibU4wYVc5dUlIZG9hV05vSUhKbGRIVnlibk1nWVc0Z2IySnFaV04wSUc5bUlITjBZWFJsSUhaaGNtbGhZbXhsY3k0bktTQTZJRjl3Y205a1NXNTJZWEpwWVc1MEtDYzROU2NwSURvZ2RtOXBaQ0F3TzF4dUlDQjBhR2x6TG5Wd1pHRjBaWEl1Wlc1eGRXVjFaVk5sZEZOMFlYUmxLSFJvYVhNc0lIQmhjblJwWVd4VGRHRjBaU2s3WEc0Z0lHbG1JQ2hqWVd4c1ltRmpheWtnZTF4dUlDQWdJSFJvYVhNdWRYQmtZWFJsY2k1bGJuRjFaWFZsUTJGc2JHSmhZMnNvZEdocGN5d2dZMkZzYkdKaFkyc3NJQ2R6WlhSVGRHRjBaU2NwTzF4dUlDQjlYRzU5TzF4dVhHNHZLaXBjYmlBcUlFWnZjbU5sY3lCaGJpQjFjR1JoZEdVdUlGUm9hWE1nYzJodmRXeGtJRzl1YkhrZ1ltVWdhVzUyYjJ0bFpDQjNhR1Z1SUdsMElHbHpJR3R1YjNkdUlIZHBkR2hjYmlBcUlHTmxjblJoYVc1MGVTQjBhR0YwSUhkbElHRnlaU0FxS201dmRDb3FJR2x1SUdFZ1JFOU5JSFJ5WVc1ellXTjBhVzl1TGx4dUlDcGNiaUFxSUZsdmRTQnRZWGtnZDJGdWRDQjBieUJqWVd4c0lIUm9hWE1nZDJobGJpQjViM1VnYTI1dmR5QjBhR0YwSUhOdmJXVWdaR1ZsY0dWeUlHRnpjR1ZqZENCdlppQjBhR1ZjYmlBcUlHTnZiWEJ2Ym1WdWRDZHpJSE4wWVhSbElHaGhjeUJqYUdGdVoyVmtJR0oxZENCZ2MyVjBVM1JoZEdWZ0lIZGhjeUJ1YjNRZ1kyRnNiR1ZrTGx4dUlDcGNiaUFxSUZSb2FYTWdkMmxzYkNCdWIzUWdhVzUyYjJ0bElHQnphRzkxYkdSRGIyMXdiMjVsYm5SVmNHUmhkR1ZnTENCaWRYUWdhWFFnZDJsc2JDQnBiblp2YTJWY2JpQXFJR0JqYjIxd2IyNWxiblJYYVd4c1ZYQmtZWFJsWUNCaGJtUWdZR052YlhCdmJtVnVkRVJwWkZWd1pHRjBaV0F1WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHMvWm5WdVkzUnBiMjU5SUdOaGJHeGlZV05ySUVOaGJHeGxaQ0JoWm5SbGNpQjFjR1JoZEdVZ2FYTWdZMjl0Y0d4bGRHVXVYRzRnS2lCQVptbHVZV3hjYmlBcUlFQndjbTkwWldOMFpXUmNiaUFxTDF4dVVtVmhZM1JEYjIxd2IyNWxiblF1Y0hKdmRHOTBlWEJsTG1admNtTmxWWEJrWVhSbElEMGdablZ1WTNScGIyNGdLR05oYkd4aVlXTnJLU0I3WEc0Z0lIUm9hWE11ZFhCa1lYUmxjaTVsYm5GMVpYVmxSbTl5WTJWVmNHUmhkR1VvZEdocGN5azdYRzRnSUdsbUlDaGpZV3hzWW1GamF5a2dlMXh1SUNBZ0lIUm9hWE11ZFhCa1lYUmxjaTVsYm5GMVpYVmxRMkZzYkdKaFkyc29kR2hwY3l3Z1kyRnNiR0poWTJzc0lDZG1iM0pqWlZWd1pHRjBaU2NwTzF4dUlDQjlYRzU5TzF4dVhHNHZLaXBjYmlBcUlFUmxjSEpsWTJGMFpXUWdRVkJKY3k0Z1ZHaGxjMlVnUVZCSmN5QjFjMlZrSUhSdklHVjRhWE4wSUc5dUlHTnNZWE56YVdNZ1VtVmhZM1FnWTJ4aGMzTmxjeUJpZFhRZ2MybHVZMlZjYmlBcUlIZGxJSGR2ZFd4a0lHeHBhMlVnZEc4Z1pHVndjbVZqWVhSbElIUm9aVzBzSUhkbEozSmxJRzV2ZENCbmIybHVaeUIwYnlCdGIzWmxJSFJvWlcwZ2IzWmxjaUIwYnlCMGFHbHpYRzRnS2lCdGIyUmxjbTRnWW1GelpTQmpiR0Z6Y3k0Z1NXNXpkR1ZoWkN3Z2QyVWdaR1ZtYVc1bElHRWdaMlYwZEdWeUlIUm9ZWFFnZDJGeWJuTWdhV1lnYVhRbmN5QmhZMk5sYzNObFpDNWNiaUFxTDF4dWFXWWdLSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNwSUh0Y2JpQWdkbUZ5SUdSbGNISmxZMkYwWldSQlVFbHpJRDBnZTF4dUlDQWdJR2x6VFc5MWJuUmxaRG9nV3lkcGMwMXZkVzUwWldRbkxDQW5TVzV6ZEdWaFpDd2diV0ZyWlNCemRYSmxJSFJ2SUdOc1pXRnVJSFZ3SUhOMVluTmpjbWx3ZEdsdmJuTWdZVzVrSUhCbGJtUnBibWNnY21WeGRXVnpkSE1nYVc0Z0p5QXJJQ2RqYjIxd2IyNWxiblJYYVd4c1ZXNXRiM1Z1ZENCMGJ5QndjbVYyWlc1MElHMWxiVzl5ZVNCc1pXRnJjeTRuWFN4Y2JpQWdJQ0J5WlhCc1lXTmxVM1JoZEdVNklGc25jbVZ3YkdGalpWTjBZWFJsSnl3Z0oxSmxabUZqZEc5eUlIbHZkWElnWTI5a1pTQjBieUIxYzJVZ2MyVjBVM1JoZEdVZ2FXNXpkR1ZoWkNBb2MyVmxJQ2NnS3lBbmFIUjBjSE02THk5bmFYUm9kV0l1WTI5dEwyWmhZMlZpYjI5ckwzSmxZV04wTDJsemMzVmxjeTh6TWpNMktTNG5YVnh1SUNCOU8xeHVJQ0IyWVhJZ1pHVm1hVzVsUkdWd2NtVmpZWFJwYjI1WFlYSnVhVzVuSUQwZ1puVnVZM1JwYjI0Z0tHMWxkR2h2WkU1aGJXVXNJR2x1Wm04cElIdGNiaUFnSUNCcFppQW9ZMkZ1UkdWbWFXNWxVSEp2Y0dWeWRIa3BJSHRjYmlBZ0lDQWdJRTlpYW1WamRDNWtaV1pwYm1WUWNtOXdaWEowZVNoU1pXRmpkRU52YlhCdmJtVnVkQzV3Y205MGIzUjVjR1VzSUcxbGRHaHZaRTVoYldVc0lIdGNiaUFnSUNBZ0lDQWdaMlYwT2lCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlBL0lIZGhjbTVwYm1jb1ptRnNjMlVzSUNjbGN5Z3VMaTRwSUdseklHUmxjSEpsWTJGMFpXUWdhVzRnY0d4aGFXNGdTbUYyWVZOamNtbHdkQ0JTWldGamRDQmpiR0Z6YzJWekxpQWxjeWNzSUdsdVptOWJNRjBzSUdsdVptOWJNVjBwSURvZ2RtOXBaQ0F3TzF4dUlDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMWNiaUFnZlR0Y2JpQWdabTl5SUNoMllYSWdabTVPWVcxbElHbHVJR1JsY0hKbFkyRjBaV1JCVUVsektTQjdYRzRnSUNBZ2FXWWdLR1JsY0hKbFkyRjBaV1JCVUVsekxtaGhjMDkzYmxCeWIzQmxjblI1S0dadVRtRnRaU2twSUh0Y2JpQWdJQ0FnSUdSbFptbHVaVVJsY0hKbFkyRjBhVzl1VjJGeWJtbHVaeWhtYms1aGJXVXNJR1JsY0hKbFkyRjBaV1JCVUVselcyWnVUbUZ0WlYwcE8xeHVJQ0FnSUgxY2JpQWdmVnh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlGSmxZV04wUTI5dGNHOXVaVzUwT3lKZGZRPT0iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0Q29tcG9uZW50VHJlZUhvb2tcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIGlzTmF0aXZlKGZuKSB7XG4gIC8vIEJhc2VkIG9uIGlzTmF0aXZlKCkgZnJvbSBMb2Rhc2hcbiAgdmFyIGZ1bmNUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICsgZnVuY1RvU3RyaW5nXG4gIC8vIFRha2UgYW4gZXhhbXBsZSBuYXRpdmUgZnVuY3Rpb24gc291cmNlIGZvciBjb21wYXJpc29uXG4gIC5jYWxsKGhhc093blByb3BlcnR5KVxuICAvLyBTdHJpcCByZWdleCBjaGFyYWN0ZXJzIHNvIHdlIGNhbiB1c2UgaXQgZm9yIHJlZ2V4XG4gIC5yZXBsYWNlKC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZywgJ1xcXFwkJicpXG4gIC8vIFJlbW92ZSBoYXNPd25Qcm9wZXJ0eSBmcm9tIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IGdlbmVyaWNcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnKTtcbiAgdHJ5IHtcbiAgICB2YXIgc291cmNlID0gZnVuY1RvU3RyaW5nLmNhbGwoZm4pO1xuICAgIHJldHVybiByZUlzTmF0aXZlLnRlc3Qoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbnZhciBjYW5Vc2VDb2xsZWN0aW9ucyA9XG4vLyBBcnJheS5mcm9tXG50eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuLy8gTWFwXG50eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKE1hcCkgJiZcbi8vIE1hcC5wcm90b3R5cGUua2V5c1xuTWFwLnByb3RvdHlwZSAhPSBudWxsICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoTWFwLnByb3RvdHlwZS5rZXlzKSAmJlxuLy8gU2V0XG50eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKFNldCkgJiZcbi8vIFNldC5wcm90b3R5cGUua2V5c1xuU2V0LnByb3RvdHlwZSAhPSBudWxsICYmIHR5cGVvZiBTZXQucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoU2V0LnByb3RvdHlwZS5rZXlzKTtcblxudmFyIGl0ZW1NYXA7XG52YXIgcm9vdElEU2V0O1xuXG52YXIgaXRlbUJ5S2V5O1xudmFyIHJvb3RCeUtleTtcblxuaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gIGl0ZW1NYXAgPSBuZXcgTWFwKCk7XG4gIHJvb3RJRFNldCA9IG5ldyBTZXQoKTtcbn0gZWxzZSB7XG4gIGl0ZW1CeUtleSA9IHt9O1xuICByb290QnlLZXkgPSB7fTtcbn1cblxudmFyIHVubW91bnRlZElEcyA9IFtdO1xuXG4vLyBVc2Ugbm9uLW51bWVyaWMga2V5cyB0byBwcmV2ZW50IFY4IHBlcmZvcm1hbmNlIGlzc3Vlczpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbmZ1bmN0aW9uIGdldEtleUZyb21JRChpZCkge1xuICByZXR1cm4gJy4nICsgaWQ7XG59XG5mdW5jdGlvbiBnZXRJREZyb21LZXkoa2V5KSB7XG4gIHJldHVybiBwYXJzZUludChrZXkuc3Vic3RyKDEpLCAxMCk7XG59XG5cbmZ1bmN0aW9uIGdldChpZCkge1xuICBpZiAoY2FuVXNlQ29sbGVjdGlvbnMpIHtcbiAgICByZXR1cm4gaXRlbU1hcC5nZXQoaWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIHJldHVybiBpdGVtQnlLZXlba2V5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmUoaWQpIHtcbiAgaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gICAgaXRlbU1hcFsnZGVsZXRlJ10oaWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGRlbGV0ZSBpdGVtQnlLZXlba2V5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGUoaWQsIGVsZW1lbnQsIHBhcmVudElEKSB7XG4gIHZhciBpdGVtID0ge1xuICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgcGFyZW50SUQ6IHBhcmVudElELFxuICAgIHRleHQ6IG51bGwsXG4gICAgY2hpbGRJRHM6IFtdLFxuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgdXBkYXRlQ291bnQ6IDBcbiAgfTtcblxuICBpZiAoY2FuVXNlQ29sbGVjdGlvbnMpIHtcbiAgICBpdGVtTWFwLnNldChpZCwgaXRlbSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgaXRlbUJ5S2V5W2tleV0gPSBpdGVtO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFJvb3QoaWQpIHtcbiAgaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gICAgcm9vdElEU2V0LmFkZChpZCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgcm9vdEJ5S2V5W2tleV0gPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJvb3QoaWQpIHtcbiAgaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gICAgcm9vdElEU2V0WydkZWxldGUnXShpZCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgZGVsZXRlIHJvb3RCeUtleVtrZXldO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRJRHMoKSB7XG4gIGlmIChjYW5Vc2VDb2xsZWN0aW9ucykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGl0ZW1NYXAua2V5cygpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoaXRlbUJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSb290SURzKCkge1xuICBpZiAoY2FuVXNlQ29sbGVjdGlvbnMpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShyb290SURTZXQua2V5cygpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocm9vdEJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXJnZURlZXAoaWQpIHtcbiAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICBpZiAoaXRlbSkge1xuICAgIHZhciBjaGlsZElEcyA9IGl0ZW0uY2hpbGRJRHM7XG5cbiAgICByZW1vdmUoaWQpO1xuICAgIGNoaWxkSURzLmZvckVhY2gocHVyZ2VEZWVwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJOYW1lKSB7XG4gIHJldHVybiAnXFxuICAgIGluICcgKyBuYW1lICsgKHNvdXJjZSA/ICcgKGF0ICcgKyBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIgKyAnKScgOiBvd25lck5hbWUgPyAnIChjcmVhdGVkIGJ5ICcgKyBvd25lck5hbWUgKyAnKScgOiAnJyk7XG59XG5cbmZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiAnI2VtcHR5JztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuICcjdGV4dCc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZWxlbWVudC50eXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGVtZW50LnR5cGUuZGlzcGxheU5hbWUgfHwgZWxlbWVudC50eXBlLm5hbWUgfHwgJ1Vua25vd24nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlSUQoaWQpIHtcbiAgdmFyIG5hbWUgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKTtcbiAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICB2YXIgb3duZXJJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7XG4gIHZhciBvd25lck5hbWU7XG4gIGlmIChvd25lcklEKSB7XG4gICAgb3duZXJOYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShvd25lcklEKTtcbiAgfVxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhlbGVtZW50LCAnUmVhY3RDb21wb25lbnRUcmVlSG9vazogTWlzc2luZyBSZWFjdCBlbGVtZW50IGZvciBkZWJ1Z0lEICVzIHdoZW4gJyArICdidWlsZGluZyBzdGFjaycsIGlkKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgZWxlbWVudCAmJiBlbGVtZW50Ll9zb3VyY2UsIG93bmVyTmFtZSk7XG59XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0ge1xuICBvblNldENoaWxkcmVuOiBmdW5jdGlvbiAoaWQsIG5leHRDaGlsZElEcykge1xuICAgIHZhciBpdGVtID0gZ2V0KGlkKTtcbiAgICBpdGVtLmNoaWxkSURzID0gbmV4dENoaWxkSURzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0Q2hpbGRJRHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXh0Q2hpbGRJRCA9IG5leHRDaGlsZElEc1tpXTtcbiAgICAgIHZhciBuZXh0Q2hpbGQgPSBnZXQobmV4dENoaWxkSUQpO1xuICAgICAgIW5leHRDaGlsZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBob29rIGV2ZW50cyB0byBmaXJlIGZvciB0aGUgY2hpbGQgYmVmb3JlIGl0cyBwYXJlbnQgaW5jbHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MCcpIDogdm9pZCAwO1xuICAgICAgIShuZXh0Q2hpbGQuY2hpbGRJRHMgIT0gbnVsbCB8fCB0eXBlb2YgbmV4dENoaWxkLmVsZW1lbnQgIT09ICdvYmplY3QnIHx8IG5leHRDaGlsZC5lbGVtZW50ID09IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uU2V0Q2hpbGRyZW4oKSB0byBmaXJlIGZvciBhIGNvbnRhaW5lciBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnMTQxJykgOiB2b2lkIDA7XG4gICAgICAhbmV4dENoaWxkLmlzTW91bnRlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbk1vdW50Q29tcG9uZW50KCkgdG8gZmlyZSBmb3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCc3MScpIDogdm9pZCAwO1xuICAgICAgaWYgKG5leHRDaGlsZC5wYXJlbnRJRCA9PSBudWxsKSB7XG4gICAgICAgIG5leHRDaGlsZC5wYXJlbnRJRCA9IGlkO1xuICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IG1vdW50aW5nIGEgbmV3IHJvb3QgZHVyaW5nIGluXG4gICAgICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudCBjdXJyZW50bHkgY2F1c2VzIG5vdC15ZXQtbW91bnRlZCBjb21wb25lbnRzIHRvXG4gICAgICAgIC8vIGJlIHB1cmdlZCBmcm9tIG91ciB0cmVlIGRhdGEgc28gdGhlaXIgcGFyZW50IElEIGlzIG1pc3NpbmcuXG4gICAgICB9XG4gICAgICAhKG5leHRDaGlsZC5wYXJlbnRJRCA9PT0gaWQpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uQmVmb3JlTW91bnRDb21wb25lbnQoKSBwYXJlbnQgYW5kIG9uU2V0Q2hpbGRyZW4oKSB0byBiZSBjb25zaXN0ZW50ICglcyBoYXMgcGFyZW50cyAlcyBhbmQgJXMpLicsIG5leHRDaGlsZElELCBuZXh0Q2hpbGQucGFyZW50SUQsIGlkKSA6IF9wcm9kSW52YXJpYW50KCcxNDInLCBuZXh0Q2hpbGRJRCwgbmV4dENoaWxkLnBhcmVudElELCBpZCkgOiB2b2lkIDA7XG4gICAgfVxuICB9LFxuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQsIGVsZW1lbnQsIHBhcmVudElEKSB7XG4gICAgY3JlYXRlKGlkLCBlbGVtZW50LCBwYXJlbnRJRCk7XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoaWQsIGVsZW1lbnQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgaWYgKCFpdGVtIHx8ICFpdGVtLmlzTW91bnRlZCkge1xuICAgICAgLy8gV2UgbWF5IGVuZCB1cCBoZXJlIGFzIGEgcmVzdWx0IG9mIHNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVubW91bnQoKS5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBlbGVtZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmVsZW1lbnQgPSBlbGVtZW50O1xuICB9LFxuICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgaXRlbS5pc01vdW50ZWQgPSB0cnVlO1xuICAgIHZhciBpc1Jvb3QgPSBpdGVtLnBhcmVudElEID09PSAwO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGFkZFJvb3QoaWQpO1xuICAgIH1cbiAgfSxcbiAgb25VcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0KGlkKTtcbiAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaXNNb3VudGVkKSB7XG4gICAgICAvLyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMgYSByZXN1bHQgb2Ygc2V0U3RhdGUoKSBpbiBjb21wb25lbnRXaWxsVW5tb3VudCgpLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1lbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0udXBkYXRlQ291bnQrKztcbiAgfSxcbiAgb25Vbm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgZXhpc3RzLlxuICAgICAgLy8gYGl0ZW1gIG1pZ2h0IG5vdCBleGlzdCBpZiBpdCBpcyBpbnNpZGUgYW4gZXJyb3IgYm91bmRhcnksIGFuZCBhIHNpYmxpbmdcbiAgICAgIC8vIGVycm9yIGJvdW5kYXJ5IGNoaWxkIHRocmV3IHdoaWxlIG1vdW50aW5nLiBUaGVuIHRoaXMgaW5zdGFuY2UgbmV2ZXJcbiAgICAgIC8vIGdvdCBhIGNoYW5jZSB0byBtb3VudCwgYnV0IGl0IHN0aWxsIGdldHMgYW4gdW5tb3VudGluZyBldmVudCBkdXJpbmdcbiAgICAgIC8vIHRoZSBlcnJvciBib3VuZGFyeSBjbGVhbnVwLlxuICAgICAgaXRlbS5pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHZhciBpc1Jvb3QgPSBpdGVtLnBhcmVudElEID09PSAwO1xuICAgICAgaWYgKGlzUm9vdCkge1xuICAgICAgICByZW1vdmVSb290KGlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdW5tb3VudGVkSURzLnB1c2goaWQpO1xuICB9LFxuICBwdXJnZVVubW91bnRlZENvbXBvbmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoUmVhY3RDb21wb25lbnRUcmVlSG9vay5fcHJldmVudFB1cmdpbmcpIHtcbiAgICAgIC8vIFNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bm1vdW50ZWRJRHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZCA9IHVubW91bnRlZElEc1tpXTtcbiAgICAgIHB1cmdlRGVlcChpZCk7XG4gICAgfVxuICAgIHVubW91bnRlZElEcy5sZW5ndGggPSAwO1xuICB9LFxuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0KGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uaXNNb3VudGVkIDogZmFsc2U7XG4gIH0sXG4gIGdldEN1cnJlbnRTdGFja0FkZGVuZHVtOiBmdW5jdGlvbiAodG9wRWxlbWVudCkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgaWYgKHRvcEVsZW1lbnQpIHtcbiAgICAgIHZhciB0eXBlID0gdG9wRWxlbWVudC50eXBlO1xuICAgICAgdmFyIG5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIDogdHlwZTtcbiAgICAgIHZhciBvd25lciA9IHRvcEVsZW1lbnQuX293bmVyO1xuICAgICAgaW5mbyArPSBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUgfHwgJ1Vua25vd24nLCB0b3BFbGVtZW50Ll9zb3VyY2UsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSk7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnRPd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgdmFyIGlkID0gY3VycmVudE93bmVyICYmIGN1cnJlbnRPd25lci5fZGVidWdJRDtcblxuICAgIGluZm8gKz0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChpZCk7XG4gICAgcmV0dXJuIGluZm87XG4gIH0sXG4gIGdldFN0YWNrQWRkZW5kdW1CeUlEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIHdoaWxlIChpZCkge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUlEKGlkKTtcbiAgICAgIGlkID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRQYXJlbnRJRChpZCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9LFxuICBnZXRDaGlsZElEczogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5jaGlsZElEcyA6IFtdO1xuICB9LFxuICBnZXREaXNwbGF5TmFtZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBnZXREaXNwbGF5TmFtZShlbGVtZW50KTtcbiAgfSxcbiAgZ2V0RWxlbWVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXQoaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDtcbiAgfSxcbiAgZ2V0T3duZXJJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5fb3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5fb3duZXIuX2RlYnVnSUQ7XG4gIH0sXG4gIGdldFBhcmVudElEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLnBhcmVudElEIDogbnVsbDtcbiAgfSxcbiAgZ2V0U291cmNlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldChpZCk7XG4gICAgdmFyIGVsZW1lbnQgPSBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDtcbiAgICB2YXIgc291cmNlID0gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5fc291cmNlIDogbnVsbDtcbiAgICByZXR1cm4gc291cmNlO1xuICB9LFxuICBnZXRUZXh0OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiAnJyArIGVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgZ2V0VXBkYXRlQ291bnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0KGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udXBkYXRlQ291bnQgOiAwO1xuICB9LFxuXG5cbiAgZ2V0UmVnaXN0ZXJlZElEczogZ2V0UmVnaXN0ZXJlZElEcyxcblxuICBnZXRSb290SURzOiBnZXRSb290SURzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklteHBZaTlTWldGamRFTnZiWEJ2Ym1WdWRGUnlaV1ZJYjI5ckxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUtseHVJQ29nUTI5d2VYSnBaMmgwSURJd01UWXRjSEpsYzJWdWRDd2dSbUZqWldKdmIyc3NJRWx1WXk1Y2JpQXFJRUZzYkNCeWFXZG9kSE1nY21WelpYSjJaV1F1WEc0Z0tseHVJQ29nVkdocGN5QnpiM1Z5WTJVZ1kyOWtaU0JwY3lCc2FXTmxibk5sWkNCMWJtUmxjaUIwYUdVZ1FsTkVMWE4wZVd4bElHeHBZMlZ1YzJVZ1ptOTFibVFnYVc0Z2RHaGxYRzRnS2lCTVNVTkZUbE5GSUdacGJHVWdhVzRnZEdobElISnZiM1FnWkdseVpXTjBiM0o1SUc5bUlIUm9hWE1nYzI5MWNtTmxJSFJ5WldVdUlFRnVJR0ZrWkdsMGFXOXVZV3dnWjNKaGJuUmNiaUFxSUc5bUlIQmhkR1Z1ZENCeWFXZG9kSE1nWTJGdUlHSmxJR1p2ZFc1a0lHbHVJSFJvWlNCUVFWUkZUbFJUSUdacGJHVWdhVzRnZEdobElITmhiV1VnWkdseVpXTjBiM0o1TGx4dUlDcGNiaUFxSUVCd2NtOTJhV1JsYzAxdlpIVnNaU0JTWldGamRFTnZiWEJ2Ym1WdWRGUnlaV1ZJYjI5clhHNGdLaTljYmx4dUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc1MllYSWdYM0J5YjJSSmJuWmhjbWxoYm5RZ1BTQnlaWEYxYVhKbEtDY3VMM0psWVdOMFVISnZaRWx1ZG1GeWFXRnVkQ2NwTzF4dVhHNTJZWElnVW1WaFkzUkRkWEp5Wlc1MFQzZHVaWElnUFNCeVpYRjFhWEpsS0NjdUwxSmxZV04wUTNWeWNtVnVkRTkzYm1WeUp5azdYRzVjYm5aaGNpQnBiblpoY21saGJuUWdQU0J5WlhGMWFYSmxLQ2RtWW1wekwyeHBZaTlwYm5aaGNtbGhiblFuS1R0Y2JuWmhjaUIzWVhKdWFXNW5JRDBnY21WeGRXbHlaU2duWm1KcWN5OXNhV0l2ZDJGeWJtbHVaeWNwTzF4dVhHNW1kVzVqZEdsdmJpQnBjMDVoZEdsMlpTaG1iaWtnZTF4dUlDQXZMeUJDWVhObFpDQnZiaUJwYzA1aGRHbDJaU2dwSUdaeWIyMGdURzlrWVhOb1hHNGdJSFpoY2lCbWRXNWpWRzlUZEhKcGJtY2dQU0JHZFc1amRHbHZiaTV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWM3WEc0Z0lIWmhjaUJvWVhOUGQyNVFjbTl3WlhKMGVTQTlJRTlpYW1WamRDNXdjbTkwYjNSNWNHVXVhR0Z6VDNkdVVISnZjR1Z5ZEhrN1hHNGdJSFpoY2lCeVpVbHpUbUYwYVhabElEMGdVbVZuUlhod0tDZGVKeUFySUdaMWJtTlViMU4wY21sdVoxeHVJQ0F2THlCVVlXdGxJR0Z1SUdWNFlXMXdiR1VnYm1GMGFYWmxJR1oxYm1OMGFXOXVJSE52ZFhKalpTQm1iM0lnWTI5dGNHRnlhWE52Ymx4dUlDQXVZMkZzYkNob1lYTlBkMjVRY205d1pYSjBlU2xjYmlBZ0x5OGdVM1J5YVhBZ2NtVm5aWGdnWTJoaGNtRmpkR1Z5Y3lCemJ5QjNaU0JqWVc0Z2RYTmxJR2wwSUdadmNpQnlaV2RsZUZ4dUlDQXVjbVZ3YkdGalpTZ3ZXMXhjWEZ4ZUpDNHFLejhvS1Z0Y1hGMTdmWHhkTDJjc0lDZGNYRnhjSkNZbktWeHVJQ0F2THlCU1pXMXZkbVVnYUdGelQzZHVVSEp2Y0dWeWRIa2dabkp2YlNCMGFHVWdkR1Z0Y0d4aGRHVWdkRzhnYldGclpTQnBkQ0JuWlc1bGNtbGpYRzRnSUM1eVpYQnNZV05sS0M5b1lYTlBkMjVRY205d1pYSjBlWHdvWm5WdVkzUnBiMjRwTGlvL0tEODlYRnhjWEZ4Y0tDbDhJR1p2Y2lBdUt6OG9QejFjWEZ4Y1hGeGRLUzluTENBbkpERXVLajhuS1NBcklDY2tKeWs3WEc0Z0lIUnllU0I3WEc0Z0lDQWdkbUZ5SUhOdmRYSmpaU0E5SUdaMWJtTlViMU4wY21sdVp5NWpZV3hzS0dadUtUdGNiaUFnSUNCeVpYUjFjbTRnY21WSmMwNWhkR2wyWlM1MFpYTjBLSE52ZFhKalpTazdYRzRnSUgwZ1kyRjBZMmdnS0dWeWNpa2dlMXh1SUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ2ZWeHVmVnh1WEc1MllYSWdZMkZ1VlhObFEyOXNiR1ZqZEdsdmJuTWdQVnh1THk4Z1FYSnlZWGt1Wm5KdmJWeHVkSGx3Wlc5bUlFRnljbUY1TG1aeWIyMGdQVDA5SUNkbWRXNWpkR2x2YmljZ0ppWmNiaTh2SUUxaGNGeHVkSGx3Wlc5bUlFMWhjQ0E5UFQwZ0oyWjFibU4wYVc5dUp5QW1KaUJwYzA1aGRHbDJaU2hOWVhBcElDWW1YRzR2THlCTllYQXVjSEp2ZEc5MGVYQmxMbXRsZVhOY2JrMWhjQzV3Y205MGIzUjVjR1VnSVQwZ2JuVnNiQ0FtSmlCMGVYQmxiMllnVFdGd0xuQnliM1J2ZEhsd1pTNXJaWGx6SUQwOVBTQW5ablZ1WTNScGIyNG5JQ1ltSUdselRtRjBhWFpsS0UxaGNDNXdjbTkwYjNSNWNHVXVhMlY1Y3lrZ0ppWmNiaTh2SUZObGRGeHVkSGx3Wlc5bUlGTmxkQ0E5UFQwZ0oyWjFibU4wYVc5dUp5QW1KaUJwYzA1aGRHbDJaU2hUWlhRcElDWW1YRzR2THlCVFpYUXVjSEp2ZEc5MGVYQmxMbXRsZVhOY2JsTmxkQzV3Y205MGIzUjVjR1VnSVQwZ2JuVnNiQ0FtSmlCMGVYQmxiMllnVTJWMExuQnliM1J2ZEhsd1pTNXJaWGx6SUQwOVBTQW5ablZ1WTNScGIyNG5JQ1ltSUdselRtRjBhWFpsS0ZObGRDNXdjbTkwYjNSNWNHVXVhMlY1Y3lrN1hHNWNiblpoY2lCcGRHVnRUV0Z3TzF4dWRtRnlJSEp2YjNSSlJGTmxkRHRjYmx4dWRtRnlJR2wwWlcxQ2VVdGxlVHRjYm5aaGNpQnliMjkwUW5sTFpYazdYRzVjYm1sbUlDaGpZVzVWYzJWRGIyeHNaV04wYVc5dWN5a2dlMXh1SUNCcGRHVnRUV0Z3SUQwZ2JtVjNJRTFoY0NncE8xeHVJQ0J5YjI5MFNVUlRaWFFnUFNCdVpYY2dVMlYwS0NrN1hHNTlJR1ZzYzJVZ2UxeHVJQ0JwZEdWdFFubExaWGtnUFNCN2ZUdGNiaUFnY205dmRFSjVTMlY1SUQwZ2UzMDdYRzU5WEc1Y2JuWmhjaUIxYm0xdmRXNTBaV1JKUkhNZ1BTQmJYVHRjYmx4dUx5OGdWWE5sSUc1dmJpMXVkVzFsY21saklHdGxlWE1nZEc4Z2NISmxkbVZ1ZENCV09DQndaWEptYjNKdFlXNWpaU0JwYzNOMVpYTTZYRzR2THlCb2RIUndjem92TDJkcGRHaDFZaTVqYjIwdlptRmpaV0p2YjJzdmNtVmhZM1F2Y0hWc2JDODNNak15WEc1bWRXNWpkR2x2YmlCblpYUkxaWGxHY205dFNVUW9hV1FwSUh0Y2JpQWdjbVYwZFhKdUlDY3VKeUFySUdsa08xeHVmVnh1Wm5WdVkzUnBiMjRnWjJWMFNVUkdjbTl0UzJWNUtHdGxlU2tnZTF4dUlDQnlaWFIxY200Z2NHRnljMlZKYm5Rb2EyVjVMbk4xWW5OMGNpZ3hLU3dnTVRBcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCblpYUW9hV1FwSUh0Y2JpQWdhV1lnS0dOaGJsVnpaVU52Ykd4bFkzUnBiMjV6S1NCN1hHNGdJQ0FnY21WMGRYSnVJR2wwWlcxTllYQXVaMlYwS0dsa0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQjJZWElnYTJWNUlEMGdaMlYwUzJWNVJuSnZiVWxFS0dsa0tUdGNiaUFnSUNCeVpYUjFjbTRnYVhSbGJVSjVTMlY1VzJ0bGVWMDdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnY21WdGIzWmxLR2xrS1NCN1hHNGdJR2xtSUNoallXNVZjMlZEYjJ4c1pXTjBhVzl1Y3lrZ2UxeHVJQ0FnSUdsMFpXMU5ZWEJiSjJSbGJHVjBaU2RkS0dsa0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQjJZWElnYTJWNUlEMGdaMlYwUzJWNVJuSnZiVWxFS0dsa0tUdGNiaUFnSUNCa1pXeGxkR1VnYVhSbGJVSjVTMlY1VzJ0bGVWMDdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTNKbFlYUmxLR2xrTENCbGJHVnRaVzUwTENCd1lYSmxiblJKUkNrZ2UxeHVJQ0IyWVhJZ2FYUmxiU0E5SUh0Y2JpQWdJQ0JsYkdWdFpXNTBPaUJsYkdWdFpXNTBMRnh1SUNBZ0lIQmhjbVZ1ZEVsRU9pQndZWEpsYm5SSlJDeGNiaUFnSUNCMFpYaDBPaUJ1ZFd4c0xGeHVJQ0FnSUdOb2FXeGtTVVJ6T2lCYlhTeGNiaUFnSUNCcGMwMXZkVzUwWldRNklHWmhiSE5sTEZ4dUlDQWdJSFZ3WkdGMFpVTnZkVzUwT2lBd1hHNGdJSDA3WEc1Y2JpQWdhV1lnS0dOaGJsVnpaVU52Ykd4bFkzUnBiMjV6S1NCN1hHNGdJQ0FnYVhSbGJVMWhjQzV6WlhRb2FXUXNJR2wwWlcwcE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lIWmhjaUJyWlhrZ1BTQm5aWFJMWlhsR2NtOXRTVVFvYVdRcE8xeHVJQ0FnSUdsMFpXMUNlVXRsZVZ0clpYbGRJRDBnYVhSbGJUdGNiaUFnZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJoWkdSU2IyOTBLR2xrS1NCN1hHNGdJR2xtSUNoallXNVZjMlZEYjJ4c1pXTjBhVzl1Y3lrZ2UxeHVJQ0FnSUhKdmIzUkpSRk5sZEM1aFpHUW9hV1FwTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhaaGNpQnJaWGtnUFNCblpYUkxaWGxHY205dFNVUW9hV1FwTzF4dUlDQWdJSEp2YjNSQ2VVdGxlVnRyWlhsZElEMGdkSEoxWlR0Y2JpQWdmVnh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnlaVzF2ZG1WU2IyOTBLR2xrS1NCN1hHNGdJR2xtSUNoallXNVZjMlZEYjJ4c1pXTjBhVzl1Y3lrZ2UxeHVJQ0FnSUhKdmIzUkpSRk5sZEZzblpHVnNaWFJsSjEwb2FXUXBPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSFpoY2lCclpYa2dQU0JuWlhSTFpYbEdjbTl0U1VRb2FXUXBPMXh1SUNBZ0lHUmxiR1YwWlNCeWIyOTBRbmxMWlhsYmEyVjVYVHRjYmlBZ2ZWeHVmVnh1WEc1bWRXNWpkR2x2YmlCblpYUlNaV2RwYzNSbGNtVmtTVVJ6S0NrZ2UxeHVJQ0JwWmlBb1kyRnVWWE5sUTI5c2JHVmpkR2x2Ym5NcElIdGNiaUFnSUNCeVpYUjFjbTRnUVhKeVlYa3Vabkp2YlNocGRHVnRUV0Z3TG10bGVYTW9LU2s3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnY21WMGRYSnVJRTlpYW1WamRDNXJaWGx6S0dsMFpXMUNlVXRsZVNrdWJXRndLR2RsZEVsRVJuSnZiVXRsZVNrN1hHNGdJSDFjYm4xY2JseHVablZ1WTNScGIyNGdaMlYwVW05dmRFbEVjeWdwSUh0Y2JpQWdhV1lnS0dOaGJsVnpaVU52Ykd4bFkzUnBiMjV6S1NCN1hHNGdJQ0FnY21WMGRYSnVJRUZ5Y21GNUxtWnliMjBvY205dmRFbEVVMlYwTG10bGVYTW9LU2s3WEc0Z0lIMGdaV3h6WlNCN1hHNGdJQ0FnY21WMGRYSnVJRTlpYW1WamRDNXJaWGx6S0hKdmIzUkNlVXRsZVNrdWJXRndLR2RsZEVsRVJuSnZiVXRsZVNrN1hHNGdJSDFjYm4xY2JseHVablZ1WTNScGIyNGdjSFZ5WjJWRVpXVndLR2xrS1NCN1hHNGdJSFpoY2lCcGRHVnRJRDBnWjJWMEtHbGtLVHRjYmlBZ2FXWWdLR2wwWlcwcElIdGNiaUFnSUNCMllYSWdZMmhwYkdSSlJITWdQU0JwZEdWdExtTm9hV3hrU1VSek8xeHVYRzRnSUNBZ2NtVnRiM1psS0dsa0tUdGNiaUFnSUNCamFHbHNaRWxFY3k1bWIzSkZZV05vS0hCMWNtZGxSR1ZsY0NrN1hHNGdJSDFjYm4xY2JseHVablZ1WTNScGIyNGdaR1Z6WTNKcFltVkRiMjF3YjI1bGJuUkdjbUZ0WlNodVlXMWxMQ0J6YjNWeVkyVXNJRzkzYm1WeVRtRnRaU2tnZTF4dUlDQnlaWFIxY200Z0oxeGNiaUFnSUNCcGJpQW5JQ3NnYm1GdFpTQXJJQ2h6YjNWeVkyVWdQeUFuSUNoaGRDQW5JQ3NnYzI5MWNtTmxMbVpwYkdWT1lXMWxMbkpsY0d4aFkyVW9MMTR1S2x0Y1hGeGNYRnd2WFM4c0lDY25LU0FySUNjNkp5QXJJSE52ZFhKalpTNXNhVzVsVG5WdFltVnlJQ3NnSnlrbklEb2diM2R1WlhKT1lXMWxJRDhnSnlBb1kzSmxZWFJsWkNCaWVTQW5JQ3NnYjNkdVpYSk9ZVzFsSUNzZ0p5a25JRG9nSnljcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCblpYUkVhWE53YkdGNVRtRnRaU2hsYkdWdFpXNTBLU0I3WEc0Z0lHbG1JQ2hsYkdWdFpXNTBJRDA5SUc1MWJHd3BJSHRjYmlBZ0lDQnlaWFIxY200Z0p5TmxiWEIwZVNjN1hHNGdJSDBnWld4elpTQnBaaUFvZEhsd1pXOW1JR1ZzWlcxbGJuUWdQVDA5SUNkemRISnBibWNuSUh4OElIUjVjR1Z2WmlCbGJHVnRaVzUwSUQwOVBTQW5iblZ0WW1WeUp5a2dlMXh1SUNBZ0lISmxkSFZ5YmlBbkkzUmxlSFFuTzF4dUlDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dWdlppQmxiR1Z0Wlc1MExuUjVjR1VnUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ2NtVjBkWEp1SUdWc1pXMWxiblF1ZEhsd1pUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnlaWFIxY200Z1pXeGxiV1Z1ZEM1MGVYQmxMbVJwYzNCc1lYbE9ZVzFsSUh4OElHVnNaVzFsYm5RdWRIbHdaUzV1WVcxbElIeDhJQ2RWYm10dWIzZHVKenRjYmlBZ2ZWeHVmVnh1WEc1bWRXNWpkR2x2YmlCa1pYTmpjbWxpWlVsRUtHbGtLU0I3WEc0Z0lIWmhjaUJ1WVcxbElEMGdVbVZoWTNSRGIyMXdiMjVsYm5SVWNtVmxTRzl2YXk1blpYUkVhWE53YkdGNVRtRnRaU2hwWkNrN1hHNGdJSFpoY2lCbGJHVnRaVzUwSUQwZ1VtVmhZM1JEYjIxd2IyNWxiblJVY21WbFNHOXZheTVuWlhSRmJHVnRaVzUwS0dsa0tUdGNiaUFnZG1GeUlHOTNibVZ5U1VRZ1BTQlNaV0ZqZEVOdmJYQnZibVZ1ZEZSeVpXVkliMjlyTG1kbGRFOTNibVZ5U1VRb2FXUXBPMXh1SUNCMllYSWdiM2R1WlhKT1lXMWxPMXh1SUNCcFppQW9iM2R1WlhKSlJDa2dlMXh1SUNBZ0lHOTNibVZ5VG1GdFpTQTlJRkpsWVdOMFEyOXRjRzl1Wlc1MFZISmxaVWh2YjJzdVoyVjBSR2x6Y0d4aGVVNWhiV1VvYjNkdVpYSkpSQ2s3WEc0Z0lIMWNiaUFnY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlBL0lIZGhjbTVwYm1jb1pXeGxiV1Z1ZEN3Z0oxSmxZV04wUTI5dGNHOXVaVzUwVkhKbFpVaHZiMnM2SUUxcGMzTnBibWNnVW1WaFkzUWdaV3hsYldWdWRDQm1iM0lnWkdWaWRXZEpSQ0FsY3lCM2FHVnVJQ2NnS3lBblluVnBiR1JwYm1jZ2MzUmhZMnNuTENCcFpDa2dPaUIyYjJsa0lEQTdYRzRnSUhKbGRIVnliaUJrWlhOamNtbGlaVU52YlhCdmJtVnVkRVp5WVcxbEtHNWhiV1VzSUdWc1pXMWxiblFnSmlZZ1pXeGxiV1Z1ZEM1ZmMyOTFjbU5sTENCdmQyNWxjazVoYldVcE8xeHVmVnh1WEc1MllYSWdVbVZoWTNSRGIyMXdiMjVsYm5SVWNtVmxTRzl2YXlBOUlIdGNiaUFnYjI1VFpYUkRhR2xzWkhKbGJqb2dablZ1WTNScGIyNGdLR2xrTENCdVpYaDBRMmhwYkdSSlJITXBJSHRjYmlBZ0lDQjJZWElnYVhSbGJTQTlJR2RsZENocFpDazdYRzRnSUNBZ2FYUmxiUzVqYUdsc1pFbEVjeUE5SUc1bGVIUkRhR2xzWkVsRWN6dGNibHh1SUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3T3lCcElEd2dibVY0ZEVOb2FXeGtTVVJ6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQjJZWElnYm1WNGRFTm9hV3hrU1VRZ1BTQnVaWGgwUTJocGJHUkpSSE5iYVYwN1hHNGdJQ0FnSUNCMllYSWdibVY0ZEVOb2FXeGtJRDBnWjJWMEtHNWxlSFJEYUdsc1pFbEVLVHRjYmlBZ0lDQWdJQ0Z1WlhoMFEyaHBiR1FnUHlCd2NtOWpaWE56TG1WdWRpNU9UMFJGWDBWT1ZpQWhQVDBnSjNCeWIyUjFZM1JwYjI0bklEOGdhVzUyWVhKcFlXNTBLR1poYkhObExDQW5SWGh3WldOMFpXUWdhRzl2YXlCbGRtVnVkSE1nZEc4Z1ptbHlaU0JtYjNJZ2RHaGxJR05vYVd4a0lHSmxabTl5WlNCcGRITWdjR0Z5Wlc1MElHbHVZMngxWkdWeklHbDBJR2x1SUc5dVUyVjBRMmhwYkdSeVpXNG9LUzRuS1NBNklGOXdjbTlrU1c1MllYSnBZVzUwS0NjeE5EQW5LU0E2SUhadmFXUWdNRHRjYmlBZ0lDQWdJQ0VvYm1WNGRFTm9hV3hrTG1Ob2FXeGtTVVJ6SUNFOUlHNTFiR3dnZkh3Z2RIbHdaVzltSUc1bGVIUkRhR2xzWkM1bGJHVnRaVzUwSUNFOVBTQW5iMkpxWldOMEp5QjhmQ0J1WlhoMFEyaHBiR1F1Wld4bGJXVnVkQ0E5UFNCdWRXeHNLU0EvSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QnBiblpoY21saGJuUW9abUZzYzJVc0lDZEZlSEJsWTNSbFpDQnZibE5sZEVOb2FXeGtjbVZ1S0NrZ2RHOGdabWx5WlNCbWIzSWdZU0JqYjI1MFlXbHVaWElnWTJocGJHUWdZbVZtYjNKbElHbDBjeUJ3WVhKbGJuUWdhVzVqYkhWa1pYTWdhWFFnYVc0Z2IyNVRaWFJEYUdsc1pISmxiaWdwTGljcElEb2dYM0J5YjJSSmJuWmhjbWxoYm5Rb0p6RTBNU2NwSURvZ2RtOXBaQ0F3TzF4dUlDQWdJQ0FnSVc1bGVIUkRhR2xzWkM1cGMwMXZkVzUwWldRZ1B5QndjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5JRDhnYVc1MllYSnBZVzUwS0daaGJITmxMQ0FuUlhod1pXTjBaV1FnYjI1TmIzVnVkRU52YlhCdmJtVnVkQ2dwSUhSdklHWnBjbVVnWm05eUlIUm9aU0JqYUdsc1pDQmlaV1p2Y21VZ2FYUnpJSEJoY21WdWRDQnBibU5zZFdSbGN5QnBkQ0JwYmlCdmJsTmxkRU5vYVd4a2NtVnVLQ2t1SnlrZ09pQmZjSEp2WkVsdWRtRnlhV0Z1ZENnbk56RW5LU0E2SUhadmFXUWdNRHRjYmlBZ0lDQWdJR2xtSUNodVpYaDBRMmhwYkdRdWNHRnlaVzUwU1VRZ1BUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ0lDQnVaWGgwUTJocGJHUXVjR0Z5Wlc1MFNVUWdQU0JwWkR0Y2JpQWdJQ0FnSUNBZ0x5OGdWRTlFVHpvZ1ZHaHBjeUJ6YUc5MWJHUnVKM1FnWW1VZ2JtVmpaWE56WVhKNUlHSjFkQ0J0YjNWdWRHbHVaeUJoSUc1bGR5QnliMjkwSUdSMWNtbHVaeUJwYmx4dUlDQWdJQ0FnSUNBdkx5QmpiMjF3YjI1bGJuUlhhV3hzVFc5MWJuUWdZM1Z5Y21WdWRHeDVJR05oZFhObGN5QnViM1F0ZVdWMExXMXZkVzUwWldRZ1kyOXRjRzl1Wlc1MGN5QjBiMXh1SUNBZ0lDQWdJQ0F2THlCaVpTQndkWEpuWldRZ1puSnZiU0J2ZFhJZ2RISmxaU0JrWVhSaElITnZJSFJvWldseUlIQmhjbVZ1ZENCSlJDQnBjeUJ0YVhOemFXNW5MbHh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdJU2h1WlhoMFEyaHBiR1F1Y0dGeVpXNTBTVVFnUFQwOUlHbGtLU0EvSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QnBiblpoY21saGJuUW9abUZzYzJVc0lDZEZlSEJsWTNSbFpDQnZia0psWm05eVpVMXZkVzUwUTI5dGNHOXVaVzUwS0NrZ2NHRnlaVzUwSUdGdVpDQnZibE5sZEVOb2FXeGtjbVZ1S0NrZ2RHOGdZbVVnWTI5dWMybHpkR1Z1ZENBb0pYTWdhR0Z6SUhCaGNtVnVkSE1nSlhNZ1lXNWtJQ1Z6S1M0bkxDQnVaWGgwUTJocGJHUkpSQ3dnYm1WNGRFTm9hV3hrTG5CaGNtVnVkRWxFTENCcFpDa2dPaUJmY0hKdlpFbHVkbUZ5YVdGdWRDZ25NVFF5Snl3Z2JtVjRkRU5vYVd4a1NVUXNJRzVsZUhSRGFHbHNaQzV3WVhKbGJuUkpSQ3dnYVdRcElEb2dkbTlwWkNBd08xeHVJQ0FnSUgxY2JpQWdmU3hjYmlBZ2IyNUNaV1p2Y21WTmIzVnVkRU52YlhCdmJtVnVkRG9nWm5WdVkzUnBiMjRnS0dsa0xDQmxiR1Z0Wlc1MExDQndZWEpsYm5SSlJDa2dlMXh1SUNBZ0lHTnlaV0YwWlNocFpDd2daV3hsYldWdWRDd2djR0Z5Wlc1MFNVUXBPMXh1SUNCOUxGeHVJQ0J2YmtKbFptOXlaVlZ3WkdGMFpVTnZiWEJ2Ym1WdWREb2dablZ1WTNScGIyNGdLR2xrTENCbGJHVnRaVzUwS1NCN1hHNGdJQ0FnZG1GeUlHbDBaVzBnUFNCblpYUW9hV1FwTzF4dUlDQWdJR2xtSUNnaGFYUmxiU0I4ZkNBaGFYUmxiUzVwYzAxdmRXNTBaV1FwSUh0Y2JpQWdJQ0FnSUM4dklGZGxJRzFoZVNCbGJtUWdkWEFnYUdWeVpTQmhjeUJoSUhKbGMzVnNkQ0J2WmlCelpYUlRkR0YwWlNncElHbHVJR052YlhCdmJtVnVkRmRwYkd4VmJtMXZkVzUwS0NrdVhHNGdJQ0FnSUNBdkx5QkpiaUIwYUdseklHTmhjMlVzSUdsbmJtOXlaU0IwYUdVZ1pXeGxiV1Z1ZEM1Y2JpQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQjlYRzRnSUNBZ2FYUmxiUzVsYkdWdFpXNTBJRDBnWld4bGJXVnVkRHRjYmlBZ2ZTeGNiaUFnYjI1TmIzVnVkRU52YlhCdmJtVnVkRG9nWm5WdVkzUnBiMjRnS0dsa0tTQjdYRzRnSUNBZ2RtRnlJR2wwWlcwZ1BTQm5aWFFvYVdRcE8xeHVJQ0FnSUdsMFpXMHVhWE5OYjNWdWRHVmtJRDBnZEhKMVpUdGNiaUFnSUNCMllYSWdhWE5TYjI5MElEMGdhWFJsYlM1d1lYSmxiblJKUkNBOVBUMGdNRHRjYmlBZ0lDQnBaaUFvYVhOU2IyOTBLU0I3WEc0Z0lDQWdJQ0JoWkdSU2IyOTBLR2xrS1R0Y2JpQWdJQ0I5WEc0Z0lIMHNYRzRnSUc5dVZYQmtZWFJsUTI5dGNHOXVaVzUwT2lCbWRXNWpkR2x2YmlBb2FXUXBJSHRjYmlBZ0lDQjJZWElnYVhSbGJTQTlJR2RsZENocFpDazdYRzRnSUNBZ2FXWWdLQ0ZwZEdWdElIeDhJQ0ZwZEdWdExtbHpUVzkxYm5SbFpDa2dlMXh1SUNBZ0lDQWdMeThnVjJVZ2JXRjVJR1Z1WkNCMWNDQm9aWEpsSUdGeklHRWdjbVZ6ZFd4MElHOW1JSE5sZEZOMFlYUmxLQ2tnYVc0Z1kyOXRjRzl1Wlc1MFYybHNiRlZ1Ylc5MWJuUW9LUzVjYmlBZ0lDQWdJQzh2SUVsdUlIUm9hWE1nWTJGelpTd2dhV2R1YjNKbElIUm9aU0JsYkdWdFpXNTBMbHh1SUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUgxY2JpQWdJQ0JwZEdWdExuVndaR0YwWlVOdmRXNTBLeXM3WEc0Z0lIMHNYRzRnSUc5dVZXNXRiM1Z1ZEVOdmJYQnZibVZ1ZERvZ1puVnVZM1JwYjI0Z0tHbGtLU0I3WEc0Z0lDQWdkbUZ5SUdsMFpXMGdQU0JuWlhRb2FXUXBPMXh1SUNBZ0lHbG1JQ2hwZEdWdEtTQjdYRzRnSUNBZ0lDQXZMeUJYWlNCdVpXVmtJSFJ2SUdOb1pXTnJJR2xtSUdsMElHVjRhWE4wY3k1Y2JpQWdJQ0FnSUM4dklHQnBkR1Z0WUNCdGFXZG9kQ0J1YjNRZ1pYaHBjM1FnYVdZZ2FYUWdhWE1nYVc1emFXUmxJR0Z1SUdWeWNtOXlJR0p2ZFc1a1lYSjVMQ0JoYm1RZ1lTQnphV0pzYVc1blhHNGdJQ0FnSUNBdkx5Qmxjbkp2Y2lCaWIzVnVaR0Z5ZVNCamFHbHNaQ0IwYUhKbGR5QjNhR2xzWlNCdGIzVnVkR2x1Wnk0Z1ZHaGxiaUIwYUdseklHbHVjM1JoYm1ObElHNWxkbVZ5WEc0Z0lDQWdJQ0F2THlCbmIzUWdZU0JqYUdGdVkyVWdkRzhnYlc5MWJuUXNJR0oxZENCcGRDQnpkR2xzYkNCblpYUnpJR0Z1SUhWdWJXOTFiblJwYm1jZ1pYWmxiblFnWkhWeWFXNW5YRzRnSUNBZ0lDQXZMeUIwYUdVZ1pYSnliM0lnWW05MWJtUmhjbmtnWTJ4bFlXNTFjQzVjYmlBZ0lDQWdJR2wwWlcwdWFYTk5iM1Z1ZEdWa0lEMGdabUZzYzJVN1hHNGdJQ0FnSUNCMllYSWdhWE5TYjI5MElEMGdhWFJsYlM1d1lYSmxiblJKUkNBOVBUMGdNRHRjYmlBZ0lDQWdJR2xtSUNocGMxSnZiM1FwSUh0Y2JpQWdJQ0FnSUNBZ2NtVnRiM1psVW05dmRDaHBaQ2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lIVnViVzkxYm5SbFpFbEVjeTV3ZFhOb0tHbGtLVHRjYmlBZ2ZTeGNiaUFnY0hWeVoyVlZibTF2ZFc1MFpXUkRiMjF3YjI1bGJuUnpPaUJtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnYVdZZ0tGSmxZV04wUTI5dGNHOXVaVzUwVkhKbFpVaHZiMnN1WDNCeVpYWmxiblJRZFhKbmFXNW5LU0I3WEc0Z0lDQWdJQ0F2THlCVGFHOTFiR1FnYjI1c2VTQmlaU0IxYzJWa0lHWnZjaUIwWlhOMGFXNW5MbHh1SUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z2RXNXRiM1Z1ZEdWa1NVUnpMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMllYSWdhV1FnUFNCMWJtMXZkVzUwWldSSlJITmJhVjA3WEc0Z0lDQWdJQ0J3ZFhKblpVUmxaWEFvYVdRcE8xeHVJQ0FnSUgxY2JpQWdJQ0IxYm0xdmRXNTBaV1JKUkhNdWJHVnVaM1JvSUQwZ01EdGNiaUFnZlN4Y2JpQWdhWE5OYjNWdWRHVmtPaUJtZFc1amRHbHZiaUFvYVdRcElIdGNiaUFnSUNCMllYSWdhWFJsYlNBOUlHZGxkQ2hwWkNrN1hHNGdJQ0FnY21WMGRYSnVJR2wwWlcwZ1B5QnBkR1Z0TG1selRXOTFiblJsWkNBNklHWmhiSE5sTzF4dUlDQjlMRnh1SUNCblpYUkRkWEp5Wlc1MFUzUmhZMnRCWkdSbGJtUjFiVG9nWm5WdVkzUnBiMjRnS0hSdmNFVnNaVzFsYm5RcElIdGNiaUFnSUNCMllYSWdhVzVtYnlBOUlDY25PMXh1SUNBZ0lHbG1JQ2gwYjNCRmJHVnRaVzUwS1NCN1hHNGdJQ0FnSUNCMllYSWdkSGx3WlNBOUlIUnZjRVZzWlcxbGJuUXVkSGx3WlR0Y2JpQWdJQ0FnSUhaaGNpQnVZVzFsSUQwZ2RIbHdaVzltSUhSNWNHVWdQVDA5SUNkbWRXNWpkR2x2YmljZ1B5QjBlWEJsTG1ScGMzQnNZWGxPWVcxbElIeDhJSFI1Y0dVdWJtRnRaU0E2SUhSNWNHVTdYRzRnSUNBZ0lDQjJZWElnYjNkdVpYSWdQU0IwYjNCRmJHVnRaVzUwTGw5dmQyNWxjanRjYmlBZ0lDQWdJR2x1Wm04Z0t6MGdaR1Z6WTNKcFltVkRiMjF3YjI1bGJuUkdjbUZ0WlNodVlXMWxJSHg4SUNkVmJtdHViM2R1Snl3Z2RHOXdSV3hsYldWdWRDNWZjMjkxY21ObExDQnZkMjVsY2lBbUppQnZkMjVsY2k1blpYUk9ZVzFsS0NrcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQmpkWEp5Wlc1MFQzZHVaWElnUFNCU1pXRmpkRU4xY25KbGJuUlBkMjVsY2k1amRYSnlaVzUwTzF4dUlDQWdJSFpoY2lCcFpDQTlJR04xY25KbGJuUlBkMjVsY2lBbUppQmpkWEp5Wlc1MFQzZHVaWEl1WDJSbFluVm5TVVE3WEc1Y2JpQWdJQ0JwYm1adklDczlJRkpsWVdOMFEyOXRjRzl1Wlc1MFZISmxaVWh2YjJzdVoyVjBVM1JoWTJ0QlpHUmxibVIxYlVKNVNVUW9hV1FwTzF4dUlDQWdJSEpsZEhWeWJpQnBibVp2TzF4dUlDQjlMRnh1SUNCblpYUlRkR0ZqYTBGa1pHVnVaSFZ0UW5sSlJEb2dablZ1WTNScGIyNGdLR2xrS1NCN1hHNGdJQ0FnZG1GeUlHbHVabThnUFNBbkp6dGNiaUFnSUNCM2FHbHNaU0FvYVdRcElIdGNiaUFnSUNBZ0lHbHVabThnS3owZ1pHVnpZM0pwWW1WSlJDaHBaQ2s3WEc0Z0lDQWdJQ0JwWkNBOUlGSmxZV04wUTI5dGNHOXVaVzUwVkhKbFpVaHZiMnN1WjJWMFVHRnlaVzUwU1VRb2FXUXBPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnYVc1bWJ6dGNiaUFnZlN4Y2JpQWdaMlYwUTJocGJHUkpSSE02SUdaMWJtTjBhVzl1SUNocFpDa2dlMXh1SUNBZ0lIWmhjaUJwZEdWdElEMGdaMlYwS0dsa0tUdGNiaUFnSUNCeVpYUjFjbTRnYVhSbGJTQS9JR2wwWlcwdVkyaHBiR1JKUkhNZ09pQmJYVHRjYmlBZ2ZTeGNiaUFnWjJWMFJHbHpjR3hoZVU1aGJXVTZJR1oxYm1OMGFXOXVJQ2hwWkNrZ2UxeHVJQ0FnSUhaaGNpQmxiR1Z0Wlc1MElEMGdVbVZoWTNSRGIyMXdiMjVsYm5SVWNtVmxTRzl2YXk1blpYUkZiR1Z0Wlc1MEtHbGtLVHRjYmlBZ0lDQnBaaUFvSVdWc1pXMWxiblFwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ1ZFd4c08xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdaMlYwUkdsemNHeGhlVTVoYldVb1pXeGxiV1Z1ZENrN1hHNGdJSDBzWEc0Z0lHZGxkRVZzWlcxbGJuUTZJR1oxYm1OMGFXOXVJQ2hwWkNrZ2UxeHVJQ0FnSUhaaGNpQnBkR1Z0SUQwZ1oyVjBLR2xrS1R0Y2JpQWdJQ0J5WlhSMWNtNGdhWFJsYlNBL0lHbDBaVzB1Wld4bGJXVnVkQ0E2SUc1MWJHdzdYRzRnSUgwc1hHNGdJR2RsZEU5M2JtVnlTVVE2SUdaMWJtTjBhVzl1SUNocFpDa2dlMXh1SUNBZ0lIWmhjaUJsYkdWdFpXNTBJRDBnVW1WaFkzUkRiMjF3YjI1bGJuUlVjbVZsU0c5dmF5NW5aWFJGYkdWdFpXNTBLR2xrS1R0Y2JpQWdJQ0JwWmlBb0lXVnNaVzFsYm5RZ2ZId2dJV1ZzWlcxbGJuUXVYMjkzYm1WeUtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2JuVnNiRHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUdWc1pXMWxiblF1WDI5M2JtVnlMbDlrWldKMVowbEVPMXh1SUNCOUxGeHVJQ0JuWlhSUVlYSmxiblJKUkRvZ1puVnVZM1JwYjI0Z0tHbGtLU0I3WEc0Z0lDQWdkbUZ5SUdsMFpXMGdQU0JuWlhRb2FXUXBPMXh1SUNBZ0lISmxkSFZ5YmlCcGRHVnRJRDhnYVhSbGJTNXdZWEpsYm5SSlJDQTZJRzUxYkd3N1hHNGdJSDBzWEc0Z0lHZGxkRk52ZFhKalpUb2dablZ1WTNScGIyNGdLR2xrS1NCN1hHNGdJQ0FnZG1GeUlHbDBaVzBnUFNCblpYUW9hV1FwTzF4dUlDQWdJSFpoY2lCbGJHVnRaVzUwSUQwZ2FYUmxiU0EvSUdsMFpXMHVaV3hsYldWdWRDQTZJRzUxYkd3N1hHNGdJQ0FnZG1GeUlITnZkWEpqWlNBOUlHVnNaVzFsYm5RZ0lUMGdiblZzYkNBL0lHVnNaVzFsYm5RdVgzTnZkWEpqWlNBNklHNTFiR3c3WEc0Z0lDQWdjbVYwZFhKdUlITnZkWEpqWlR0Y2JpQWdmU3hjYmlBZ1oyVjBWR1Y0ZERvZ1puVnVZM1JwYjI0Z0tHbGtLU0I3WEc0Z0lDQWdkbUZ5SUdWc1pXMWxiblFnUFNCU1pXRmpkRU52YlhCdmJtVnVkRlJ5WldWSWIyOXJMbWRsZEVWc1pXMWxiblFvYVdRcE8xeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ1pXeGxiV1Z1ZENBOVBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmxiR1Z0Wlc1ME8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RIbHdaVzltSUdWc1pXMWxiblFnUFQwOUlDZHVkVzFpWlhJbktTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z0p5Y2dLeUJsYkdWdFpXNTBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYm5Wc2JEdGNiaUFnSUNCOVhHNGdJSDBzWEc0Z0lHZGxkRlZ3WkdGMFpVTnZkVzUwT2lCbWRXNWpkR2x2YmlBb2FXUXBJSHRjYmlBZ0lDQjJZWElnYVhSbGJTQTlJR2RsZENocFpDazdYRzRnSUNBZ2NtVjBkWEp1SUdsMFpXMGdQeUJwZEdWdExuVndaR0YwWlVOdmRXNTBJRG9nTUR0Y2JpQWdmU3hjYmx4dVhHNGdJR2RsZEZKbFoybHpkR1Z5WldSSlJITTZJR2RsZEZKbFoybHpkR1Z5WldSSlJITXNYRzVjYmlBZ1oyVjBVbTl2ZEVsRWN6b2daMlYwVW05dmRFbEVjMXh1ZlR0Y2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQlNaV0ZqZEVOdmJYQnZibVZ1ZEZSeVpXVkliMjlyT3lKZGZRPT0iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUmVhY3RDdXJyZW50T3duZXJcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEN1cnJlbnRPd25lcjsiLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0RE9NRmFjdG9yaWVzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBIVE1MIHRhZyBlbGVtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgY3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50VmFsaWRhdG9yJyk7XG4gIGNyZWF0ZURPTUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwcGluZyBmcm9tIHN1cHBvcnRlZCBIVE1MIHRhZ3MgdG8gYFJlYWN0RE9NQ29tcG9uZW50YCBjbGFzc2VzLlxuICogVGhpcyBpcyBhbHNvIGFjY2Vzc2libGUgdmlhIGBSZWFjdC5ET01gLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xudmFyIFJlYWN0RE9NRmFjdG9yaWVzID0ge1xuICBhOiBjcmVhdGVET01GYWN0b3J5KCdhJyksXG4gIGFiYnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2FiYnInKSxcbiAgYWRkcmVzczogY3JlYXRlRE9NRmFjdG9yeSgnYWRkcmVzcycpLFxuICBhcmVhOiBjcmVhdGVET01GYWN0b3J5KCdhcmVhJyksXG4gIGFydGljbGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FydGljbGUnKSxcbiAgYXNpZGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FzaWRlJyksXG4gIGF1ZGlvOiBjcmVhdGVET01GYWN0b3J5KCdhdWRpbycpLFxuICBiOiBjcmVhdGVET01GYWN0b3J5KCdiJyksXG4gIGJhc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2Jhc2UnKSxcbiAgYmRpOiBjcmVhdGVET01GYWN0b3J5KCdiZGknKSxcbiAgYmRvOiBjcmVhdGVET01GYWN0b3J5KCdiZG8nKSxcbiAgYmlnOiBjcmVhdGVET01GYWN0b3J5KCdiaWcnKSxcbiAgYmxvY2txdW90ZTogY3JlYXRlRE9NRmFjdG9yeSgnYmxvY2txdW90ZScpLFxuICBib2R5OiBjcmVhdGVET01GYWN0b3J5KCdib2R5JyksXG4gIGJyOiBjcmVhdGVET01GYWN0b3J5KCdicicpLFxuICBidXR0b246IGNyZWF0ZURPTUZhY3RvcnkoJ2J1dHRvbicpLFxuICBjYW52YXM6IGNyZWF0ZURPTUZhY3RvcnkoJ2NhbnZhcycpLFxuICBjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdjYXB0aW9uJyksXG4gIGNpdGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NpdGUnKSxcbiAgY29kZTogY3JlYXRlRE9NRmFjdG9yeSgnY29kZScpLFxuICBjb2w6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvbCcpLFxuICBjb2xncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnY29sZ3JvdXAnKSxcbiAgZGF0YTogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YScpLFxuICBkYXRhbGlzdDogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YWxpc3QnKSxcbiAgZGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2RkJyksXG4gIGRlbDogY3JlYXRlRE9NRmFjdG9yeSgnZGVsJyksXG4gIGRldGFpbHM6IGNyZWF0ZURPTUZhY3RvcnkoJ2RldGFpbHMnKSxcbiAgZGZuOiBjcmVhdGVET01GYWN0b3J5KCdkZm4nKSxcbiAgZGlhbG9nOiBjcmVhdGVET01GYWN0b3J5KCdkaWFsb2cnKSxcbiAgZGl2OiBjcmVhdGVET01GYWN0b3J5KCdkaXYnKSxcbiAgZGw6IGNyZWF0ZURPTUZhY3RvcnkoJ2RsJyksXG4gIGR0OiBjcmVhdGVET01GYWN0b3J5KCdkdCcpLFxuICBlbTogY3JlYXRlRE9NRmFjdG9yeSgnZW0nKSxcbiAgZW1iZWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2VtYmVkJyksXG4gIGZpZWxkc2V0OiBjcmVhdGVET01GYWN0b3J5KCdmaWVsZHNldCcpLFxuICBmaWdjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdmaWdjYXB0aW9uJyksXG4gIGZpZ3VyZTogY3JlYXRlRE9NRmFjdG9yeSgnZmlndXJlJyksXG4gIGZvb3RlcjogY3JlYXRlRE9NRmFjdG9yeSgnZm9vdGVyJyksXG4gIGZvcm06IGNyZWF0ZURPTUZhY3RvcnkoJ2Zvcm0nKSxcbiAgaDE6IGNyZWF0ZURPTUZhY3RvcnkoJ2gxJyksXG4gIGgyOiBjcmVhdGVET01GYWN0b3J5KCdoMicpLFxuICBoMzogY3JlYXRlRE9NRmFjdG9yeSgnaDMnKSxcbiAgaDQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2g0JyksXG4gIGg1OiBjcmVhdGVET01GYWN0b3J5KCdoNScpLFxuICBoNjogY3JlYXRlRE9NRmFjdG9yeSgnaDYnKSxcbiAgaGVhZDogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZCcpLFxuICBoZWFkZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ2hlYWRlcicpLFxuICBoZ3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ2hncm91cCcpLFxuICBocjogY3JlYXRlRE9NRmFjdG9yeSgnaHInKSxcbiAgaHRtbDogY3JlYXRlRE9NRmFjdG9yeSgnaHRtbCcpLFxuICBpOiBjcmVhdGVET01GYWN0b3J5KCdpJyksXG4gIGlmcmFtZTogY3JlYXRlRE9NRmFjdG9yeSgnaWZyYW1lJyksXG4gIGltZzogY3JlYXRlRE9NRmFjdG9yeSgnaW1nJyksXG4gIGlucHV0OiBjcmVhdGVET01GYWN0b3J5KCdpbnB1dCcpLFxuICBpbnM6IGNyZWF0ZURPTUZhY3RvcnkoJ2lucycpLFxuICBrYmQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2tiZCcpLFxuICBrZXlnZW46IGNyZWF0ZURPTUZhY3RvcnkoJ2tleWdlbicpLFxuICBsYWJlbDogY3JlYXRlRE9NRmFjdG9yeSgnbGFiZWwnKSxcbiAgbGVnZW5kOiBjcmVhdGVET01GYWN0b3J5KCdsZWdlbmQnKSxcbiAgbGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpJyksXG4gIGxpbms6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmsnKSxcbiAgbWFpbjogY3JlYXRlRE9NRmFjdG9yeSgnbWFpbicpLFxuICBtYXA6IGNyZWF0ZURPTUZhY3RvcnkoJ21hcCcpLFxuICBtYXJrOiBjcmVhdGVET01GYWN0b3J5KCdtYXJrJyksXG4gIG1lbnU6IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnUnKSxcbiAgbWVudWl0ZW06IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnVpdGVtJyksXG4gIG1ldGE6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGEnKSxcbiAgbWV0ZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGVyJyksXG4gIG5hdjogY3JlYXRlRE9NRmFjdG9yeSgnbmF2JyksXG4gIG5vc2NyaXB0OiBjcmVhdGVET01GYWN0b3J5KCdub3NjcmlwdCcpLFxuICBvYmplY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ29iamVjdCcpLFxuICBvbDogY3JlYXRlRE9NRmFjdG9yeSgnb2wnKSxcbiAgb3B0Z3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ29wdGdyb3VwJyksXG4gIG9wdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnb3B0aW9uJyksXG4gIG91dHB1dDogY3JlYXRlRE9NRmFjdG9yeSgnb3V0cHV0JyksXG4gIHA6IGNyZWF0ZURPTUZhY3RvcnkoJ3AnKSxcbiAgcGFyYW06IGNyZWF0ZURPTUZhY3RvcnkoJ3BhcmFtJyksXG4gIHBpY3R1cmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3BpY3R1cmUnKSxcbiAgcHJlOiBjcmVhdGVET01GYWN0b3J5KCdwcmUnKSxcbiAgcHJvZ3Jlc3M6IGNyZWF0ZURPTUZhY3RvcnkoJ3Byb2dyZXNzJyksXG4gIHE6IGNyZWF0ZURPTUZhY3RvcnkoJ3EnKSxcbiAgcnA6IGNyZWF0ZURPTUZhY3RvcnkoJ3JwJyksXG4gIHJ0OiBjcmVhdGVET01GYWN0b3J5KCdydCcpLFxuICBydWJ5OiBjcmVhdGVET01GYWN0b3J5KCdydWJ5JyksXG4gIHM6IGNyZWF0ZURPTUZhY3RvcnkoJ3MnKSxcbiAgc2FtcDogY3JlYXRlRE9NRmFjdG9yeSgnc2FtcCcpLFxuICBzY3JpcHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3NjcmlwdCcpLFxuICBzZWN0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdzZWN0aW9uJyksXG4gIHNlbGVjdDogY3JlYXRlRE9NRmFjdG9yeSgnc2VsZWN0JyksXG4gIHNtYWxsOiBjcmVhdGVET01GYWN0b3J5KCdzbWFsbCcpLFxuICBzb3VyY2U6IGNyZWF0ZURPTUZhY3RvcnkoJ3NvdXJjZScpLFxuICBzcGFuOiBjcmVhdGVET01GYWN0b3J5KCdzcGFuJyksXG4gIHN0cm9uZzogY3JlYXRlRE9NRmFjdG9yeSgnc3Ryb25nJyksXG4gIHN0eWxlOiBjcmVhdGVET01GYWN0b3J5KCdzdHlsZScpLFxuICBzdWI6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1YicpLFxuICBzdW1tYXJ5OiBjcmVhdGVET01GYWN0b3J5KCdzdW1tYXJ5JyksXG4gIHN1cDogY3JlYXRlRE9NRmFjdG9yeSgnc3VwJyksXG4gIHRhYmxlOiBjcmVhdGVET01GYWN0b3J5KCd0YWJsZScpLFxuICB0Ym9keTogY3JlYXRlRE9NRmFjdG9yeSgndGJvZHknKSxcbiAgdGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RkJyksXG4gIHRleHRhcmVhOiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0YXJlYScpLFxuICB0Zm9vdDogY3JlYXRlRE9NRmFjdG9yeSgndGZvb3QnKSxcbiAgdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoJyksXG4gIHRoZWFkOiBjcmVhdGVET01GYWN0b3J5KCd0aGVhZCcpLFxuICB0aW1lOiBjcmVhdGVET01GYWN0b3J5KCd0aW1lJyksXG4gIHRpdGxlOiBjcmVhdGVET01GYWN0b3J5KCd0aXRsZScpLFxuICB0cjogY3JlYXRlRE9NRmFjdG9yeSgndHInKSxcbiAgdHJhY2s6IGNyZWF0ZURPTUZhY3RvcnkoJ3RyYWNrJyksXG4gIHU6IGNyZWF0ZURPTUZhY3RvcnkoJ3UnKSxcbiAgdWw6IGNyZWF0ZURPTUZhY3RvcnkoJ3VsJyksXG4gICd2YXInOiBjcmVhdGVET01GYWN0b3J5KCd2YXInKSxcbiAgdmlkZW86IGNyZWF0ZURPTUZhY3RvcnkoJ3ZpZGVvJyksXG4gIHdicjogY3JlYXRlRE9NRmFjdG9yeSgnd2JyJyksXG5cbiAgLy8gU1ZHXG4gIGNpcmNsZTogY3JlYXRlRE9NRmFjdG9yeSgnY2lyY2xlJyksXG4gIGNsaXBQYXRoOiBjcmVhdGVET01GYWN0b3J5KCdjbGlwUGF0aCcpLFxuICBkZWZzOiBjcmVhdGVET01GYWN0b3J5KCdkZWZzJyksXG4gIGVsbGlwc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2VsbGlwc2UnKSxcbiAgZzogY3JlYXRlRE9NRmFjdG9yeSgnZycpLFxuICBpbWFnZTogY3JlYXRlRE9NRmFjdG9yeSgnaW1hZ2UnKSxcbiAgbGluZTogY3JlYXRlRE9NRmFjdG9yeSgnbGluZScpLFxuICBsaW5lYXJHcmFkaWVudDogY3JlYXRlRE9NRmFjdG9yeSgnbGluZWFyR3JhZGllbnQnKSxcbiAgbWFzazogY3JlYXRlRE9NRmFjdG9yeSgnbWFzaycpLFxuICBwYXRoOiBjcmVhdGVET01GYWN0b3J5KCdwYXRoJyksXG4gIHBhdHRlcm46IGNyZWF0ZURPTUZhY3RvcnkoJ3BhdHRlcm4nKSxcbiAgcG9seWdvbjogY3JlYXRlRE9NRmFjdG9yeSgncG9seWdvbicpLFxuICBwb2x5bGluZTogY3JlYXRlRE9NRmFjdG9yeSgncG9seWxpbmUnKSxcbiAgcmFkaWFsR3JhZGllbnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3JhZGlhbEdyYWRpZW50JyksXG4gIHJlY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3JlY3QnKSxcbiAgc3RvcDogY3JlYXRlRE9NRmFjdG9yeSgnc3RvcCcpLFxuICBzdmc6IGNyZWF0ZURPTUZhY3RvcnkoJ3N2ZycpLFxuICB0ZXh0OiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0JyksXG4gIHRzcGFuOiBjcmVhdGVET01GYWN0b3J5KCd0c3BhbicpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmFjdG9yaWVzO1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5U1pXRmpkRVJQVFVaaFkzUnZjbWxsY3k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b3FYRzRnS2lCRGIzQjVjbWxuYUhRZ01qQXhNeTF3Y21WelpXNTBMQ0JHWVdObFltOXZheXdnU1c1akxseHVJQ29nUVd4c0lISnBaMmgwY3lCeVpYTmxjblpsWkM1Y2JpQXFYRzRnS2lCVWFHbHpJSE52ZFhKalpTQmpiMlJsSUdseklHeHBZMlZ1YzJWa0lIVnVaR1Z5SUhSb1pTQkNVMFF0YzNSNWJHVWdiR2xqWlc1elpTQm1iM1Z1WkNCcGJpQjBhR1ZjYmlBcUlFeEpRMFZPVTBVZ1ptbHNaU0JwYmlCMGFHVWdjbTl2ZENCa2FYSmxZM1J2Y25rZ2IyWWdkR2hwY3lCemIzVnlZMlVnZEhKbFpTNGdRVzRnWVdSa2FYUnBiMjVoYkNCbmNtRnVkRnh1SUNvZ2IyWWdjR0YwWlc1MElISnBaMmgwY3lCallXNGdZbVVnWm05MWJtUWdhVzRnZEdobElGQkJWRVZPVkZNZ1ptbHNaU0JwYmlCMGFHVWdjMkZ0WlNCa2FYSmxZM1J2Y25rdVhHNGdLbHh1SUNvZ1FIQnliM1pwWkdWelRXOWtkV3hsSUZKbFlXTjBSRTlOUm1GamRHOXlhV1Z6WEc0Z0tpOWNibHh1SjNWelpTQnpkSEpwWTNRbk8xeHVYRzUyWVhJZ1VtVmhZM1JGYkdWdFpXNTBJRDBnY21WeGRXbHlaU2duTGk5U1pXRmpkRVZzWlcxbGJuUW5LVHRjYmx4dUx5b3FYRzRnS2lCRGNtVmhkR1VnWVNCbVlXTjBiM0o1SUhSb1lYUWdZM0psWVhSbGN5QklWRTFNSUhSaFp5QmxiR1Z0Wlc1MGN5NWNiaUFxWEc0Z0tpQkFjSEpwZG1GMFpWeHVJQ292WEc1MllYSWdZM0psWVhSbFJFOU5SbUZqZEc5eWVTQTlJRkpsWVdOMFJXeGxiV1Z1ZEM1amNtVmhkR1ZHWVdOMGIzSjVPMXh1YVdZZ0tIQnliMk5sYzNNdVpXNTJMazVQUkVWZlJVNVdJQ0U5UFNBbmNISnZaSFZqZEdsdmJpY3BJSHRjYmlBZ2RtRnlJRkpsWVdOMFJXeGxiV1Z1ZEZaaGJHbGtZWFJ2Y2lBOUlISmxjWFZwY21Vb0p5NHZVbVZoWTNSRmJHVnRaVzUwVm1Gc2FXUmhkRzl5SnlrN1hHNGdJR055WldGMFpVUlBUVVpoWTNSdmNua2dQU0JTWldGamRFVnNaVzFsYm5SV1lXeHBaR0YwYjNJdVkzSmxZWFJsUm1GamRHOXllVHRjYm4xY2JseHVMeW9xWEc0Z0tpQkRjbVZoZEdWeklHRWdiV0Z3Y0dsdVp5Qm1jbTl0SUhOMWNIQnZjblJsWkNCSVZFMU1JSFJoWjNNZ2RHOGdZRkpsWVdOMFJFOU5RMjl0Y0c5dVpXNTBZQ0JqYkdGemMyVnpMbHh1SUNvZ1ZHaHBjeUJwY3lCaGJITnZJR0ZqWTJWemMybGliR1VnZG1saElHQlNaV0ZqZEM1RVQwMWdMbHh1SUNwY2JpQXFJRUJ3ZFdKc2FXTmNiaUFxTDF4dWRtRnlJRkpsWVdOMFJFOU5SbUZqZEc5eWFXVnpJRDBnZTF4dUlDQmhPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RoSnlrc1hHNGdJR0ZpWW5JNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyRmlZbkluS1N4Y2JpQWdZV1JrY21WemN6b2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25ZV1JrY21WemN5Y3BMRnh1SUNCaGNtVmhPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RoY21WaEp5a3NYRzRnSUdGeWRHbGpiR1U2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjJGeWRHbGpiR1VuS1N4Y2JpQWdZWE5wWkdVNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyRnphV1JsSnlrc1hHNGdJR0YxWkdsdk9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZGhkV1JwYnljcExGeHVJQ0JpT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkaUp5a3NYRzRnSUdKaGMyVTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMkpoYzJVbktTeGNiaUFnWW1ScE9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZGlaR2tuS1N4Y2JpQWdZbVJ2T2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkaVpHOG5LU3hjYmlBZ1ltbG5PaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RpYVdjbktTeGNiaUFnWW14dlkydHhkVzkwWlRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbllteHZZMnR4ZFc5MFpTY3BMRnh1SUNCaWIyUjVPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RpYjJSNUp5a3NYRzRnSUdKeU9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZGljaWNwTEZ4dUlDQmlkWFIwYjI0NklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oySjFkSFJ2YmljcExGeHVJQ0JqWVc1MllYTTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMk5oYm5aaGN5Y3BMRnh1SUNCallYQjBhVzl1T2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkallYQjBhVzl1Snlrc1hHNGdJR05wZEdVNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyTnBkR1VuS1N4Y2JpQWdZMjlrWlRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnblkyOWtaU2NwTEZ4dUlDQmpiMnc2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjJOdmJDY3BMRnh1SUNCamIyeG5jbTkxY0RvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnblkyOXNaM0p2ZFhBbktTeGNiaUFnWkdGMFlUb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25aR0YwWVNjcExGeHVJQ0JrWVhSaGJHbHpkRG9nWTNKbFlYUmxSRTlOUm1GamRHOXllU2duWkdGMFlXeHBjM1FuS1N4Y2JpQWdaR1E2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjJSa0p5a3NYRzRnSUdSbGJEb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25aR1ZzSnlrc1hHNGdJR1JsZEdGcGJITTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMlJsZEdGcGJITW5LU3hjYmlBZ1pHWnVPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RrWm00bktTeGNiaUFnWkdsaGJHOW5PaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RrYVdGc2IyY25LU3hjYmlBZ1pHbDJPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RrYVhZbktTeGNiaUFnWkd3NklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyUnNKeWtzWEc0Z0lHUjBPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RrZENjcExGeHVJQ0JsYlRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnblpXMG5LU3hjYmlBZ1pXMWlaV1E2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjJWdFltVmtKeWtzWEc0Z0lHWnBaV3hrYzJWME9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZG1hV1ZzWkhObGRDY3BMRnh1SUNCbWFXZGpZWEIwYVc5dU9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZG1hV2RqWVhCMGFXOXVKeWtzWEc0Z0lHWnBaM1Z5WlRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnblptbG5kWEpsSnlrc1hHNGdJR1p2YjNSbGNqb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25abTl2ZEdWeUp5a3NYRzRnSUdadmNtMDZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMlp2Y20wbktTeGNiaUFnYURFNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyZ3hKeWtzWEc0Z0lHZ3lPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RvTWljcExGeHVJQ0JvTXpvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmFETW5LU3hjYmlBZ2FEUTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMmcwSnlrc1hHNGdJR2cxT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0Nkb05TY3BMRnh1SUNCb05qb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25hRFluS1N4Y2JpQWdhR1ZoWkRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmFHVmhaQ2NwTEZ4dUlDQm9aV0ZrWlhJNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyaGxZV1JsY2ljcExGeHVJQ0JvWjNKdmRYQTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMmhuY205MWNDY3BMRnh1SUNCb2Nqb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25hSEluS1N4Y2JpQWdhSFJ0YkRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmFIUnRiQ2NwTEZ4dUlDQnBPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2RwSnlrc1hHNGdJR2xtY21GdFpUb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25hV1p5WVcxbEp5a3NYRzRnSUdsdFp6b2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25hVzFuSnlrc1hHNGdJR2x1Y0hWME9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZHBibkIxZENjcExGeHVJQ0JwYm5NNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oybHVjeWNwTEZ4dUlDQnJZbVE2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjJ0aVpDY3BMRnh1SUNCclpYbG5aVzQ2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjJ0bGVXZGxiaWNwTEZ4dUlDQnNZV0psYkRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmJHRmlaV3duS1N4Y2JpQWdiR1ZuWlc1a09pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZHNaV2RsYm1RbktTeGNiaUFnYkdrNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyeHBKeWtzWEc0Z0lHeHBibXM2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjJ4cGJtc25LU3hjYmlBZ2JXRnBiam9nWTNKbFlYUmxSRTlOUm1GamRHOXllU2duYldGcGJpY3BMRnh1SUNCdFlYQTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMjFoY0NjcExGeHVJQ0J0WVhKck9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZHRZWEpySnlrc1hHNGdJRzFsYm5VNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0oyMWxiblVuS1N4Y2JpQWdiV1Z1ZFdsMFpXMDZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMjFsYm5WcGRHVnRKeWtzWEc0Z0lHMWxkR0U2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjIxbGRHRW5LU3hjYmlBZ2JXVjBaWEk2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjIxbGRHVnlKeWtzWEc0Z0lHNWhkam9nWTNKbFlYUmxSRTlOUm1GamRHOXllU2duYm1GMkp5a3NYRzRnSUc1dmMyTnlhWEIwT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkdWIzTmpjbWx3ZENjcExGeHVJQ0J2WW1wbFkzUTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMjlpYW1WamRDY3BMRnh1SUNCdmJEb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25iMnduS1N4Y2JpQWdiM0IwWjNKdmRYQTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMjl3ZEdkeWIzVndKeWtzWEc0Z0lHOXdkR2x2YmpvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmIzQjBhVzl1Snlrc1hHNGdJRzkxZEhCMWREb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25iM1YwY0hWMEp5a3NYRzRnSUhBNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0ozQW5LU3hjYmlBZ2NHRnlZVzA2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjNCaGNtRnRKeWtzWEc0Z0lIQnBZM1IxY21VNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0ozQnBZM1IxY21VbktTeGNiaUFnY0hKbE9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZHdjbVVuS1N4Y2JpQWdjSEp2WjNKbGMzTTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KM0J5YjJkeVpYTnpKeWtzWEc0Z0lIRTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KM0VuS1N4Y2JpQWdjbkE2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjNKd0p5a3NYRzRnSUhKME9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZHlkQ2NwTEZ4dUlDQnlkV0o1T2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkeWRXSjVKeWtzWEc0Z0lITTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KM01uS1N4Y2JpQWdjMkZ0Y0RvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmMyRnRjQ2NwTEZ4dUlDQnpZM0pwY0hRNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0ozTmpjbWx3ZENjcExGeHVJQ0J6WldOMGFXOXVPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2R6WldOMGFXOXVKeWtzWEc0Z0lITmxiR1ZqZERvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmMyVnNaV04wSnlrc1hHNGdJSE50WVd4c09pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZHpiV0ZzYkNjcExGeHVJQ0J6YjNWeVkyVTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KM052ZFhKalpTY3BMRnh1SUNCemNHRnVPaUJqY21WaGRHVkVUMDFHWVdOMGIzSjVLQ2R6Y0dGdUp5a3NYRzRnSUhOMGNtOXVaem9nWTNKbFlYUmxSRTlOUm1GamRHOXllU2duYzNSeWIyNW5KeWtzWEc0Z0lITjBlV3hsT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkemRIbHNaU2NwTEZ4dUlDQnpkV0k2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjNOMVlpY3BMRnh1SUNCemRXMXRZWEo1T2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkemRXMXRZWEo1Snlrc1hHNGdJSE4xY0RvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmMzVndKeWtzWEc0Z0lIUmhZbXhsT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkMFlXSnNaU2NwTEZ4dUlDQjBZbTlrZVRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmRHSnZaSGtuS1N4Y2JpQWdkR1E2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjNSa0p5a3NYRzRnSUhSbGVIUmhjbVZoT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkMFpYaDBZWEpsWVNjcExGeHVJQ0IwWm05dmREb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25kR1p2YjNRbktTeGNiaUFnZEdnNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0ozUm9KeWtzWEc0Z0lIUm9aV0ZrT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkMGFHVmhaQ2NwTEZ4dUlDQjBhVzFsT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkMGFXMWxKeWtzWEc0Z0lIUnBkR3hsT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkMGFYUnNaU2NwTEZ4dUlDQjBjam9nWTNKbFlYUmxSRTlOUm1GamRHOXllU2duZEhJbktTeGNiaUFnZEhKaFkyczZJR055WldGMFpVUlBUVVpoWTNSdmNua29KM1J5WVdOckp5a3NYRzRnSUhVNklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0ozVW5LU3hjYmlBZ2RXdzZJR055WldGMFpVUlBUVVpoWTNSdmNua29KM1ZzSnlrc1hHNGdJQ2QyWVhJbk9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZDJZWEluS1N4Y2JpQWdkbWxrWlc4NklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0ozWnBaR1Z2Snlrc1hHNGdJSGRpY2pvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmQySnlKeWtzWEc1Y2JpQWdMeThnVTFaSFhHNGdJR05wY21Oc1pUb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25ZMmx5WTJ4bEp5a3NYRzRnSUdOc2FYQlFZWFJvT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0NkamJHbHdVR0YwYUNjcExGeHVJQ0JrWldaek9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZGtaV1p6Snlrc1hHNGdJR1ZzYkdsd2MyVTZJR055WldGMFpVUlBUVVpoWTNSdmNua29KMlZzYkdsd2MyVW5LU3hjYmlBZ1p6b2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25aeWNwTEZ4dUlDQnBiV0ZuWlRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmFXMWhaMlVuS1N4Y2JpQWdiR2x1WlRvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmJHbHVaU2NwTEZ4dUlDQnNhVzVsWVhKSGNtRmthV1Z1ZERvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmJHbHVaV0Z5UjNKaFpHbGxiblFuS1N4Y2JpQWdiV0Z6YXpvZ1kzSmxZWFJsUkU5TlJtRmpkRzl5ZVNnbmJXRnpheWNwTEZ4dUlDQndZWFJvT2lCamNtVmhkR1ZFVDAxR1lXTjBiM0o1S0Nkd1lYUm9KeWtzWEc0Z0lIQmhkSFJsY200NklHTnlaV0YwWlVSUFRVWmhZM1J2Y25rb0ozQmhkSFJsY200bktTeGNiaUFnY0c5c2VXZHZiam9nWTNKbFlYUmxSRTlOUm1GamRHOXllU2duY0c5c2VXZHZiaWNwTEZ4dUlDQndiMng1YkdsdVpUb2dZM0psWVhSbFJFOU5SbUZqZEc5eWVTZ25jRzlzZVd4cGJtVW5LU3hjYmlBZ2NtRmthV0ZzUjNKaFpHbGxiblE2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjNKaFpHbGhiRWR5WVdScFpXNTBKeWtzWEc0Z0lISmxZM1E2SUdOeVpXRjBaVVJQVFVaaFkzUnZjbmtvSjNKbFkzUW5LU3hjYmlBZ2MzUnZjRG9nWTNKbFlYUmxSRTlOUm1GamRHOXllU2duYzNSdmNDY3BMRnh1SUNCemRtYzZJR055WldGMFpVUlBUVVpoWTNSdmNua29KM04yWnljcExGeHVJQ0IwWlhoME9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZDBaWGgwSnlrc1hHNGdJSFJ6Y0dGdU9pQmpjbVZoZEdWRVQwMUdZV04wYjNKNUtDZDBjM0JoYmljcFhHNTlPMXh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUZKbFlXTjBSRTlOUm1GamRHOXlhV1Z6T3lKZGZRPT0iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0RWxlbWVudFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQgdHlwZS4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xuXG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL2ZiLm1lL3JlYWN0LXNwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfTtcbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIG5vIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTtcbiAgICB2YXIgc2hhZG93Q2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KHByb3BzLmNoaWxkcmVuKSA/IHByb3BzLmNoaWxkcmVuLnNsaWNlKDApIDogcHJvcHMuY2hpbGRyZW47XG5cbiAgICAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG4gICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzZWxmXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NoYWRvd0NoaWxkcmVuJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc2hhZG93Q2hpbGRyZW5cbiAgICAgIH0pO1xuICAgICAgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc291cmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gZmFsc2U7XG4gICAgICBlbGVtZW50Ll9zZWxmID0gc2VsZjtcbiAgICAgIGVsZW1lbnQuX3NoYWRvd0NoaWxkcmVuID0gc2hhZG93Q2hpbGRyZW47XG4gICAgICBlbGVtZW50Ll9zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIgcHJvcHMgPSB7fTtcblxuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTtcbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLiQkdHlwZW9mID09PSAndW5kZWZpbmVkJyB8fCBwcm9wcy4kJHR5cGVvZiAhPT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgUmVhY3RFbGVtZW50cyBvZiBhIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY3JlYXRlZmFjdG9yeVxuICovXG5SZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHZhciBmYWN0b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgLy8gRXhwb3NlIHRoZSB0eXBlIG9uIHRoZSBmYWN0b3J5IGFuZCB0aGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY2FuIGJlXG4gIC8vIGVhc2lseSBhY2Nlc3NlZCBvbiBlbGVtZW50cy4gRS5nLiBgPEZvbyAvPi50eXBlID09PSBGb29gLlxuICAvLyBUaGlzIHNob3VsZCBub3QgYmUgbmFtZWQgYGNvbnN0cnVjdG9yYCBzaW5jZSB0aGlzIG1heSBub3QgYmUgdGhlIGZ1bmN0aW9uXG4gIC8vIHRoYXQgY3JlYXRlZCB0aGUgZWxlbWVudCwgYW5kIGl0IG1heSBub3QgZXZlbiBiZSBhIGNvbnN0cnVjdG9yLlxuICAvLyBMZWdhY3kgaG9vayBUT0RPOiBXYXJuIGlmIHRoaXMgaXMgYWNjZXNzZWRcbiAgZmFjdG9yeS50eXBlID0gdHlwZTtcbiAgcmV0dXJuIGZhY3Rvcnk7XG59O1xuXG5SZWFjdEVsZW1lbnQuY2xvbmVBbmRSZXBsYWNlS2V5ID0gZnVuY3Rpb24gKG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuXG4gIHJldHVybiBuZXdFbGVtZW50O1xufTtcblxuLyoqXG4gKiBDbG9uZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCB1c2luZyBlbGVtZW50IGFzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jbG9uZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTtcblxuICAvLyBPcmlnaW5hbCBwcm9wcyBhcmUgY29waWVkXG4gIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpO1xuXG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG4gIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjtcbiAgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYVxuICAvLyB0cmFuc3BpbGVyLCBhbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBwcm9iYWJseSBhIGJldHRlciBpbmRpY2F0b3Igb2YgdGhlXG4gIC8vIHRydWUgb3duZXIuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG5cbiAgLy8gT3duZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHVubGVzcyByZWYgaXMgb3ZlcnJpZGRlblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn07XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5pc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSB2YWxpZCBjb21wb25lbnQuXG4gKiBAZmluYWxcbiAqL1xuUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufTtcblxuUmVhY3RFbGVtZW50LlJFQUNUX0VMRU1FTlRfVFlQRSA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVsZW1lbnQ7XG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklteHBZaTlTWldGamRFVnNaVzFsYm5RdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b3FYRzRnS2lCRGIzQjVjbWxuYUhRZ01qQXhOQzF3Y21WelpXNTBMQ0JHWVdObFltOXZheXdnU1c1akxseHVJQ29nUVd4c0lISnBaMmgwY3lCeVpYTmxjblpsWkM1Y2JpQXFYRzRnS2lCVWFHbHpJSE52ZFhKalpTQmpiMlJsSUdseklHeHBZMlZ1YzJWa0lIVnVaR1Z5SUhSb1pTQkNVMFF0YzNSNWJHVWdiR2xqWlc1elpTQm1iM1Z1WkNCcGJpQjBhR1ZjYmlBcUlFeEpRMFZPVTBVZ1ptbHNaU0JwYmlCMGFHVWdjbTl2ZENCa2FYSmxZM1J2Y25rZ2IyWWdkR2hwY3lCemIzVnlZMlVnZEhKbFpTNGdRVzRnWVdSa2FYUnBiMjVoYkNCbmNtRnVkRnh1SUNvZ2IyWWdjR0YwWlc1MElISnBaMmgwY3lCallXNGdZbVVnWm05MWJtUWdhVzRnZEdobElGQkJWRVZPVkZNZ1ptbHNaU0JwYmlCMGFHVWdjMkZ0WlNCa2FYSmxZM1J2Y25rdVhHNGdLbHh1SUNvZ1FIQnliM1pwWkdWelRXOWtkV3hsSUZKbFlXTjBSV3hsYldWdWRGeHVJQ292WEc1Y2JpZDFjMlVnYzNSeWFXTjBKenRjYmx4dWRtRnlJRjloYzNOcFoyNGdQU0J5WlhGMWFYSmxLQ2R2WW1wbFkzUXRZWE56YVdkdUp5azdYRzVjYm5aaGNpQlNaV0ZqZEVOMWNuSmxiblJQZDI1bGNpQTlJSEpsY1hWcGNtVW9KeTR2VW1WaFkzUkRkWEp5Wlc1MFQzZHVaWEluS1R0Y2JseHVkbUZ5SUhkaGNtNXBibWNnUFNCeVpYRjFhWEpsS0NkbVltcHpMMnhwWWk5M1lYSnVhVzVuSnlrN1hHNTJZWElnWTJGdVJHVm1hVzVsVUhKdmNHVnlkSGtnUFNCeVpYRjFhWEpsS0NjdUwyTmhia1JsWm1sdVpWQnliM0JsY25SNUp5azdYRzUyWVhJZ2FHRnpUM2R1VUhKdmNHVnlkSGtnUFNCUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG1oaGMwOTNibEJ5YjNCbGNuUjVPMXh1WEc0dkx5QlVhR1VnVTNsdFltOXNJSFZ6WldRZ2RHOGdkR0ZuSUhSb1pTQlNaV0ZqZEVWc1pXMWxiblFnZEhsd1pTNGdTV1lnZEdobGNtVWdhWE1nYm04Z2JtRjBhWFpsSUZONWJXSnZiRnh1THk4Z2JtOXlJSEJ2YkhsbWFXeHNMQ0IwYUdWdUlHRWdjR3hoYVc0Z2JuVnRZbVZ5SUdseklIVnpaV1FnWm05eUlIQmxjbVp2Y20xaGJtTmxMbHh1ZG1GeUlGSkZRVU5VWDBWTVJVMUZUbFJmVkZsUVJTQTlJSFI1Y0dWdlppQlRlVzFpYjJ3Z1BUMDlJQ2RtZFc1amRHbHZiaWNnSmlZZ1UzbHRZbTlzV3lkbWIzSW5YU0FtSmlCVGVXMWliMnhiSjJadmNpZGRLQ2R5WldGamRDNWxiR1Z0Wlc1MEp5a2dmSHdnTUhobFlXTTNPMXh1WEc1MllYSWdVa1ZUUlZKV1JVUmZVRkpQVUZNZ1BTQjdYRzRnSUd0bGVUb2dkSEoxWlN4Y2JpQWdjbVZtT2lCMGNuVmxMRnh1SUNCZlgzTmxiR1k2SUhSeWRXVXNYRzRnSUY5ZmMyOTFjbU5sT2lCMGNuVmxYRzU5TzF4dVhHNTJZWElnYzNCbFkybGhiRkJ5YjNCTFpYbFhZWEp1YVc1blUyaHZkMjRzSUhOd1pXTnBZV3hRY205d1VtVm1WMkZ5Ym1sdVoxTm9iM2R1TzF4dVhHNW1kVzVqZEdsdmJpQm9ZWE5XWVd4cFpGSmxaaWhqYjI1bWFXY3BJSHRjYmlBZ2FXWWdLSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNwSUh0Y2JpQWdJQ0JwWmlBb2FHRnpUM2R1VUhKdmNHVnlkSGt1WTJGc2JDaGpiMjVtYVdjc0lDZHlaV1luS1NrZ2UxeHVJQ0FnSUNBZ2RtRnlJR2RsZEhSbGNpQTlJRTlpYW1WamRDNW5aWFJQZDI1UWNtOXdaWEowZVVSbGMyTnlhWEIwYjNJb1kyOXVabWxuTENBbmNtVm1KeWt1WjJWME8xeHVJQ0FnSUNBZ2FXWWdLR2RsZEhSbGNpQW1KaUJuWlhSMFpYSXVhWE5TWldGamRGZGhjbTVwYm1jcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdZMjl1Wm1sbkxuSmxaaUFoUFQwZ2RXNWtaV1pwYm1Wa08xeHVmVnh1WEc1bWRXNWpkR2x2YmlCb1lYTldZV3hwWkV0bGVTaGpiMjVtYVdjcElIdGNiaUFnYVdZZ0tIQnliMk5sYzNNdVpXNTJMazVQUkVWZlJVNVdJQ0U5UFNBbmNISnZaSFZqZEdsdmJpY3BJSHRjYmlBZ0lDQnBaaUFvYUdGelQzZHVVSEp2Y0dWeWRIa3VZMkZzYkNoamIyNW1hV2NzSUNkclpYa25LU2tnZTF4dUlDQWdJQ0FnZG1GeUlHZGxkSFJsY2lBOUlFOWlhbVZqZEM1blpYUlBkMjVRY205d1pYSjBlVVJsYzJOeWFYQjBiM0lvWTI5dVptbG5MQ0FuYTJWNUp5a3VaMlYwTzF4dUlDQWdJQ0FnYVdZZ0tHZGxkSFJsY2lBbUppQm5aWFIwWlhJdWFYTlNaV0ZqZEZkaGNtNXBibWNwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnlaWFIxY200Z1kyOXVabWxuTG10bGVTQWhQVDBnZFc1a1pXWnBibVZrTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJrWldacGJtVkxaWGxRY205d1YyRnlibWx1WjBkbGRIUmxjaWh3Y205d2N5d2daR2x6Y0d4aGVVNWhiV1VwSUh0Y2JpQWdkbUZ5SUhkaGNtNUJZbTkxZEVGalkyVnpjMmx1WjB0bGVTQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0JwWmlBb0lYTndaV05wWVd4UWNtOXdTMlY1VjJGeWJtbHVaMU5vYjNkdUtTQjdYRzRnSUNBZ0lDQnpjR1ZqYVdGc1VISnZjRXRsZVZkaGNtNXBibWRUYUc5M2JpQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNCd2NtOWpaWE56TG1WdWRpNU9UMFJGWDBWT1ZpQWhQVDBnSjNCeWIyUjFZM1JwYjI0bklEOGdkMkZ5Ym1sdVp5aG1ZV3h6WlN3Z0p5VnpPaUJnYTJWNVlDQnBjeUJ1YjNRZ1lTQndjbTl3TGlCVWNubHBibWNnZEc4Z1lXTmpaWE56SUdsMElIZHBiR3dnY21WemRXeDBJQ2NnS3lBbmFXNGdZSFZ1WkdWbWFXNWxaR0FnWW1WcGJtY2djbVYwZFhKdVpXUXVJRWxtSUhsdmRTQnVaV1ZrSUhSdklHRmpZMlZ6Y3lCMGFHVWdjMkZ0WlNBbklDc2dKM1poYkhWbElIZHBkR2hwYmlCMGFHVWdZMmhwYkdRZ1kyOXRjRzl1Wlc1MExDQjViM1VnYzJodmRXeGtJSEJoYzNNZ2FYUWdZWE1nWVNCa2FXWm1aWEpsYm5RZ0p5QXJJQ2R3Y205d0xpQW9hSFIwY0hNNkx5OW1ZaTV0WlM5eVpXRmpkQzF6Y0dWamFXRnNMWEJ5YjNCektTY3NJR1JwYzNCc1lYbE9ZVzFsS1NBNklIWnZhV1FnTUR0Y2JpQWdJQ0I5WEc0Z0lIMDdYRzRnSUhkaGNtNUJZbTkxZEVGalkyVnpjMmx1WjB0bGVTNXBjMUpsWVdOMFYyRnlibWx1WnlBOUlIUnlkV1U3WEc0Z0lFOWlhbVZqZEM1a1pXWnBibVZRY205d1pYSjBlU2h3Y205d2N5d2dKMnRsZVNjc0lIdGNiaUFnSUNCblpYUTZJSGRoY201QlltOTFkRUZqWTJWemMybHVaMHRsZVN4Y2JpQWdJQ0JqYjI1bWFXZDFjbUZpYkdVNklIUnlkV1ZjYmlBZ2ZTazdYRzU5WEc1Y2JtWjFibU4wYVc5dUlHUmxabWx1WlZKbFpsQnliM0JYWVhKdWFXNW5SMlYwZEdWeUtIQnliM0J6TENCa2FYTndiR0Y1VG1GdFpTa2dlMXh1SUNCMllYSWdkMkZ5YmtGaWIzVjBRV05qWlhOemFXNW5VbVZtSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lHbG1JQ2doYzNCbFkybGhiRkJ5YjNCU1pXWlhZWEp1YVc1blUyaHZkMjRwSUh0Y2JpQWdJQ0FnSUhOd1pXTnBZV3hRY205d1VtVm1WMkZ5Ym1sdVoxTm9iM2R1SUQwZ2RISjFaVHRjYmlBZ0lDQWdJSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNnUHlCM1lYSnVhVzVuS0daaGJITmxMQ0FuSlhNNklHQnlaV1pnSUdseklHNXZkQ0JoSUhCeWIzQXVJRlJ5ZVdsdVp5QjBieUJoWTJObGMzTWdhWFFnZDJsc2JDQnlaWE4xYkhRZ0p5QXJJQ2RwYmlCZ2RXNWtaV1pwYm1Wa1lDQmlaV2x1WnlCeVpYUjFjbTVsWkM0Z1NXWWdlVzkxSUc1bFpXUWdkRzhnWVdOalpYTnpJSFJvWlNCellXMWxJQ2NnS3lBbmRtRnNkV1VnZDJsMGFHbHVJSFJvWlNCamFHbHNaQ0JqYjIxd2IyNWxiblFzSUhsdmRTQnphRzkxYkdRZ2NHRnpjeUJwZENCaGN5QmhJR1JwWm1abGNtVnVkQ0FuSUNzZ0ozQnliM0F1SUNob2RIUndjem92TDJaaUxtMWxMM0psWVdOMExYTndaV05wWVd3dGNISnZjSE1wSnl3Z1pHbHpjR3hoZVU1aGJXVXBJRG9nZG05cFpDQXdPMXh1SUNBZ0lIMWNiaUFnZlR0Y2JpQWdkMkZ5YmtGaWIzVjBRV05qWlhOemFXNW5VbVZtTG1selVtVmhZM1JYWVhKdWFXNW5JRDBnZEhKMVpUdGNiaUFnVDJKcVpXTjBMbVJsWm1sdVpWQnliM0JsY25SNUtIQnliM0J6TENBbmNtVm1KeXdnZTF4dUlDQWdJR2RsZERvZ2QyRnlia0ZpYjNWMFFXTmpaWE56YVc1blVtVm1MRnh1SUNBZ0lHTnZibVpwWjNWeVlXSnNaVG9nZEhKMVpWeHVJQ0I5S1R0Y2JuMWNibHh1THlvcVhHNGdLaUJHWVdOMGIzSjVJRzFsZEdodlpDQjBieUJqY21WaGRHVWdZU0J1WlhjZ1VtVmhZM1FnWld4bGJXVnVkQzRnVkdocGN5QnVieUJzYjI1blpYSWdZV1JvWlhKbGN5QjBiMXh1SUNvZ2RHaGxJR05zWVhOeklIQmhkSFJsY200c0lITnZJR1J2SUc1dmRDQjFjMlVnYm1WM0lIUnZJR05oYkd3Z2FYUXVJRUZzYzI4c0lHNXZJR2x1YzNSaGJtTmxiMllnWTJobFkydGNiaUFxSUhkcGJHd2dkMjl5YXk0Z1NXNXpkR1ZoWkNCMFpYTjBJQ1FrZEhsd1pXOW1JR1pwWld4a0lHRm5ZV2x1YzNRZ1UzbHRZbTlzTG1admNpZ25jbVZoWTNRdVpXeGxiV1Z1ZENjcElIUnZJR05vWldOclhHNGdLaUJwWmlCemIyMWxkR2hwYm1jZ2FYTWdZU0JTWldGamRDQkZiR1Z0Wlc1MExseHVJQ3BjYmlBcUlFQndZWEpoYlNCN0tuMGdkSGx3WlZ4dUlDb2dRSEJoY21GdElIc3FmU0JyWlhsY2JpQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bmZHOWlhbVZqZEgwZ2NtVm1YRzRnS2lCQWNHRnlZVzBnZXlwOUlITmxiR1lnUVNBcWRHVnRjRzl5WVhKNUtpQm9aV3h3WlhJZ2RHOGdaR1YwWldOMElIQnNZV05sY3lCM2FHVnlaU0JnZEdocGMyQWdhWE5jYmlBcUlHUnBabVpsY21WdWRDQm1jbTl0SUhSb1pTQmdiM2R1WlhKZ0lIZG9aVzRnVW1WaFkzUXVZM0psWVhSbFJXeGxiV1Z1ZENCcGN5QmpZV3hzWldRc0lITnZJSFJvWVhRZ2QyVmNiaUFxSUdOaGJpQjNZWEp1TGlCWFpTQjNZVzUwSUhSdklHZGxkQ0J5YVdRZ2IyWWdiM2R1WlhJZ1lXNWtJSEpsY0d4aFkyVWdjM1J5YVc1bklHQnlaV1pnY3lCM2FYUm9JR0Z5Y205M1hHNGdLaUJtZFc1amRHbHZibk1zSUdGdVpDQmhjeUJzYjI1bklHRnpJR0IwYUdsellDQmhibVFnYjNkdVpYSWdZWEpsSUhSb1pTQnpZVzFsTENCMGFHVnlaU0IzYVd4c0lHSmxJRzV2WEc0Z0tpQmphR0Z1WjJVZ2FXNGdZbVZvWVhacGIzSXVYRzRnS2lCQWNHRnlZVzBnZXlwOUlITnZkWEpqWlNCQmJpQmhibTV2ZEdGMGFXOXVJRzlpYW1WamRDQW9ZV1JrWldRZ1lua2dZU0IwY21GdWMzQnBiR1Z5SUc5eUlHOTBhR1Z5ZDJselpTbGNiaUFxSUdsdVpHbGpZWFJwYm1jZ1ptbHNaVzVoYldVc0lHeHBibVVnYm5WdFltVnlMQ0JoYm1RdmIzSWdiM1JvWlhJZ2FXNW1iM0p0WVhScGIyNHVYRzRnS2lCQWNHRnlZVzBnZXlwOUlHOTNibVZ5WEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJSEJ5YjNCelhHNGdLaUJBYVc1MFpYSnVZV3hjYmlBcUwxeHVkbUZ5SUZKbFlXTjBSV3hsYldWdWRDQTlJR1oxYm1OMGFXOXVJQ2gwZVhCbExDQnJaWGtzSUhKbFppd2djMlZzWml3Z2MyOTFjbU5sTENCdmQyNWxjaXdnY0hKdmNITXBJSHRjYmlBZ2RtRnlJR1ZzWlcxbGJuUWdQU0I3WEc0Z0lDQWdMeThnVkdocGN5QjBZV2NnWVd4c2IzY2dkWE1nZEc4Z2RXNXBjWFZsYkhrZ2FXUmxiblJwWm5rZ2RHaHBjeUJoY3lCaElGSmxZV04wSUVWc1pXMWxiblJjYmlBZ0lDQWtKSFI1Y0dWdlpqb2dVa1ZCUTFSZlJVeEZUVVZPVkY5VVdWQkZMRnh1WEc0Z0lDQWdMeThnUW5WcGJIUXRhVzRnY0hKdmNHVnlkR2xsY3lCMGFHRjBJR0psYkc5dVp5QnZiaUIwYUdVZ1pXeGxiV1Z1ZEZ4dUlDQWdJSFI1Y0dVNklIUjVjR1VzWEc0Z0lDQWdhMlY1T2lCclpYa3NYRzRnSUNBZ2NtVm1PaUJ5WldZc1hHNGdJQ0FnY0hKdmNITTZJSEJ5YjNCekxGeHVYRzRnSUNBZ0x5OGdVbVZqYjNKa0lIUm9aU0JqYjIxd2IyNWxiblFnY21WemNHOXVjMmxpYkdVZ1ptOXlJR055WldGMGFXNW5JSFJvYVhNZ1pXeGxiV1Z1ZEM1Y2JpQWdJQ0JmYjNkdVpYSTZJRzkzYm1WeVhHNGdJSDA3WEc1Y2JpQWdhV1lnS0hCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljcElIdGNiaUFnSUNBdkx5QlVhR1VnZG1Gc2FXUmhkR2x2YmlCbWJHRm5JR2x6SUdOMWNuSmxiblJzZVNCdGRYUmhkR2wyWlM0Z1YyVWdjSFYwSUdsMElHOXVYRzRnSUNBZ0x5OGdZVzRnWlhoMFpYSnVZV3dnWW1GamEybHVaeUJ6ZEc5eVpTQnpieUIwYUdGMElIZGxJR05oYmlCbWNtVmxlbVVnZEdobElIZG9iMnhsSUc5aWFtVmpkQzVjYmlBZ0lDQXZMeUJVYUdseklHTmhiaUJpWlNCeVpYQnNZV05sWkNCM2FYUm9JR0VnVjJWaGEwMWhjQ0J2Ym1ObElIUm9aWGtnWVhKbElHbHRjR3hsYldWdWRHVmtJR2x1WEc0Z0lDQWdMeThnWTI5dGJXOXViSGtnZFhObFpDQmtaWFpsYkc5d2JXVnVkQ0JsYm5acGNtOXViV1Z1ZEhNdVhHNGdJQ0FnWld4bGJXVnVkQzVmYzNSdmNtVWdQU0I3ZlR0Y2JpQWdJQ0IyWVhJZ2MyaGhaRzkzUTJocGJHUnlaVzRnUFNCQmNuSmhlUzVwYzBGeWNtRjVLSEJ5YjNCekxtTm9hV3hrY21WdUtTQS9JSEJ5YjNCekxtTm9hV3hrY21WdUxuTnNhV05sS0RBcElEb2djSEp2Y0hNdVkyaHBiR1J5Wlc0N1hHNWNiaUFnSUNBdkx5QlVieUJ0WVd0bElHTnZiWEJoY21sdVp5QlNaV0ZqZEVWc1pXMWxiblJ6SUdWaGMybGxjaUJtYjNJZ2RHVnpkR2x1WnlCd2RYSndiM05sY3l3Z2QyVWdiV0ZyWlZ4dUlDQWdJQzh2SUhSb1pTQjJZV3hwWkdGMGFXOXVJR1pzWVdjZ2JtOXVMV1Z1ZFcxbGNtRmliR1VnS0hkb1pYSmxJSEJ2YzNOcFlteGxMQ0IzYUdsamFDQnphRzkxYkdSY2JpQWdJQ0F2THlCcGJtTnNkV1JsSUdWMlpYSjVJR1Z1ZG1seWIyNXRaVzUwSUhkbElISjFiaUIwWlhOMGN5QnBiaWtzSUhOdklIUm9aU0IwWlhOMElHWnlZVzFsZDI5eWExeHVJQ0FnSUM4dklHbG5ibTl5WlhNZ2FYUXVYRzRnSUNBZ2FXWWdLR05oYmtSbFptbHVaVkJ5YjNCbGNuUjVLU0I3WEc0Z0lDQWdJQ0JQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb1pXeGxiV1Z1ZEM1ZmMzUnZjbVVzSUNkMllXeHBaR0YwWldRbkxDQjdYRzRnSUNBZ0lDQWdJR052Ym1acFozVnlZV0pzWlRvZ1ptRnNjMlVzWEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUZpYkdVNklHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNCM2NtbDBZV0pzWlRvZ2RISjFaU3hjYmlBZ0lDQWdJQ0FnZG1Gc2RXVTZJR1poYkhObFhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDOHZJSE5sYkdZZ1lXNWtJSE52ZFhKalpTQmhjbVVnUkVWV0lHOXViSGtnY0hKdmNHVnlkR2xsY3k1Y2JpQWdJQ0FnSUU5aWFtVmpkQzVrWldacGJtVlFjbTl3WlhKMGVTaGxiR1Z0Wlc1MExDQW5YM05sYkdZbkxDQjdYRzRnSUNBZ0lDQWdJR052Ym1acFozVnlZV0pzWlRvZ1ptRnNjMlVzWEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUZpYkdVNklHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNCM2NtbDBZV0pzWlRvZ1ptRnNjMlVzWEc0Z0lDQWdJQ0FnSUhaaGJIVmxPaUJ6Wld4bVhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lFOWlhbVZqZEM1a1pXWnBibVZRY205d1pYSjBlU2hsYkdWdFpXNTBMQ0FuWDNOb1lXUnZkME5vYVd4a2NtVnVKeXdnZTF4dUlDQWdJQ0FnSUNCamIyNW1hV2QxY21GaWJHVTZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQmxiblZ0WlhKaFlteGxPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdkM0pwZEdGaWJHVTZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQjJZV3gxWlRvZ2MyaGhaRzkzUTJocGJHUnlaVzVjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnTHk4Z1ZIZHZJR1ZzWlcxbGJuUnpJR055WldGMFpXUWdhVzRnZEhkdklHUnBabVpsY21WdWRDQndiR0ZqWlhNZ2MyaHZkV3hrSUdKbElHTnZibk5wWkdWeVpXUmNiaUFnSUNBZ0lDOHZJR1Z4ZFdGc0lHWnZjaUIwWlhOMGFXNW5JSEIxY25CdmMyVnpJR0Z1WkNCMGFHVnlaV1p2Y21VZ2QyVWdhR2xrWlNCcGRDQm1jbTl0SUdWdWRXMWxjbUYwYVc5dUxseHVJQ0FnSUNBZ1QySnFaV04wTG1SbFptbHVaVkJ5YjNCbGNuUjVLR1ZzWlcxbGJuUXNJQ2RmYzI5MWNtTmxKeXdnZTF4dUlDQWdJQ0FnSUNCamIyNW1hV2QxY21GaWJHVTZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQmxiblZ0WlhKaFlteGxPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdkM0pwZEdGaWJHVTZJR1poYkhObExGeHVJQ0FnSUNBZ0lDQjJZV3gxWlRvZ2MyOTFjbU5sWEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdaV3hsYldWdWRDNWZjM1J2Y21VdWRtRnNhV1JoZEdWa0lEMGdabUZzYzJVN1hHNGdJQ0FnSUNCbGJHVnRaVzUwTGw5elpXeG1JRDBnYzJWc1pqdGNiaUFnSUNBZ0lHVnNaVzFsYm5RdVgzTm9ZV1J2ZDBOb2FXeGtjbVZ1SUQwZ2MyaGhaRzkzUTJocGJHUnlaVzQ3WEc0Z0lDQWdJQ0JsYkdWdFpXNTBMbDl6YjNWeVkyVWdQU0J6YjNWeVkyVTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaFBZbXBsWTNRdVpuSmxaWHBsS1NCN1hHNGdJQ0FnSUNCUFltcGxZM1F1Wm5KbFpYcGxLR1ZzWlcxbGJuUXVjSEp2Y0hNcE8xeHVJQ0FnSUNBZ1QySnFaV04wTG1aeVpXVjZaU2hsYkdWdFpXNTBLVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5WlhSMWNtNGdaV3hsYldWdWREdGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1EzSmxZWFJsSUdGdVpDQnlaWFIxY200Z1lTQnVaWGNnVW1WaFkzUkZiR1Z0Wlc1MElHOW1JSFJvWlNCbmFYWmxiaUIwZVhCbExseHVJQ29nVTJWbElHaDBkSEJ6T2k4dlptRmpaV0p2YjJzdVoybDBhSFZpTG1sdkwzSmxZV04wTDJSdlkzTXZkRzl3TFd4bGRtVnNMV0Z3YVM1b2RHMXNJM0psWVdOMExtTnlaV0YwWldWc1pXMWxiblJjYmlBcUwxeHVVbVZoWTNSRmJHVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUWdQU0JtZFc1amRHbHZiaUFvZEhsd1pTd2dZMjl1Wm1sbkxDQmphR2xzWkhKbGJpa2dlMXh1SUNCMllYSWdjSEp2Y0U1aGJXVTdYRzVjYmlBZ0x5OGdVbVZ6WlhKMlpXUWdibUZ0WlhNZ1lYSmxJR1Y0ZEhKaFkzUmxaRnh1SUNCMllYSWdjSEp2Y0hNZ1BTQjdmVHRjYmx4dUlDQjJZWElnYTJWNUlEMGdiblZzYkR0Y2JpQWdkbUZ5SUhKbFppQTlJRzUxYkd3N1hHNGdJSFpoY2lCelpXeG1JRDBnYm5Wc2JEdGNiaUFnZG1GeUlITnZkWEpqWlNBOUlHNTFiR3c3WEc1Y2JpQWdhV1lnS0dOdmJtWnBaeUFoUFNCdWRXeHNLU0I3WEc0Z0lDQWdhV1lnS0doaGMxWmhiR2xrVW1WbUtHTnZibVpwWnlrcElIdGNiaUFnSUNBZ0lISmxaaUE5SUdOdmJtWnBaeTV5WldZN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNob1lYTldZV3hwWkV0bGVTaGpiMjVtYVdjcEtTQjdYRzRnSUNBZ0lDQnJaWGtnUFNBbkp5QXJJR052Ym1acFp5NXJaWGs3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjMlZzWmlBOUlHTnZibVpwWnk1ZlgzTmxiR1lnUFQwOUlIVnVaR1ZtYVc1bFpDQS9JRzUxYkd3Z09pQmpiMjVtYVdjdVgxOXpaV3htTzF4dUlDQWdJSE52ZFhKalpTQTlJR052Ym1acFp5NWZYM052ZFhKalpTQTlQVDBnZFc1a1pXWnBibVZrSUQ4Z2JuVnNiQ0E2SUdOdmJtWnBaeTVmWDNOdmRYSmpaVHRjYmlBZ0lDQXZMeUJTWlcxaGFXNXBibWNnY0hKdmNHVnlkR2xsY3lCaGNtVWdZV1JrWldRZ2RHOGdZU0J1WlhjZ2NISnZjSE1nYjJKcVpXTjBYRzRnSUNBZ1ptOXlJQ2h3Y205d1RtRnRaU0JwYmlCamIyNW1hV2NwSUh0Y2JpQWdJQ0FnSUdsbUlDaG9ZWE5QZDI1UWNtOXdaWEowZVM1allXeHNLR052Ym1acFp5d2djSEp2Y0U1aGJXVXBJQ1ltSUNGU1JWTkZVbFpGUkY5UVVrOVFVeTVvWVhOUGQyNVFjbTl3WlhKMGVTaHdjbTl3VG1GdFpTa3BJSHRjYmlBZ0lDQWdJQ0FnY0hKdmNITmJjSEp2Y0U1aGJXVmRJRDBnWTI5dVptbG5XM0J5YjNCT1lXMWxYVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0F2THlCRGFHbHNaSEpsYmlCallXNGdZbVVnYlc5eVpTQjBhR0Z1SUc5dVpTQmhjbWQxYldWdWRDd2dZVzVrSUhSb2IzTmxJR0Z5WlNCMGNtRnVjMlpsY25KbFpDQnZiblJ2WEc0Z0lDOHZJSFJvWlNCdVpYZHNlU0JoYkd4dlkyRjBaV1FnY0hKdmNITWdiMkpxWldOMExseHVJQ0IyWVhJZ1kyaHBiR1J5Wlc1TVpXNW5kR2dnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUMwZ01qdGNiaUFnYVdZZ0tHTm9hV3hrY21WdVRHVnVaM1JvSUQwOVBTQXhLU0I3WEc0Z0lDQWdjSEp2Y0hNdVkyaHBiR1J5Wlc0Z1BTQmphR2xzWkhKbGJqdGNiaUFnZlNCbGJITmxJR2xtSUNoamFHbHNaSEpsYmt4bGJtZDBhQ0ErSURFcElIdGNiaUFnSUNCMllYSWdZMmhwYkdSQmNuSmhlU0E5SUVGeWNtRjVLR05vYVd4a2NtVnVUR1Z1WjNSb0tUdGNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHTm9hV3hrY21WdVRHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJR05vYVd4a1FYSnlZWGxiYVYwZ1BTQmhjbWQxYldWdWRITmJhU0FySURKZE8xeHVJQ0FnSUgxY2JpQWdJQ0J3Y205d2N5NWphR2xzWkhKbGJpQTlJR05vYVd4a1FYSnlZWGs3WEc0Z0lIMWNibHh1SUNBdkx5QlNaWE52YkhabElHUmxabUYxYkhRZ2NISnZjSE5jYmlBZ2FXWWdLSFI1Y0dVZ0ppWWdkSGx3WlM1a1pXWmhkV3gwVUhKdmNITXBJSHRjYmlBZ0lDQjJZWElnWkdWbVlYVnNkRkJ5YjNCeklEMGdkSGx3WlM1a1pXWmhkV3gwVUhKdmNITTdYRzRnSUNBZ1ptOXlJQ2h3Y205d1RtRnRaU0JwYmlCa1pXWmhkV3gwVUhKdmNITXBJSHRjYmlBZ0lDQWdJR2xtSUNod2NtOXdjMXR3Y205d1RtRnRaVjBnUFQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh1SUNBZ0lDQWdJQ0J3Y205d2MxdHdjbTl3VG1GdFpWMGdQU0JrWldaaGRXeDBVSEp2Y0hOYmNISnZjRTVoYldWZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmVnh1SUNCcFppQW9jSEp2WTJWemN5NWxibll1VGs5RVJWOUZUbFlnSVQwOUlDZHdjbTlrZFdOMGFXOXVKeWtnZTF4dUlDQWdJR2xtSUNoclpYa2dmSHdnY21WbUtTQjdYRzRnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JSEJ5YjNCekxpUWtkSGx3Wlc5bUlEMDlQU0FuZFc1a1pXWnBibVZrSnlCOGZDQndjbTl3Y3k0a0pIUjVjR1Z2WmlBaFBUMGdVa1ZCUTFSZlJVeEZUVVZPVkY5VVdWQkZLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQmthWE53YkdGNVRtRnRaU0E5SUhSNWNHVnZaaUIwZVhCbElEMDlQU0FuWm5WdVkzUnBiMjRuSUQ4Z2RIbHdaUzVrYVhOd2JHRjVUbUZ0WlNCOGZDQjBlWEJsTG01aGJXVWdmSHdnSjFWdWEyNXZkMjRuSURvZ2RIbHdaVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHdGxlU2tnZTF4dUlDQWdJQ0FnSUNBZ0lHUmxabWx1WlV0bGVWQnliM0JYWVhKdWFXNW5SMlYwZEdWeUtIQnliM0J6TENCa2FYTndiR0Y1VG1GdFpTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tISmxaaWtnZTF4dUlDQWdJQ0FnSUNBZ0lHUmxabWx1WlZKbFpsQnliM0JYWVhKdWFXNW5SMlYwZEdWeUtIQnliM0J6TENCa2FYTndiR0Y1VG1GdFpTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUgxY2JpQWdjbVYwZFhKdUlGSmxZV04wUld4bGJXVnVkQ2gwZVhCbExDQnJaWGtzSUhKbFppd2djMlZzWml3Z2MyOTFjbU5sTENCU1pXRmpkRU4xY25KbGJuUlBkMjVsY2k1amRYSnlaVzUwTENCd2NtOXdjeWs3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRkpsZEhWeWJpQmhJR1oxYm1OMGFXOXVJSFJvWVhRZ2NISnZaSFZqWlhNZ1VtVmhZM1JGYkdWdFpXNTBjeUJ2WmlCaElHZHBkbVZ1SUhSNWNHVXVYRzRnS2lCVFpXVWdhSFIwY0hNNkx5OW1ZV05sWW05dmF5NW5hWFJvZFdJdWFXOHZjbVZoWTNRdlpHOWpjeTkwYjNBdGJHVjJaV3d0WVhCcExtaDBiV3dqY21WaFkzUXVZM0psWVhSbFptRmpkRzl5ZVZ4dUlDb3ZYRzVTWldGamRFVnNaVzFsYm5RdVkzSmxZWFJsUm1GamRHOXllU0E5SUdaMWJtTjBhVzl1SUNoMGVYQmxLU0I3WEc0Z0lIWmhjaUJtWVdOMGIzSjVJRDBnVW1WaFkzUkZiR1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblF1WW1sdVpDaHVkV3hzTENCMGVYQmxLVHRjYmlBZ0x5OGdSWGh3YjNObElIUm9aU0IwZVhCbElHOXVJSFJvWlNCbVlXTjBiM0o1SUdGdVpDQjBhR1VnY0hKdmRHOTBlWEJsSUhOdklIUm9ZWFFnYVhRZ1kyRnVJR0psWEc0Z0lDOHZJR1ZoYzJsc2VTQmhZMk5sYzNObFpDQnZiaUJsYkdWdFpXNTBjeTRnUlM1bkxpQmdQRVp2YnlBdlBpNTBlWEJsSUQwOVBTQkdiMjlnTGx4dUlDQXZMeUJVYUdseklITm9iM1ZzWkNCdWIzUWdZbVVnYm1GdFpXUWdZR052Ym5OMGNuVmpkRzl5WUNCemFXNWpaU0IwYUdseklHMWhlU0J1YjNRZ1ltVWdkR2hsSUdaMWJtTjBhVzl1WEc0Z0lDOHZJSFJvWVhRZ1kzSmxZWFJsWkNCMGFHVWdaV3hsYldWdWRDd2dZVzVrSUdsMElHMWhlU0J1YjNRZ1pYWmxiaUJpWlNCaElHTnZibk4wY25WamRHOXlMbHh1SUNBdkx5Qk1aV2RoWTNrZ2FHOXZheUJVVDBSUE9pQlhZWEp1SUdsbUlIUm9hWE1nYVhNZ1lXTmpaWE56WldSY2JpQWdabUZqZEc5eWVTNTBlWEJsSUQwZ2RIbHdaVHRjYmlBZ2NtVjBkWEp1SUdaaFkzUnZjbms3WEc1OU8xeHVYRzVTWldGamRFVnNaVzFsYm5RdVkyeHZibVZCYm1SU1pYQnNZV05sUzJWNUlEMGdablZ1WTNScGIyNGdLRzlzWkVWc1pXMWxiblFzSUc1bGQwdGxlU2tnZTF4dUlDQjJZWElnYm1WM1JXeGxiV1Z1ZENBOUlGSmxZV04wUld4bGJXVnVkQ2h2YkdSRmJHVnRaVzUwTG5SNWNHVXNJRzVsZDB0bGVTd2diMnhrUld4bGJXVnVkQzV5WldZc0lHOXNaRVZzWlcxbGJuUXVYM05sYkdZc0lHOXNaRVZzWlcxbGJuUXVYM052ZFhKalpTd2diMnhrUld4bGJXVnVkQzVmYjNkdVpYSXNJRzlzWkVWc1pXMWxiblF1Y0hKdmNITXBPMXh1WEc0Z0lISmxkSFZ5YmlCdVpYZEZiR1Z0Wlc1ME8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCRGJHOXVaU0JoYm1RZ2NtVjBkWEp1SUdFZ2JtVjNJRkpsWVdOMFJXeGxiV1Z1ZENCMWMybHVaeUJsYkdWdFpXNTBJR0Z6SUhSb1pTQnpkR0Z5ZEdsdVp5QndiMmx1ZEM1Y2JpQXFJRk5sWlNCb2RIUndjem92TDJaaFkyVmliMjlyTG1kcGRHaDFZaTVwYnk5eVpXRmpkQzlrYjJOekwzUnZjQzFzWlhabGJDMWhjR2t1YUhSdGJDTnlaV0ZqZEM1amJHOXVaV1ZzWlcxbGJuUmNiaUFxTDF4dVVtVmhZM1JGYkdWdFpXNTBMbU5zYjI1bFJXeGxiV1Z1ZENBOUlHWjFibU4wYVc5dUlDaGxiR1Z0Wlc1MExDQmpiMjVtYVdjc0lHTm9hV3hrY21WdUtTQjdYRzRnSUhaaGNpQndjbTl3VG1GdFpUdGNibHh1SUNBdkx5QlBjbWxuYVc1aGJDQndjbTl3Y3lCaGNtVWdZMjl3YVdWa1hHNGdJSFpoY2lCd2NtOXdjeUE5SUY5aGMzTnBaMjRvZTMwc0lHVnNaVzFsYm5RdWNISnZjSE1wTzF4dVhHNGdJQzh2SUZKbGMyVnlkbVZrSUc1aGJXVnpJR0Z5WlNCbGVIUnlZV04wWldSY2JpQWdkbUZ5SUd0bGVTQTlJR1ZzWlcxbGJuUXVhMlY1TzF4dUlDQjJZWElnY21WbUlEMGdaV3hsYldWdWRDNXlaV1k3WEc0Z0lDOHZJRk5sYkdZZ2FYTWdjSEpsYzJWeWRtVmtJSE5wYm1ObElIUm9aU0J2ZDI1bGNpQnBjeUJ3Y21WelpYSjJaV1F1WEc0Z0lIWmhjaUJ6Wld4bUlEMGdaV3hsYldWdWRDNWZjMlZzWmp0Y2JpQWdMeThnVTI5MWNtTmxJR2x6SUhCeVpYTmxjblpsWkNCemFXNWpaU0JqYkc5dVpVVnNaVzFsYm5RZ2FYTWdkVzVzYVd0bGJIa2dkRzhnWW1VZ2RHRnlaMlYwWldRZ1lua2dZVnh1SUNBdkx5QjBjbUZ1YzNCcGJHVnlMQ0JoYm1RZ2RHaGxJRzl5YVdkcGJtRnNJSE52ZFhKalpTQnBjeUJ3Y205aVlXSnNlU0JoSUdKbGRIUmxjaUJwYm1ScFkyRjBiM0lnYjJZZ2RHaGxYRzRnSUM4dklIUnlkV1VnYjNkdVpYSXVYRzRnSUhaaGNpQnpiM1Z5WTJVZ1BTQmxiR1Z0Wlc1MExsOXpiM1Z5WTJVN1hHNWNiaUFnTHk4Z1QzZHVaWElnZDJsc2JDQmlaU0J3Y21WelpYSjJaV1FzSUhWdWJHVnpjeUJ5WldZZ2FYTWdiM1psY25KcFpHUmxibHh1SUNCMllYSWdiM2R1WlhJZ1BTQmxiR1Z0Wlc1MExsOXZkMjVsY2p0Y2JseHVJQ0JwWmlBb1kyOXVabWxuSUNFOUlHNTFiR3dwSUh0Y2JpQWdJQ0JwWmlBb2FHRnpWbUZzYVdSU1pXWW9ZMjl1Wm1sbktTa2dlMXh1SUNBZ0lDQWdMeThnVTJsc1pXNTBiSGtnYzNSbFlXd2dkR2hsSUhKbFppQm1jbTl0SUhSb1pTQndZWEpsYm5RdVhHNGdJQ0FnSUNCeVpXWWdQU0JqYjI1bWFXY3VjbVZtTzF4dUlDQWdJQ0FnYjNkdVpYSWdQU0JTWldGamRFTjFjbkpsYm5SUGQyNWxjaTVqZFhKeVpXNTBPMXh1SUNBZ0lIMWNiaUFnSUNCcFppQW9hR0Z6Vm1Gc2FXUkxaWGtvWTI5dVptbG5LU2tnZTF4dUlDQWdJQ0FnYTJWNUlEMGdKeWNnS3lCamIyNW1hV2N1YTJWNU8xeHVJQ0FnSUgxY2JseHVJQ0FnSUM4dklGSmxiV0ZwYm1sdVp5QndjbTl3WlhKMGFXVnpJRzkyWlhKeWFXUmxJR1Y0YVhOMGFXNW5JSEJ5YjNCelhHNGdJQ0FnZG1GeUlHUmxabUYxYkhSUWNtOXdjenRjYmlBZ0lDQnBaaUFvWld4bGJXVnVkQzUwZVhCbElDWW1JR1ZzWlcxbGJuUXVkSGx3WlM1a1pXWmhkV3gwVUhKdmNITXBJSHRjYmlBZ0lDQWdJR1JsWm1GMWJIUlFjbTl3Y3lBOUlHVnNaVzFsYm5RdWRIbHdaUzVrWldaaGRXeDBVSEp2Y0hNN1hHNGdJQ0FnZlZ4dUlDQWdJR1p2Y2lBb2NISnZjRTVoYldVZ2FXNGdZMjl1Wm1sbktTQjdYRzRnSUNBZ0lDQnBaaUFvYUdGelQzZHVVSEp2Y0dWeWRIa3VZMkZzYkNoamIyNW1hV2NzSUhCeWIzQk9ZVzFsS1NBbUppQWhVa1ZUUlZKV1JVUmZVRkpQVUZNdWFHRnpUM2R1VUhKdmNHVnlkSGtvY0hKdmNFNWhiV1VwS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hqYjI1bWFXZGJjSEp2Y0U1aGJXVmRJRDA5UFNCMWJtUmxabWx1WldRZ0ppWWdaR1ZtWVhWc2RGQnliM0J6SUNFOVBTQjFibVJsWm1sdVpXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QlNaWE52YkhabElHUmxabUYxYkhRZ2NISnZjSE5jYmlBZ0lDQWdJQ0FnSUNCd2NtOXdjMXR3Y205d1RtRnRaVjBnUFNCa1pXWmhkV3gwVUhKdmNITmJjSEp2Y0U1aGJXVmRPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUhCeWIzQnpXM0J5YjNCT1lXMWxYU0E5SUdOdmJtWnBaMXR3Y205d1RtRnRaVjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNBdkx5QkRhR2xzWkhKbGJpQmpZVzRnWW1VZ2JXOXlaU0IwYUdGdUlHOXVaU0JoY21kMWJXVnVkQ3dnWVc1a0lIUm9iM05sSUdGeVpTQjBjbUZ1YzJabGNuSmxaQ0J2Ym5SdlhHNGdJQzh2SUhSb1pTQnVaWGRzZVNCaGJHeHZZMkYwWldRZ2NISnZjSE1nYjJKcVpXTjBMbHh1SUNCMllYSWdZMmhwYkdSeVpXNU1aVzVuZEdnZ1BTQmhjbWQxYldWdWRITXViR1Z1WjNSb0lDMGdNanRjYmlBZ2FXWWdLR05vYVd4a2NtVnVUR1Z1WjNSb0lEMDlQU0F4S1NCN1hHNGdJQ0FnY0hKdmNITXVZMmhwYkdSeVpXNGdQU0JqYUdsc1pISmxianRjYmlBZ2ZTQmxiSE5sSUdsbUlDaGphR2xzWkhKbGJreGxibWQwYUNBK0lERXBJSHRjYmlBZ0lDQjJZWElnWTJocGJHUkJjbkpoZVNBOUlFRnljbUY1S0dOb2FXeGtjbVZ1VEdWdVozUm9LVHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR05vYVd4a2NtVnVUR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUdOb2FXeGtRWEp5WVhsYmFWMGdQU0JoY21kMWJXVnVkSE5iYVNBcklESmRPMXh1SUNBZ0lIMWNiaUFnSUNCd2NtOXdjeTVqYUdsc1pISmxiaUE5SUdOb2FXeGtRWEp5WVhrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z1VtVmhZM1JGYkdWdFpXNTBLR1ZzWlcxbGJuUXVkSGx3WlN3Z2EyVjVMQ0J5WldZc0lITmxiR1lzSUhOdmRYSmpaU3dnYjNkdVpYSXNJSEJ5YjNCektUdGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1ZtVnlhV1pwWlhNZ2RHaGxJRzlpYW1WamRDQnBjeUJoSUZKbFlXTjBSV3hsYldWdWRDNWNiaUFxSUZObFpTQm9kSFJ3Y3pvdkwyWmhZMlZpYjI5ckxtZHBkR2gxWWk1cGJ5OXlaV0ZqZEM5a2IyTnpMM1J2Y0Mxc1pYWmxiQzFoY0drdWFIUnRiQ055WldGamRDNXBjM1poYkdsa1pXeGxiV1Z1ZEZ4dUlDb2dRSEJoY21GdElIcy9iMkpxWldOMGZTQnZZbXBsWTNSY2JpQXFJRUJ5WlhSMWNtNGdlMkp2YjJ4bFlXNTlJRlJ5ZFdVZ2FXWWdZRzlpYW1WamRHQWdhWE1nWVNCMllXeHBaQ0JqYjIxd2IyNWxiblF1WEc0Z0tpQkFabWx1WVd4Y2JpQXFMMXh1VW1WaFkzUkZiR1Z0Wlc1MExtbHpWbUZzYVdSRmJHVnRaVzUwSUQwZ1puVnVZM1JwYjI0Z0tHOWlhbVZqZENrZ2UxeHVJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlHOWlhbVZqZENBOVBUMGdKMjlpYW1WamRDY2dKaVlnYjJKcVpXTjBJQ0U5UFNCdWRXeHNJQ1ltSUc5aWFtVmpkQzRrSkhSNWNHVnZaaUE5UFQwZ1VrVkJRMVJmUlV4RlRVVk9WRjlVV1ZCRk8xeHVmVHRjYmx4dVVtVmhZM1JGYkdWdFpXNTBMbEpGUVVOVVgwVk1SVTFGVGxSZlZGbFFSU0E5SUZKRlFVTlVYMFZNUlUxRlRsUmZWRmxRUlR0Y2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQlNaV0ZqZEVWc1pXMWxiblE3SWwxOSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUmVhY3RFbGVtZW50VmFsaWRhdG9yXG4gKi9cblxuLyoqXG4gKiBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBhIGVsZW1lbnQgZmFjdG9yeVxuICogd2hpY2ggdmFsaWRhdGVzIHRoZSBwcm9wcyBwYXNzZWQgdG8gdGhlIGVsZW1lbnQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgb25seSBpbiBERVYgYW5kIGNvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgc3RhdGljIHR5cGUgY2hlY2tlciBmb3IgbGFuZ3VhZ2VzXG4gKiB0aGF0IHN1cHBvcnQgaXQuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9ucyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9ucycpO1xuXG52YXIgY2hlY2tSZWFjdFR5cGVTcGVjID0gcmVxdWlyZSgnLi9jaGVja1JlYWN0VHlwZVNwZWMnKTtcblxudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9jYW5EZWZpbmVQcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgaW5mbyA9ICcgQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8JyArIHBhcmVudE5hbWUgKyAnPi4nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5mbztcbn1cblxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcblxuICB2YXIgbWVtb2l6ZXIgPSBvd25lckhhc0tleVVzZVdhcm5pbmcudW5pcXVlS2V5IHx8IChvd25lckhhc0tleVVzZVdhcm5pbmcudW5pcXVlS2V5ID0ge30pO1xuXG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcbiAgaWYgKG1lbW9pemVyW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1lbW9pemVyW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTtcblxuICAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gJyBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSAnICsgZWxlbWVudC5fb3duZXIuZ2V0TmFtZSgpICsgJy4nO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdFYWNoIGNoaWxkIGluIGFuIGFycmF5IG9yIGl0ZXJhdG9yIHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLiVzJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lciwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KSkgOiB2b2lkIDA7XG59XG5cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG4gICAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG4gICAgLy8gRW50cnkgaXRlcmF0b3JzIHByb3ZpZGUgaW1wbGljaXQga2V5cy5cbiAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB2YXIgY29tcG9uZW50Q2xhc3MgPSBlbGVtZW50LnR5cGU7XG4gIGlmICh0eXBlb2YgY29tcG9uZW50Q2xhc3MgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5hbWUgPSBjb21wb25lbnRDbGFzcy5kaXNwbGF5TmFtZSB8fCBjb21wb25lbnRDbGFzcy5uYW1lO1xuICBpZiAoY29tcG9uZW50Q2xhc3MucHJvcFR5cGVzKSB7XG4gICAgY2hlY2tSZWFjdFR5cGVTcGVjKGNvbXBvbmVudENsYXNzLnByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgUmVhY3RQcm9wVHlwZUxvY2F0aW9ucy5wcm9wLCBuYW1lLCBlbGVtZW50LCBudWxsKTtcbiAgfVxuICBpZiAodHlwZW9mIGNvbXBvbmVudENsYXNzLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGNvbXBvbmVudENsYXNzLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCwgJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgfVxufVxuXG52YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0ge1xuXG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nO1xuICAgIC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIHNob3VsZCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkLCBib29sZWFuLCBvciAnICsgJ251bWJlci4gSXQgc2hvdWxkIGJlIGEgc3RyaW5nIChmb3IgRE9NIGVsZW1lbnRzKSBvciBhIFJlYWN0Q2xhc3MgJyArICcoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKS4lcycsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAgIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG4gICAgaWYgKHZhbGlkVHlwZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9LFxuXG4gIGNyZWF0ZUZhY3Rvcnk6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsIHR5cGUpO1xuICAgIC8vIExlZ2FjeSBob29rIFRPRE86IFdhcm4gaWYgdGhpcyBpcyBhY2Nlc3NlZFxuICAgIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpIDogdm9pZCAwO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywge1xuICAgICAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZWRGYWN0b3J5O1xuICB9LFxuXG4gIGNsb25lRWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICAgIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5ld0VsZW1lbnQudHlwZSk7XG4gICAgfVxuICAgIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICAgIHJldHVybiBuZXdFbGVtZW50O1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yO1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5U1pXRmpkRVZzWlcxbGJuUldZV3hwWkdGMGIzSXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvcVhHNGdLaUJEYjNCNWNtbG5hSFFnTWpBeE5DMXdjbVZ6Wlc1MExDQkdZV05sWW05dmF5d2dTVzVqTGx4dUlDb2dRV3hzSUhKcFoyaDBjeUJ5WlhObGNuWmxaQzVjYmlBcVhHNGdLaUJVYUdseklITnZkWEpqWlNCamIyUmxJR2x6SUd4cFkyVnVjMlZrSUhWdVpHVnlJSFJvWlNCQ1UwUXRjM1I1YkdVZ2JHbGpaVzV6WlNCbWIzVnVaQ0JwYmlCMGFHVmNiaUFxSUV4SlEwVk9VMFVnWm1sc1pTQnBiaUIwYUdVZ2NtOXZkQ0JrYVhKbFkzUnZjbmtnYjJZZ2RHaHBjeUJ6YjNWeVkyVWdkSEpsWlM0Z1FXNGdZV1JrYVhScGIyNWhiQ0JuY21GdWRGeHVJQ29nYjJZZ2NHRjBaVzUwSUhKcFoyaDBjeUJqWVc0Z1ltVWdabTkxYm1RZ2FXNGdkR2hsSUZCQlZFVk9WRk1nWm1sc1pTQnBiaUIwYUdVZ2MyRnRaU0JrYVhKbFkzUnZjbmt1WEc0Z0tseHVJQ29nUUhCeWIzWnBaR1Z6VFc5a2RXeGxJRkpsWVdOMFJXeGxiV1Z1ZEZaaGJHbGtZWFJ2Y2x4dUlDb3ZYRzVjYmk4cUtseHVJQ29nVW1WaFkzUkZiR1Z0Wlc1MFZtRnNhV1JoZEc5eUlIQnliM1pwWkdWeklHRWdkM0poY0hCbGNpQmhjbTkxYm1RZ1lTQmxiR1Z0Wlc1MElHWmhZM1J2Y25sY2JpQXFJSGRvYVdOb0lIWmhiR2xrWVhSbGN5QjBhR1VnY0hKdmNITWdjR0Z6YzJWa0lIUnZJSFJvWlNCbGJHVnRaVzUwTGlCVWFHbHpJR2x6SUdsdWRHVnVaR1ZrSUhSdklHSmxYRzRnS2lCMWMyVmtJRzl1YkhrZ2FXNGdSRVZXSUdGdVpDQmpiM1ZzWkNCaVpTQnlaWEJzWVdObFpDQmllU0JoSUhOMFlYUnBZeUIwZVhCbElHTm9aV05yWlhJZ1ptOXlJR3hoYm1kMVlXZGxjMXh1SUNvZ2RHaGhkQ0J6ZFhCd2IzSjBJR2wwTGx4dUlDb3ZYRzVjYmlkMWMyVWdjM1J5YVdOMEp6dGNibHh1ZG1GeUlGSmxZV04wUTNWeWNtVnVkRTkzYm1WeUlEMGdjbVZ4ZFdseVpTZ25MaTlTWldGamRFTjFjbkpsYm5SUGQyNWxjaWNwTzF4dWRtRnlJRkpsWVdOMFEyOXRjRzl1Wlc1MFZISmxaVWh2YjJzZ1BTQnlaWEYxYVhKbEtDY3VMMUpsWVdOMFEyOXRjRzl1Wlc1MFZISmxaVWh2YjJzbktUdGNiblpoY2lCU1pXRmpkRVZzWlcxbGJuUWdQU0J5WlhGMWFYSmxLQ2N1TDFKbFlXTjBSV3hsYldWdWRDY3BPMXh1ZG1GeUlGSmxZV04wVUhKdmNGUjVjR1ZNYjJOaGRHbHZibk1nUFNCeVpYRjFhWEpsS0NjdUwxSmxZV04wVUhKdmNGUjVjR1ZNYjJOaGRHbHZibk1uS1R0Y2JseHVkbUZ5SUdOb1pXTnJVbVZoWTNSVWVYQmxVM0JsWXlBOUlISmxjWFZwY21Vb0p5NHZZMmhsWTJ0U1pXRmpkRlI1Y0dWVGNHVmpKeWs3WEc1Y2JuWmhjaUJqWVc1RVpXWnBibVZRY205d1pYSjBlU0E5SUhKbGNYVnBjbVVvSnk0dlkyRnVSR1ZtYVc1bFVISnZjR1Z5ZEhrbktUdGNiblpoY2lCblpYUkpkR1Z5WVhSdmNrWnVJRDBnY21WeGRXbHlaU2duTGk5blpYUkpkR1Z5WVhSdmNrWnVKeWs3WEc1MllYSWdkMkZ5Ym1sdVp5QTlJSEpsY1hWcGNtVW9KMlppYW5NdmJHbGlMM2RoY201cGJtY25LVHRjYmx4dVpuVnVZM1JwYjI0Z1oyVjBSR1ZqYkdGeVlYUnBiMjVGY25KdmNrRmtaR1Z1WkhWdEtDa2dlMXh1SUNCcFppQW9VbVZoWTNSRGRYSnlaVzUwVDNkdVpYSXVZM1Z5Y21WdWRDa2dlMXh1SUNBZ0lIWmhjaUJ1WVcxbElEMGdVbVZoWTNSRGRYSnlaVzUwVDNkdVpYSXVZM1Z5Y21WdWRDNW5aWFJPWVcxbEtDazdYRzRnSUNBZ2FXWWdLRzVoYldVcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlBbklFTm9aV05ySUhSb1pTQnlaVzVrWlhJZ2JXVjBhRzlrSUc5bUlHQW5JQ3NnYm1GdFpTQXJJQ2RnTGljN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUhKbGRIVnliaUFuSnp0Y2JuMWNibHh1THlvcVhHNGdLaUJYWVhKdUlHbG1JSFJvWlhKbEozTWdibThnYTJWNUlHVjRjR3hwWTJsMGJIa2djMlYwSUc5dUlHUjVibUZ0YVdNZ1lYSnlZWGx6SUc5bUlHTm9hV3hrY21WdUlHOXlYRzRnS2lCdlltcGxZM1FnYTJWNWN5QmhjbVVnYm05MElIWmhiR2xrTGlCVWFHbHpJR0ZzYkc5M2N5QjFjeUIwYnlCclpXVndJSFJ5WVdOcklHOW1JR05vYVd4a2NtVnVJR0psZEhkbFpXNWNiaUFxSUhWd1pHRjBaWE11WEc0Z0tpOWNiblpoY2lCdmQyNWxja2hoYzB0bGVWVnpaVmRoY201cGJtY2dQU0I3ZlR0Y2JseHVablZ1WTNScGIyNGdaMlYwUTNWeWNtVnVkRU52YlhCdmJtVnVkRVZ5Y205eVNXNW1ieWh3WVhKbGJuUlVlWEJsS1NCN1hHNGdJSFpoY2lCcGJtWnZJRDBnWjJWMFJHVmpiR0Z5WVhScGIyNUZjbkp2Y2tGa1pHVnVaSFZ0S0NrN1hHNWNiaUFnYVdZZ0tDRnBibVp2S1NCN1hHNGdJQ0FnZG1GeUlIQmhjbVZ1ZEU1aGJXVWdQU0IwZVhCbGIyWWdjR0Z5Wlc1MFZIbHdaU0E5UFQwZ0ozTjBjbWx1WnljZ1B5QndZWEpsYm5SVWVYQmxJRG9nY0dGeVpXNTBWSGx3WlM1a2FYTndiR0Y1VG1GdFpTQjhmQ0J3WVhKbGJuUlVlWEJsTG01aGJXVTdYRzRnSUNBZ2FXWWdLSEJoY21WdWRFNWhiV1VwSUh0Y2JpQWdJQ0FnSUdsdVptOGdQU0FuSUVOb1pXTnJJSFJvWlNCMGIzQXRiR1YyWld3Z2NtVnVaR1Z5SUdOaGJHd2dkWE5wYm1jZ1BDY2dLeUJ3WVhKbGJuUk9ZVzFsSUNzZ0p6NHVKenRjYmlBZ0lDQjlYRzRnSUgxY2JpQWdjbVYwZFhKdUlHbHVabTg3WEc1OVhHNWNiaThxS2x4dUlDb2dWMkZ5YmlCcFppQjBhR1VnWld4bGJXVnVkQ0JrYjJWemJpZDBJR2hoZG1VZ1lXNGdaWGh3YkdsamFYUWdhMlY1SUdGemMybG5ibVZrSUhSdklHbDBMbHh1SUNvZ1ZHaHBjeUJsYkdWdFpXNTBJR2x6SUdsdUlHRnVJR0Z5Y21GNUxpQlVhR1VnWVhKeVlYa2dZMjkxYkdRZ1ozSnZkeUJoYm1RZ2MyaHlhVzVySUc5eUlHSmxYRzRnS2lCeVpXOXlaR1Z5WldRdUlFRnNiQ0JqYUdsc1pISmxiaUIwYUdGMElHaGhkbVZ1SjNRZ1lXeHlaV0ZrZVNCaVpXVnVJSFpoYkdsa1lYUmxaQ0JoY21VZ2NtVnhkV2x5WldRZ2RHOWNiaUFxSUdoaGRtVWdZU0JjSW10bGVWd2lJSEJ5YjNCbGNuUjVJR0Z6YzJsbmJtVmtJSFJ2SUdsMExpQkZjbkp2Y2lCemRHRjBkWE5sY3lCaGNtVWdZMkZqYUdWa0lITnZJR0VnZDJGeWJtbHVaMXh1SUNvZ2QybHNiQ0J2Ym14NUlHSmxJSE5vYjNkdUlHOXVZMlV1WEc0Z0tseHVJQ29nUUdsdWRHVnlibUZzWEc0Z0tpQkFjR0Z5WVcwZ2UxSmxZV04wUld4bGJXVnVkSDBnWld4bGJXVnVkQ0JGYkdWdFpXNTBJSFJvWVhRZ2NtVnhkV2x5WlhNZ1lTQnJaWGt1WEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJSEJoY21WdWRGUjVjR1VnWld4bGJXVnVkQ2R6SUhCaGNtVnVkQ2R6SUhSNWNHVXVYRzRnS2k5Y2JtWjFibU4wYVc5dUlIWmhiR2xrWVhSbFJYaHdiR2xqYVhSTFpYa29aV3hsYldWdWRDd2djR0Z5Wlc1MFZIbHdaU2tnZTF4dUlDQnBaaUFvSVdWc1pXMWxiblF1WDNOMGIzSmxJSHg4SUdWc1pXMWxiblF1WDNOMGIzSmxMblpoYkdsa1lYUmxaQ0I4ZkNCbGJHVnRaVzUwTG10bGVTQWhQU0J1ZFd4c0tTQjdYRzRnSUNBZ2NtVjBkWEp1TzF4dUlDQjlYRzRnSUdWc1pXMWxiblF1WDNOMGIzSmxMblpoYkdsa1lYUmxaQ0E5SUhSeWRXVTdYRzVjYmlBZ2RtRnlJRzFsYlc5cGVtVnlJRDBnYjNkdVpYSklZWE5MWlhsVmMyVlhZWEp1YVc1bkxuVnVhWEYxWlV0bGVTQjhmQ0FvYjNkdVpYSklZWE5MWlhsVmMyVlhZWEp1YVc1bkxuVnVhWEYxWlV0bGVTQTlJSHQ5S1R0Y2JseHVJQ0IyWVhJZ1kzVnljbVZ1ZEVOdmJYQnZibVZ1ZEVWeWNtOXlTVzVtYnlBOUlHZGxkRU4xY25KbGJuUkRiMjF3YjI1bGJuUkZjbkp2Y2tsdVptOG9jR0Z5Wlc1MFZIbHdaU2s3WEc0Z0lHbG1JQ2h0WlcxdmFYcGxjbHRqZFhKeVpXNTBRMjl0Y0c5dVpXNTBSWEp5YjNKSmJtWnZYU2tnZTF4dUlDQWdJSEpsZEhWeWJqdGNiaUFnZlZ4dUlDQnRaVzF2YVhwbGNsdGpkWEp5Wlc1MFEyOXRjRzl1Wlc1MFJYSnliM0pKYm1adlhTQTlJSFJ5ZFdVN1hHNWNiaUFnTHk4Z1ZYTjFZV3hzZVNCMGFHVWdZM1Z5Y21WdWRDQnZkMjVsY2lCcGN5QjBhR1VnYjJabVpXNWtaWElzSUdKMWRDQnBaaUJwZENCaFkyTmxjSFJ6SUdOb2FXeGtjbVZ1SUdGeklHRmNiaUFnTHk4Z2NISnZjR1Z5ZEhrc0lHbDBJRzFoZVNCaVpTQjBhR1VnWTNKbFlYUnZjaUJ2WmlCMGFHVWdZMmhwYkdRZ2RHaGhkQ2R6SUhKbGMzQnZibk5wWW14bElHWnZjbHh1SUNBdkx5QmhjM05wWjI1cGJtY2dhWFFnWVNCclpYa3VYRzRnSUhaaGNpQmphR2xzWkU5M2JtVnlJRDBnSnljN1hHNGdJR2xtSUNobGJHVnRaVzUwSUNZbUlHVnNaVzFsYm5RdVgyOTNibVZ5SUNZbUlHVnNaVzFsYm5RdVgyOTNibVZ5SUNFOVBTQlNaV0ZqZEVOMWNuSmxiblJQZDI1bGNpNWpkWEp5Wlc1MEtTQjdYRzRnSUNBZ0x5OGdSMmwyWlNCMGFHVWdZMjl0Y0c5dVpXNTBJSFJvWVhRZ2IzSnBaMmx1WVd4c2VTQmpjbVZoZEdWa0lIUm9hWE1nWTJocGJHUXVYRzRnSUNBZ1kyaHBiR1JQZDI1bGNpQTlJQ2NnU1hRZ2QyRnpJSEJoYzNObFpDQmhJR05vYVd4a0lHWnliMjBnSnlBcklHVnNaVzFsYm5RdVgyOTNibVZ5TG1kbGRFNWhiV1VvS1NBcklDY3VKenRjYmlBZ2ZWeHVYRzRnSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QjNZWEp1YVc1bktHWmhiSE5sTENBblJXRmphQ0JqYUdsc1pDQnBiaUJoYmlCaGNuSmhlU0J2Y2lCcGRHVnlZWFJ2Y2lCemFHOTFiR1FnYUdGMlpTQmhJSFZ1YVhGMVpTQmNJbXRsZVZ3aUlIQnliM0F1SnlBcklDY2xjeVZ6SUZObFpTQm9kSFJ3Y3pvdkwyWmlMbTFsTDNKbFlXTjBMWGRoY201cGJtY3RhMlY1Y3lCbWIzSWdiVzl5WlNCcGJtWnZjbTFoZEdsdmJpNGxjeWNzSUdOMWNuSmxiblJEYjIxd2IyNWxiblJGY25KdmNrbHVabThzSUdOb2FXeGtUM2R1WlhJc0lGSmxZV04wUTI5dGNHOXVaVzUwVkhKbFpVaHZiMnN1WjJWMFEzVnljbVZ1ZEZOMFlXTnJRV1JrWlc1a2RXMG9aV3hsYldWdWRDa3BJRG9nZG05cFpDQXdPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFVnVjM1Z5WlNCMGFHRjBJR1YyWlhKNUlHVnNaVzFsYm5RZ1pXbDBhR1Z5SUdseklIQmhjM05sWkNCcGJpQmhJSE4wWVhScFl5QnNiMk5oZEdsdmJpd2dhVzRnWVc1Y2JpQXFJR0Z5Y21GNUlIZHBkR2dnWVc0Z1pYaHdiR2xqYVhRZ2EyVjVjeUJ3Y205d1pYSjBlU0JrWldacGJtVmtMQ0J2Y2lCcGJpQmhiaUJ2WW1wbFkzUWdiR2wwWlhKaGJGeHVJQ29nZDJsMGFDQjJZV3hwWkNCclpYa2djSEp2Y0dWeWRIa3VYRzRnS2x4dUlDb2dRR2x1ZEdWeWJtRnNYRzRnS2lCQWNHRnlZVzBnZTFKbFlXTjBUbTlrWlgwZ2JtOWtaU0JUZEdGMGFXTmhiR3g1SUhCaGMzTmxaQ0JqYUdsc1pDQnZaaUJoYm5rZ2RIbHdaUzVjYmlBcUlFQndZWEpoYlNCN0tuMGdjR0Z5Wlc1MFZIbHdaU0J1YjJSbEozTWdjR0Z5Wlc1MEozTWdkSGx3WlM1Y2JpQXFMMXh1Wm5WdVkzUnBiMjRnZG1Gc2FXUmhkR1ZEYUdsc1pFdGxlWE1vYm05a1pTd2djR0Z5Wlc1MFZIbHdaU2tnZTF4dUlDQnBaaUFvZEhsd1pXOW1JRzV2WkdVZ0lUMDlJQ2R2WW1wbFkzUW5LU0I3WEc0Z0lDQWdjbVYwZFhKdU8xeHVJQ0I5WEc0Z0lHbG1JQ2hCY25KaGVTNXBjMEZ5Y21GNUtHNXZaR1VwS1NCN1hHNGdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUENCdWIyUmxMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCMllYSWdZMmhwYkdRZ1BTQnViMlJsVzJsZE8xeHVJQ0FnSUNBZ2FXWWdLRkpsWVdOMFJXeGxiV1Z1ZEM1cGMxWmhiR2xrUld4bGJXVnVkQ2hqYUdsc1pDa3BJSHRjYmlBZ0lDQWdJQ0FnZG1Gc2FXUmhkR1ZGZUhCc2FXTnBkRXRsZVNoamFHbHNaQ3dnY0dGeVpXNTBWSGx3WlNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlJR1ZzYzJVZ2FXWWdLRkpsWVdOMFJXeGxiV1Z1ZEM1cGMxWmhiR2xrUld4bGJXVnVkQ2h1YjJSbEtTa2dlMXh1SUNBZ0lDOHZJRlJvYVhNZ1pXeGxiV1Z1ZENCM1lYTWdjR0Z6YzJWa0lHbHVJR0VnZG1Gc2FXUWdiRzlqWVhScGIyNHVYRzRnSUNBZ2FXWWdLRzV2WkdVdVgzTjBiM0psS1NCN1hHNGdJQ0FnSUNCdWIyUmxMbDl6ZEc5eVpTNTJZV3hwWkdGMFpXUWdQU0IwY25WbE8xeHVJQ0FnSUgxY2JpQWdmU0JsYkhObElHbG1JQ2h1YjJSbEtTQjdYRzRnSUNBZ2RtRnlJR2wwWlhKaGRHOXlSbTRnUFNCblpYUkpkR1Z5WVhSdmNrWnVLRzV2WkdVcE8xeHVJQ0FnSUM4dklFVnVkSEo1SUdsMFpYSmhkRzl5Y3lCd2NtOTJhV1JsSUdsdGNHeHBZMmwwSUd0bGVYTXVYRzRnSUNBZ2FXWWdLR2wwWlhKaGRHOXlSbTRwSUh0Y2JpQWdJQ0FnSUdsbUlDaHBkR1Z5WVhSdmNrWnVJQ0U5UFNCdWIyUmxMbVZ1ZEhKcFpYTXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHbDBaWEpoZEc5eUlEMGdhWFJsY21GMGIzSkdiaTVqWVd4c0tHNXZaR1VwTzF4dUlDQWdJQ0FnSUNCMllYSWdjM1JsY0R0Y2JpQWdJQ0FnSUNBZ2QyaHBiR1VnS0NFb2MzUmxjQ0E5SUdsMFpYSmhkRzl5TG01bGVIUW9LU2t1Wkc5dVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDaFNaV0ZqZEVWc1pXMWxiblF1YVhOV1lXeHBaRVZzWlcxbGJuUW9jM1JsY0M1MllXeDFaU2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoYkdsa1lYUmxSWGh3YkdsamFYUkxaWGtvYzNSbGNDNTJZV3gxWlN3Z2NHRnlaVzUwVkhsd1pTazdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzU5WEc1Y2JpOHFLbHh1SUNvZ1IybDJaVzRnWVc0Z1pXeGxiV1Z1ZEN3Z2RtRnNhV1JoZEdVZ2RHaGhkQ0JwZEhNZ2NISnZjSE1nWm05c2JHOTNJSFJvWlNCd2NtOXdWSGx3WlhNZ1pHVm1hVzVwZEdsdmJpeGNiaUFxSUhCeWIzWnBaR1ZrSUdKNUlIUm9aU0IwZVhCbExseHVJQ3BjYmlBcUlFQndZWEpoYlNCN1VtVmhZM1JGYkdWdFpXNTBmU0JsYkdWdFpXNTBYRzRnS2k5Y2JtWjFibU4wYVc5dUlIWmhiR2xrWVhSbFVISnZjRlI1Y0dWektHVnNaVzFsYm5RcElIdGNiaUFnZG1GeUlHTnZiWEJ2Ym1WdWRFTnNZWE56SUQwZ1pXeGxiV1Z1ZEM1MGVYQmxPMXh1SUNCcFppQW9kSGx3Wlc5bUlHTnZiWEJ2Ym1WdWRFTnNZWE56SUNFOVBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdjbVYwZFhKdU8xeHVJQ0I5WEc0Z0lIWmhjaUJ1WVcxbElEMGdZMjl0Y0c5dVpXNTBRMnhoYzNNdVpHbHpjR3hoZVU1aGJXVWdmSHdnWTI5dGNHOXVaVzUwUTJ4aGMzTXVibUZ0WlR0Y2JpQWdhV1lnS0dOdmJYQnZibVZ1ZEVOc1lYTnpMbkJ5YjNCVWVYQmxjeWtnZTF4dUlDQWdJR05vWldOclVtVmhZM1JVZVhCbFUzQmxZeWhqYjIxd2IyNWxiblJEYkdGemN5NXdjbTl3Vkhsd1pYTXNJR1ZzWlcxbGJuUXVjSEp2Y0hNc0lGSmxZV04wVUhKdmNGUjVjR1ZNYjJOaGRHbHZibk11Y0hKdmNDd2dibUZ0WlN3Z1pXeGxiV1Z1ZEN3Z2JuVnNiQ2s3WEc0Z0lIMWNiaUFnYVdZZ0tIUjVjR1Z2WmlCamIyMXdiMjVsYm5SRGJHRnpjeTVuWlhSRVpXWmhkV3gwVUhKdmNITWdQVDA5SUNkbWRXNWpkR2x2YmljcElIdGNiaUFnSUNCd2NtOWpaWE56TG1WdWRpNU9UMFJGWDBWT1ZpQWhQVDBnSjNCeWIyUjFZM1JwYjI0bklEOGdkMkZ5Ym1sdVp5aGpiMjF3YjI1bGJuUkRiR0Z6Y3k1blpYUkVaV1poZFd4MFVISnZjSE11YVhOU1pXRmpkRU5zWVhOelFYQndjbTkyWldRc0lDZG5aWFJFWldaaGRXeDBVSEp2Y0hNZ2FYTWdiMjVzZVNCMWMyVmtJRzl1SUdOc1lYTnphV01nVW1WaFkzUXVZM0psWVhSbFEyeGhjM01nSnlBcklDZGtaV1pwYm1sMGFXOXVjeTRnVlhObElHRWdjM1JoZEdsaklIQnliM0JsY25SNUlHNWhiV1ZrSUdCa1pXWmhkV3gwVUhKdmNITmdJR2x1YzNSbFlXUXVKeWtnT2lCMmIybGtJREE3WEc0Z0lIMWNibjFjYmx4dWRtRnlJRkpsWVdOMFJXeGxiV1Z1ZEZaaGJHbGtZWFJ2Y2lBOUlIdGNibHh1SUNCamNtVmhkR1ZGYkdWdFpXNTBPaUJtZFc1amRHbHZiaUFvZEhsd1pTd2djSEp2Y0hNc0lHTm9hV3hrY21WdUtTQjdYRzRnSUNBZ2RtRnlJSFpoYkdsa1ZIbHdaU0E5SUhSNWNHVnZaaUIwZVhCbElEMDlQU0FuYzNSeWFXNW5KeUI4ZkNCMGVYQmxiMllnZEhsd1pTQTlQVDBnSjJaMWJtTjBhVzl1Snp0Y2JpQWdJQ0F2THlCWFpTQjNZWEp1SUdsdUlIUm9hWE1nWTJGelpTQmlkWFFnWkc5dUozUWdkR2h5YjNjdUlGZGxJR1Y0Y0dWamRDQjBhR1VnWld4bGJXVnVkQ0JqY21WaGRHbHZiaUIwYjF4dUlDQWdJQzh2SUhOMVkyTmxaV1FnWVc1a0lIUm9aWEpsSUhkcGJHd2diR2xyWld4NUlHSmxJR1Z5Y205eWN5QnBiaUJ5Wlc1a1pYSXVYRzRnSUNBZ2FXWWdLQ0YyWVd4cFpGUjVjR1VwSUh0Y2JpQWdJQ0FnSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QjNZWEp1YVc1bktHWmhiSE5sTENBblVtVmhZM1F1WTNKbFlYUmxSV3hsYldWdWREb2dkSGx3WlNCemFHOTFiR1FnYm05MElHSmxJRzUxYkd3c0lIVnVaR1ZtYVc1bFpDd2dZbTl2YkdWaGJpd2diM0lnSnlBcklDZHVkVzFpWlhJdUlFbDBJSE5vYjNWc1pDQmlaU0JoSUhOMGNtbHVaeUFvWm05eUlFUlBUU0JsYkdWdFpXNTBjeWtnYjNJZ1lTQlNaV0ZqZEVOc1lYTnpJQ2NnS3lBbktHWnZjaUJqYjIxd2IzTnBkR1VnWTI5dGNHOXVaVzUwY3lrdUpYTW5MQ0JuWlhSRVpXTnNZWEpoZEdsdmJrVnljbTl5UVdSa1pXNWtkVzBvS1NrZ09pQjJiMmxrSURBN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnZG1GeUlHVnNaVzFsYm5RZ1BTQlNaV0ZqZEVWc1pXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDNWhjSEJzZVNoMGFHbHpMQ0JoY21kMWJXVnVkSE1wTzF4dVhHNGdJQ0FnTHk4Z1ZHaGxJSEpsYzNWc2RDQmpZVzRnWW1VZ2JuVnNiR2x6YUNCcFppQmhJRzF2WTJzZ2IzSWdZU0JqZFhOMGIyMGdablZ1WTNScGIyNGdhWE1nZFhObFpDNWNiaUFnSUNBdkx5QlVUMFJQT2lCRWNtOXdJSFJvYVhNZ2QyaGxiaUIwYUdWelpTQmhjbVVnYm04Z2JHOXVaMlZ5SUdGc2JHOTNaV1FnWVhNZ2RHaGxJSFI1Y0dVZ1lYSm5kVzFsYm5RdVhHNGdJQ0FnYVdZZ0tHVnNaVzFsYm5RZ1BUMGdiblZzYkNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdWc1pXMWxiblE3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdMeThnVTJ0cGNDQnJaWGtnZDJGeWJtbHVaeUJwWmlCMGFHVWdkSGx3WlNCcGMyNG5kQ0IyWVd4cFpDQnphVzVqWlNCdmRYSWdhMlY1SUhaaGJHbGtZWFJwYjI0Z2JHOW5hV05jYmlBZ0lDQXZMeUJrYjJWemJpZDBJR1Y0Y0dWamRDQmhJRzV2YmkxemRISnBibWN2Wm5WdVkzUnBiMjRnZEhsd1pTQmhibVFnWTJGdUlIUm9jbTkzSUdOdmJtWjFjMmx1WnlCbGNuSnZjbk11WEc0Z0lDQWdMeThnVjJVZ1pHOXVKM1FnZDJGdWRDQmxlR05sY0hScGIyNGdZbVZvWVhacGIzSWdkRzhnWkdsbVptVnlJR0psZEhkbFpXNGdaR1YySUdGdVpDQndjbTlrTGx4dUlDQWdJQzh2SUNoU1pXNWtaWEpwYm1jZ2QybHNiQ0IwYUhKdmR5QjNhWFJvSUdFZ2FHVnNjR1oxYkNCdFpYTnpZV2RsSUdGdVpDQmhjeUJ6YjI5dUlHRnpJSFJvWlNCMGVYQmxJR2x6WEc0Z0lDQWdMeThnWm1sNFpXUXNJSFJvWlNCclpYa2dkMkZ5Ym1sdVozTWdkMmxzYkNCaGNIQmxZWEl1S1Z4dUlDQWdJR2xtSUNoMllXeHBaRlI1Y0dVcElIdGNiaUFnSUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F5T3lCcElEd2dZWEpuZFcxbGJuUnpMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lIWmhiR2xrWVhSbFEyaHBiR1JMWlhsektHRnlaM1Z0Wlc1MGMxdHBYU3dnZEhsd1pTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RtRnNhV1JoZEdWUWNtOXdWSGx3WlhNb1pXeGxiV1Z1ZENrN1hHNWNiaUFnSUNCeVpYUjFjbTRnWld4bGJXVnVkRHRjYmlBZ2ZTeGNibHh1SUNCamNtVmhkR1ZHWVdOMGIzSjVPaUJtZFc1amRHbHZiaUFvZEhsd1pTa2dlMXh1SUNBZ0lIWmhjaUIyWVd4cFpHRjBaV1JHWVdOMGIzSjVJRDBnVW1WaFkzUkZiR1Z0Wlc1MFZtRnNhV1JoZEc5eUxtTnlaV0YwWlVWc1pXMWxiblF1WW1sdVpDaHVkV3hzTENCMGVYQmxLVHRjYmlBZ0lDQXZMeUJNWldkaFkza2dhRzl2YXlCVVQwUlBPaUJYWVhKdUlHbG1JSFJvYVhNZ2FYTWdZV05qWlhOelpXUmNiaUFnSUNCMllXeHBaR0YwWldSR1lXTjBiM0o1TG5SNWNHVWdQU0IwZVhCbE8xeHVYRzRnSUNBZ2FXWWdLSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNwSUh0Y2JpQWdJQ0FnSUdsbUlDaGpZVzVFWldacGJtVlFjbTl3WlhKMGVTa2dlMXh1SUNBZ0lDQWdJQ0JQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb2RtRnNhV1JoZEdWa1JtRmpkRzl5ZVN3Z0ozUjVjR1VuTENCN1hHNGdJQ0FnSUNBZ0lDQWdaVzUxYldWeVlXSnNaVG9nWm1Gc2MyVXNYRzRnSUNBZ0lDQWdJQ0FnWjJWME9pQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQndjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5JRDhnZDJGeWJtbHVaeWhtWVd4elpTd2dKMFpoWTNSdmNua3VkSGx3WlNCcGN5QmtaWEJ5WldOaGRHVmtMaUJCWTJObGMzTWdkR2hsSUdOc1lYTnpJR1JwY21WamRHeDVJQ2NnS3lBblltVm1iM0psSUhCaGMzTnBibWNnYVhRZ2RHOGdZM0psWVhSbFJtRmpkRzl5ZVM0bktTQTZJSFp2YVdRZ01EdGNiaUFnSUNBZ0lDQWdJQ0FnSUU5aWFtVmpkQzVrWldacGJtVlFjbTl3WlhKMGVTaDBhR2x6TENBbmRIbHdaU2NzSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVTZJSFI1Y0dWY2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIUjVjR1U3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFIxY200Z2RtRnNhV1JoZEdWa1JtRmpkRzl5ZVR0Y2JpQWdmU3hjYmx4dUlDQmpiRzl1WlVWc1pXMWxiblE2SUdaMWJtTjBhVzl1SUNobGJHVnRaVzUwTENCd2NtOXdjeXdnWTJocGJHUnlaVzRwSUh0Y2JpQWdJQ0IyWVhJZ2JtVjNSV3hsYldWdWRDQTlJRkpsWVdOMFJXeGxiV1Z1ZEM1amJHOXVaVVZzWlcxbGJuUXVZWEJ3Ykhrb2RHaHBjeXdnWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01qc2dhU0E4SUdGeVozVnRaVzUwY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdkbUZzYVdSaGRHVkRhR2xzWkV0bGVYTW9ZWEpuZFcxbGJuUnpXMmxkTENCdVpYZEZiR1Z0Wlc1MExuUjVjR1VwTzF4dUlDQWdJSDFjYmlBZ0lDQjJZV3hwWkdGMFpWQnliM0JVZVhCbGN5aHVaWGRGYkdWdFpXNTBLVHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNSV3hsYldWdWREdGNiaUFnZlZ4dVhHNTlPMXh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeUE5SUZKbFlXTjBSV3hsYldWdWRGWmhiR2xrWVhSdmNqc2lYWDA9IiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBSZWFjdE5vb3BVcGRhdGVRdWV1ZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGVkIG9yIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY29uc3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlc1xuICAgKiBoYXZlIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUNhbGxiYWNrOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrKSB7fSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5U1pXRmpkRTV2YjNCVmNHUmhkR1ZSZFdWMVpTNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPMEZCUVVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaXBjYmlBcUlFTnZjSGx5YVdkb2RDQXlNREUxTFhCeVpYTmxiblFzSUVaaFkyVmliMjlyTENCSmJtTXVYRzRnS2lCQmJHd2djbWxuYUhSeklISmxjMlZ5ZG1Wa0xseHVJQ3BjYmlBcUlGUm9hWE1nYzI5MWNtTmxJR052WkdVZ2FYTWdiR2xqWlc1elpXUWdkVzVrWlhJZ2RHaGxJRUpUUkMxemRIbHNaU0JzYVdObGJuTmxJR1p2ZFc1a0lHbHVJSFJvWlZ4dUlDb2dURWxEUlU1VFJTQm1hV3hsSUdsdUlIUm9aU0J5YjI5MElHUnBjbVZqZEc5eWVTQnZaaUIwYUdseklITnZkWEpqWlNCMGNtVmxMaUJCYmlCaFpHUnBkR2x2Ym1Gc0lHZHlZVzUwWEc0Z0tpQnZaaUJ3WVhSbGJuUWdjbWxuYUhSeklHTmhiaUJpWlNCbWIzVnVaQ0JwYmlCMGFHVWdVRUZVUlU1VVV5Qm1hV3hsSUdsdUlIUm9aU0J6WVcxbElHUnBjbVZqZEc5eWVTNWNiaUFxWEc0Z0tpQkFjSEp2ZG1sa1pYTk5iMlIxYkdVZ1VtVmhZM1JPYjI5d1ZYQmtZWFJsVVhWbGRXVmNiaUFxTDF4dVhHNG5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JuWmhjaUIzWVhKdWFXNW5JRDBnY21WeGRXbHlaU2duWm1KcWN5OXNhV0l2ZDJGeWJtbHVaeWNwTzF4dVhHNW1kVzVqZEdsdmJpQjNZWEp1VG05dmNDaHdkV0pzYVdOSmJuTjBZVzVqWlN3Z1kyRnNiR1Z5VG1GdFpTa2dlMXh1SUNCcFppQW9jSEp2WTJWemN5NWxibll1VGs5RVJWOUZUbFlnSVQwOUlDZHdjbTlrZFdOMGFXOXVKeWtnZTF4dUlDQWdJSFpoY2lCamIyNXpkSEoxWTNSdmNpQTlJSEIxWW14cFkwbHVjM1JoYm1ObExtTnZibk4wY25WamRHOXlPMXh1SUNBZ0lIQnliMk5sYzNNdVpXNTJMazVQUkVWZlJVNVdJQ0U5UFNBbmNISnZaSFZqZEdsdmJpY2dQeUIzWVhKdWFXNW5LR1poYkhObExDQW5KWE1vTGk0dUtUb2dRMkZ1SUc5dWJIa2dkWEJrWVhSbElHRWdiVzkxYm5SbFpDQnZjaUJ0YjNWdWRHbHVaeUJqYjIxd2IyNWxiblF1SUNjZ0t5QW5WR2hwY3lCMWMzVmhiR3g1SUcxbFlXNXpJSGx2ZFNCallXeHNaV1FnSlhNb0tTQnZiaUJoYmlCMWJtMXZkVzUwWldRZ1kyOXRjRzl1Wlc1MExpQW5JQ3NnSjFSb2FYTWdhWE1nWVNCdWJ5MXZjQzRnVUd4bFlYTmxJR05vWldOcklIUm9aU0JqYjJSbElHWnZjaUIwYUdVZ0pYTWdZMjl0Y0c5dVpXNTBMaWNzSUdOaGJHeGxjazVoYldVc0lHTmhiR3hsY2s1aGJXVXNJR052Ym5OMGNuVmpkRzl5SUNZbUlDaGpiMjV6ZEhKMVkzUnZjaTVrYVhOd2JHRjVUbUZ0WlNCOGZDQmpiMjV6ZEhKMVkzUnZjaTV1WVcxbEtTQjhmQ0FuVW1WaFkzUkRiR0Z6Y3ljcElEb2dkbTlwWkNBd08xeHVJQ0I5WEc1OVhHNWNiaThxS2x4dUlDb2dWR2hwY3lCcGN5QjBhR1VnWVdKemRISmhZM1FnUVZCSklHWnZjaUJoYmlCMWNHUmhkR1VnY1hWbGRXVXVYRzRnS2k5Y2JuWmhjaUJTWldGamRFNXZiM0JWY0dSaGRHVlJkV1YxWlNBOUlIdGNibHh1SUNBdktpcGNiaUFnSUNvZ1EyaGxZMnR6SUhkb1pYUm9aWElnYjNJZ2JtOTBJSFJvYVhNZ1kyOXRjRzl6YVhSbElHTnZiWEJ2Ym1WdWRDQnBjeUJ0YjNWdWRHVmtMbHh1SUNBZ0tpQkFjR0Z5WVcwZ2UxSmxZV04wUTJ4aGMzTjlJSEIxWW14cFkwbHVjM1JoYm1ObElGUm9aU0JwYm5OMFlXNWpaU0IzWlNCM1lXNTBJSFJ2SUhSbGMzUXVYRzRnSUNBcUlFQnlaWFIxY200Z2UySnZiMnhsWVc1OUlGUnlkV1VnYVdZZ2JXOTFiblJsWkN3Z1ptRnNjMlVnYjNSb1pYSjNhWE5sTGx4dUlDQWdLaUJBY0hKdmRHVmpkR1ZrWEc0Z0lDQXFJRUJtYVc1aGJGeHVJQ0FnS2k5Y2JpQWdhWE5OYjNWdWRHVmtPaUJtZFc1amRHbHZiaUFvY0hWaWJHbGpTVzV6ZEdGdVkyVXBJSHRjYmlBZ0lDQnlaWFIxY200Z1ptRnNjMlU3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVnVjWFZsZFdVZ1lTQmpZV3hzWW1GamF5QjBhR0YwSUhkcGJHd2dZbVVnWlhobFkzVjBaV1FnWVdaMFpYSWdZV3hzSUhSb1pTQndaVzVrYVc1bklIVndaR0YwWlhOY2JpQWdJQ29nYUdGMlpTQndjbTlqWlhOelpXUXVYRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3VW1WaFkzUkRiR0Z6YzMwZ2NIVmliR2xqU1c1emRHRnVZMlVnVkdobElHbHVjM1JoYm1ObElIUnZJSFZ6WlNCaGN5QmdkR2hwYzJBZ1kyOXVkR1Y0ZEM1Y2JpQWdJQ29nUUhCaGNtRnRJSHMvWm5WdVkzUnBiMjU5SUdOaGJHeGlZV05ySUVOaGJHeGxaQ0JoWm5SbGNpQnpkR0YwWlNCcGN5QjFjR1JoZEdWa0xseHVJQ0FnS2lCQWFXNTBaWEp1WVd4Y2JpQWdJQ292WEc0Z0lHVnVjWFZsZFdWRFlXeHNZbUZqYXpvZ1puVnVZM1JwYjI0Z0tIQjFZbXhwWTBsdWMzUmhibU5sTENCallXeHNZbUZqYXlrZ2UzMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFWnZjbU5sY3lCaGJpQjFjR1JoZEdVdUlGUm9hWE1nYzJodmRXeGtJRzl1YkhrZ1ltVWdhVzUyYjJ0bFpDQjNhR1Z1SUdsMElHbHpJR3R1YjNkdUlIZHBkR2hjYmlBZ0lDb2dZMlZ5ZEdGcGJuUjVJSFJvWVhRZ2QyVWdZWEpsSUNvcWJtOTBLaW9nYVc0Z1lTQkVUMDBnZEhKaGJuTmhZM1JwYjI0dVhHNGdJQ0FxWEc0Z0lDQXFJRmx2ZFNCdFlYa2dkMkZ1ZENCMGJ5QmpZV3hzSUhSb2FYTWdkMmhsYmlCNWIzVWdhMjV2ZHlCMGFHRjBJSE52YldVZ1pHVmxjR1Z5SUdGemNHVmpkQ0J2WmlCMGFHVmNiaUFnSUNvZ1kyOXRjRzl1Wlc1MEozTWdjM1JoZEdVZ2FHRnpJR05vWVc1blpXUWdZblYwSUdCelpYUlRkR0YwWldBZ2QyRnpJRzV2ZENCallXeHNaV1F1WEc0Z0lDQXFYRzRnSUNBcUlGUm9hWE1nZDJsc2JDQnViM1FnYVc1MmIydGxJR0J6YUc5MWJHUkRiMjF3YjI1bGJuUlZjR1JoZEdWZ0xDQmlkWFFnYVhRZ2QybHNiQ0JwYm5admEyVmNiaUFnSUNvZ1lHTnZiWEJ2Ym1WdWRGZHBiR3hWY0dSaGRHVmdJR0Z1WkNCZ1kyOXRjRzl1Wlc1MFJHbGtWWEJrWVhSbFlDNWNiaUFnSUNwY2JpQWdJQ29nUUhCaGNtRnRJSHRTWldGamRFTnNZWE56ZlNCd2RXSnNhV05KYm5OMFlXNWpaU0JVYUdVZ2FXNXpkR0Z1WTJVZ2RHaGhkQ0J6YUc5MWJHUWdjbVZ5Wlc1a1pYSXVYRzRnSUNBcUlFQnBiblJsY201aGJGeHVJQ0FnS2k5Y2JpQWdaVzV4ZFdWMVpVWnZjbU5sVlhCa1lYUmxPaUJtZFc1amRHbHZiaUFvY0hWaWJHbGpTVzV6ZEdGdVkyVXBJSHRjYmlBZ0lDQjNZWEp1VG05dmNDaHdkV0pzYVdOSmJuTjBZVzVqWlN3Z0oyWnZjbU5sVlhCa1lYUmxKeWs3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlGSmxjR3hoWTJWeklHRnNiQ0J2WmlCMGFHVWdjM1JoZEdVdUlFRnNkMkY1Y3lCMWMyVWdkR2hwY3lCdmNpQmdjMlYwVTNSaGRHVmdJSFJ2SUcxMWRHRjBaU0J6ZEdGMFpTNWNiaUFnSUNvZ1dXOTFJSE5vYjNWc1pDQjBjbVZoZENCZ2RHaHBjeTV6ZEdGMFpXQWdZWE1nYVcxdGRYUmhZbXhsTGx4dUlDQWdLbHh1SUNBZ0tpQlVhR1Z5WlNCcGN5QnVieUJuZFdGeVlXNTBaV1VnZEdoaGRDQmdkR2hwY3k1emRHRjBaV0FnZDJsc2JDQmlaU0JwYlcxbFpHbGhkR1ZzZVNCMWNHUmhkR1ZrTENCemIxeHVJQ0FnS2lCaFkyTmxjM05wYm1jZ1lIUm9hWE11YzNSaGRHVmdJR0ZtZEdWeUlHTmhiR3hwYm1jZ2RHaHBjeUJ0WlhSb2IyUWdiV0Y1SUhKbGRIVnliaUIwYUdVZ2IyeGtJSFpoYkhWbExseHVJQ0FnS2x4dUlDQWdLaUJBY0dGeVlXMGdlMUpsWVdOMFEyeGhjM045SUhCMVlteHBZMGx1YzNSaGJtTmxJRlJvWlNCcGJuTjBZVzVqWlNCMGFHRjBJSE5vYjNWc1pDQnlaWEpsYm1SbGNpNWNiaUFnSUNvZ1FIQmhjbUZ0SUh0dlltcGxZM1I5SUdOdmJYQnNaWFJsVTNSaGRHVWdUbVY0ZENCemRHRjBaUzVjYmlBZ0lDb2dRR2x1ZEdWeWJtRnNYRzRnSUNBcUwxeHVJQ0JsYm5GMVpYVmxVbVZ3YkdGalpWTjBZWFJsT2lCbWRXNWpkR2x2YmlBb2NIVmliR2xqU1c1emRHRnVZMlVzSUdOdmJYQnNaWFJsVTNSaGRHVXBJSHRjYmlBZ0lDQjNZWEp1VG05dmNDaHdkV0pzYVdOSmJuTjBZVzVqWlN3Z0ozSmxjR3hoWTJWVGRHRjBaU2NwTzF4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlRaWFJ6SUdFZ2MzVmljMlYwSUc5bUlIUm9aU0J6ZEdGMFpTNGdWR2hwY3lCdmJteDVJR1Y0YVhOMGN5QmlaV05oZFhObElGOXdaVzVrYVc1blUzUmhkR1VnYVhOY2JpQWdJQ29nYVc1MFpYSnVZV3d1SUZSb2FYTWdjSEp2ZG1sa1pYTWdZU0J0WlhKbmFXNW5JSE4wY21GMFpXZDVJSFJvWVhRZ2FYTWdibTkwSUdGMllXbHNZV0pzWlNCMGJ5QmtaV1Z3WEc0Z0lDQXFJSEJ5YjNCbGNuUnBaWE1nZDJocFkyZ2dhWE1nWTI5dVpuVnphVzVuTGlCVVQwUlBPaUJGZUhCdmMyVWdjR1Z1WkdsdVoxTjBZWFJsSUc5eUlHUnZiaWQwSUhWelpTQnBkRnh1SUNBZ0tpQmtkWEpwYm1jZ2RHaGxJRzFsY21kbExseHVJQ0FnS2x4dUlDQWdLaUJBY0dGeVlXMGdlMUpsWVdOMFEyeGhjM045SUhCMVlteHBZMGx1YzNSaGJtTmxJRlJvWlNCcGJuTjBZVzVqWlNCMGFHRjBJSE5vYjNWc1pDQnlaWEpsYm1SbGNpNWNiaUFnSUNvZ1FIQmhjbUZ0SUh0dlltcGxZM1I5SUhCaGNuUnBZV3hUZEdGMFpTQk9aWGgwSUhCaGNuUnBZV3dnYzNSaGRHVWdkRzhnWW1VZ2JXVnlaMlZrSUhkcGRHZ2djM1JoZEdVdVhHNGdJQ0FxSUVCcGJuUmxjbTVoYkZ4dUlDQWdLaTljYmlBZ1pXNXhkV1YxWlZObGRGTjBZWFJsT2lCbWRXNWpkR2x2YmlBb2NIVmliR2xqU1c1emRHRnVZMlVzSUhCaGNuUnBZV3hUZEdGMFpTa2dlMXh1SUNBZ0lIZGhjbTVPYjI5d0tIQjFZbXhwWTBsdWMzUmhibU5sTENBbmMyVjBVM1JoZEdVbktUdGNiaUFnZlZ4dWZUdGNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JTWldGamRFNXZiM0JWY0dSaGRHVlJkV1YxWlRzaVhYMD0iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzO1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5U1pXRmpkRkJ5YjNCVWVYQmxURzlqWVhScGIyNU9ZVzFsY3k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUVOdmNIbHlhV2RvZENBeU1ERXpMWEJ5WlhObGJuUXNJRVpoWTJWaWIyOXJMQ0JKYm1NdVhHNGdLaUJCYkd3Z2NtbG5hSFJ6SUhKbGMyVnlkbVZrTGx4dUlDcGNiaUFxSUZSb2FYTWdjMjkxY21ObElHTnZaR1VnYVhNZ2JHbGpaVzV6WldRZ2RXNWtaWElnZEdobElFSlRSQzF6ZEhsc1pTQnNhV05sYm5ObElHWnZkVzVrSUdsdUlIUm9aVnh1SUNvZ1RFbERSVTVUUlNCbWFXeGxJR2x1SUhSb1pTQnliMjkwSUdScGNtVmpkRzl5ZVNCdlppQjBhR2x6SUhOdmRYSmpaU0IwY21WbExpQkJiaUJoWkdScGRHbHZibUZzSUdkeVlXNTBYRzRnS2lCdlppQndZWFJsYm5RZ2NtbG5hSFJ6SUdOaGJpQmlaU0JtYjNWdVpDQnBiaUIwYUdVZ1VFRlVSVTVVVXlCbWFXeGxJR2x1SUhSb1pTQnpZVzFsSUdScGNtVmpkRzl5ZVM1Y2JpQXFYRzRnS2lCQWNISnZkbWxrWlhOTmIyUjFiR1VnVW1WaFkzUlFjbTl3Vkhsd1pVeHZZMkYwYVc5dVRtRnRaWE5jYmlBcUwxeHVYRzRuZFhObElITjBjbWxqZENjN1hHNWNiblpoY2lCU1pXRmpkRkJ5YjNCVWVYQmxURzlqWVhScGIyNU9ZVzFsY3lBOUlIdDlPMXh1WEc1cFppQW9jSEp2WTJWemN5NWxibll1VGs5RVJWOUZUbFlnSVQwOUlDZHdjbTlrZFdOMGFXOXVKeWtnZTF4dUlDQlNaV0ZqZEZCeWIzQlVlWEJsVEc5allYUnBiMjVPWVcxbGN5QTlJSHRjYmlBZ0lDQndjbTl3T2lBbmNISnZjQ2NzWEc0Z0lDQWdZMjl1ZEdWNGREb2dKMk52Ym5SbGVIUW5MRnh1SUNBZ0lHTm9hV3hrUTI5dWRHVjRkRG9nSjJOb2FXeGtJR052Ym5SbGVIUW5YRzRnSUgwN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnVW1WaFkzUlFjbTl3Vkhsd1pVeHZZMkYwYVc5dVRtRnRaWE03SWwxOSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBSZWFjdFByb3BUeXBlTG9jYXRpb25zXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIga2V5TWlycm9yID0gcmVxdWlyZSgnZmJqcy9saWIva2V5TWlycm9yJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25zID0ga2V5TWlycm9yKHtcbiAgcHJvcDogbnVsbCxcbiAgY29udGV4dDogbnVsbCxcbiAgY2hpbGRDb250ZXh0OiBudWxsXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25zOyIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUmVhY3RQcm9wVHlwZXNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcycpO1xudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAqXG4gKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gKiAgICAgcHJvcFR5cGVzOiB7XG4gKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICpcbiAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAqXG4gKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAqICAgICB9LFxuICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gKiAgIH0pO1xuICpcbiAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAqXG4gKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICpcbiAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgIHByb3BUeXBlczoge1xuICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICogICAgICAgICAgKTtcbiAqICAgICAgICB9XG4gKiAgICAgIH1cbiAqICAgIH0sXG4gKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAqICB9KTtcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG52YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXJcbn07XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbi8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoeCA9PT0geSkge1xuICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbi8qKlxuICogV2UgdXNlIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2FsbFxuICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciB3ZSBkb24ndCB1c2UgcmVhbFxuICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhhdCBtYXRjaGVkLlxuICovXG5mdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5zdGFjayA9ICcnO1xufVxuLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgaWYgKCFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0pIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgKyAnZnVuY3Rpb24gZm9yIHRoZSBgJXNgIHByb3Agb24gYCVzYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgKyAnYW5kIHdpbGwgbm90IHdvcmsgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi4gWW91IG1heSBiZSAnICsgJ3NlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzIGxpYnJhcnkuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzIGZvciBkZXRhaWxzLicsIHByb3BGdWxsTmFtZSwgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7XG4gICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1JlcXVpcmVkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agd2FzIG5vdCBzcGVjaWZpZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJucyhudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgIH1cbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICBpZiAoIVJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb25OYW1lICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSArICdgLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzKHByb3BWYWx1ZSwgZXhwZWN0ZWRWYWx1ZXNbaV0pKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzKTtcbiAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uTmFtZSArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgfVxuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5T2ZUeXBlQ2hlY2tlcnMpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAoY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbk5hbWUgKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gIC8vIE5hdGl2ZSBTeW1ib2wuXG4gIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbmZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgcmV0dXJuICdhcnJheSc7XG4gIH1cbiAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICByZXR1cm4gJ29iamVjdCc7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgcmV0dXJuICdzeW1ib2wnO1xuICB9XG4gIHJldHVybiBwcm9wVHlwZTtcbn1cblxuLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG5mdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gJ2RhdGUnO1xuICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9wVHlwZTtcbn1cblxuLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbmZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgfVxuICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXM7XG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklteHBZaTlTWldGamRGQnliM0JVZVhCbGN5NXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPMEZCUVVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9xWEc0Z0tpQkRiM0I1Y21sbmFIUWdNakF4TXkxd2NtVnpaVzUwTENCR1lXTmxZbTl2YXl3Z1NXNWpMbHh1SUNvZ1FXeHNJSEpwWjJoMGN5QnlaWE5sY25abFpDNWNiaUFxWEc0Z0tpQlVhR2x6SUhOdmRYSmpaU0JqYjJSbElHbHpJR3hwWTJWdWMyVmtJSFZ1WkdWeUlIUm9aU0JDVTBRdGMzUjViR1VnYkdsalpXNXpaU0JtYjNWdVpDQnBiaUIwYUdWY2JpQXFJRXhKUTBWT1UwVWdabWxzWlNCcGJpQjBhR1VnY205dmRDQmthWEpsWTNSdmNua2diMllnZEdocGN5QnpiM1Z5WTJVZ2RISmxaUzRnUVc0Z1lXUmthWFJwYjI1aGJDQm5jbUZ1ZEZ4dUlDb2diMllnY0dGMFpXNTBJSEpwWjJoMGN5QmpZVzRnWW1VZ1ptOTFibVFnYVc0Z2RHaGxJRkJCVkVWT1ZGTWdabWxzWlNCcGJpQjBhR1VnYzJGdFpTQmthWEpsWTNSdmNua3VYRzRnS2x4dUlDb2dRSEJ5YjNacFpHVnpUVzlrZFd4bElGSmxZV04wVUhKdmNGUjVjR1Z6WEc0Z0tpOWNibHh1SjNWelpTQnpkSEpwWTNRbk8xeHVYRzUyWVhJZ1VtVmhZM1JGYkdWdFpXNTBJRDBnY21WeGRXbHlaU2duTGk5U1pXRmpkRVZzWlcxbGJuUW5LVHRjYm5aaGNpQlNaV0ZqZEZCeWIzQlVlWEJsVEc5allYUnBiMjVPWVcxbGN5QTlJSEpsY1hWcGNtVW9KeTR2VW1WaFkzUlFjbTl3Vkhsd1pVeHZZMkYwYVc5dVRtRnRaWE1uS1R0Y2JuWmhjaUJTWldGamRGQnliM0JVZVhCbGMxTmxZM0psZENBOUlISmxjWFZwY21Vb0p5NHZVbVZoWTNSUWNtOXdWSGx3WlhOVFpXTnlaWFFuS1R0Y2JseHVkbUZ5SUdWdGNIUjVSblZ1WTNScGIyNGdQU0J5WlhGMWFYSmxLQ2RtWW1wekwyeHBZaTlsYlhCMGVVWjFibU4wYVc5dUp5azdYRzUyWVhJZ1oyVjBTWFJsY21GMGIzSkdiaUE5SUhKbGNYVnBjbVVvSnk0dloyVjBTWFJsY21GMGIzSkdiaWNwTzF4dWRtRnlJSGRoY201cGJtY2dQU0J5WlhGMWFYSmxLQ2RtWW1wekwyeHBZaTkzWVhKdWFXNW5KeWs3WEc1Y2JpOHFLbHh1SUNvZ1EyOXNiR1ZqZEdsdmJpQnZaaUJ0WlhSb2IyUnpJSFJvWVhRZ1lXeHNiM2NnWkdWamJHRnlZWFJwYjI0Z1lXNWtJSFpoYkdsa1lYUnBiMjRnYjJZZ2NISnZjSE1nZEdoaGRDQmhjbVZjYmlBcUlITjFjSEJzYVdWa0lIUnZJRkpsWVdOMElHTnZiWEJ2Ym1WdWRITXVJRVY0WVcxd2JHVWdkWE5oWjJVNlhHNGdLbHh1SUNvZ0lDQjJZWElnVUhKdmNITWdQU0J5WlhGMWFYSmxLQ2RTWldGamRGQnliM0JVZVhCbGN5Y3BPMXh1SUNvZ0lDQjJZWElnVFhsQmNuUnBZMnhsSUQwZ1VtVmhZM1F1WTNKbFlYUmxRMnhoYzNNb2UxeHVJQ29nSUNBZ0lIQnliM0JVZVhCbGN6b2dlMXh1SUNvZ0lDQWdJQ0FnTHk4Z1FXNGdiM0IwYVc5dVlXd2djM1J5YVc1bklIQnliM0FnYm1GdFpXUWdYQ0prWlhOamNtbHdkR2x2Ymx3aUxseHVJQ29nSUNBZ0lDQWdaR1Z6WTNKcGNIUnBiMjQ2SUZCeWIzQnpMbk4wY21sdVp5eGNiaUFxWEc0Z0tpQWdJQ0FnSUNBdkx5QkJJSEpsY1hWcGNtVmtJR1Z1ZFcwZ2NISnZjQ0J1WVcxbFpDQmNJbU5oZEdWbmIzSjVYQ0l1WEc0Z0tpQWdJQ0FnSUNCallYUmxaMjl5ZVRvZ1VISnZjSE11YjI1bFQyWW9XeWRPWlhkekp5d25VR2h2ZEc5ekoxMHBMbWx6VW1WeGRXbHlaV1FzWEc0Z0tseHVJQ29nSUNBZ0lDQWdMeThnUVNCd2NtOXdJRzVoYldWa0lGd2laR2xoYkc5blhDSWdkR2hoZENCeVpYRjFhWEpsY3lCaGJpQnBibk4wWVc1alpTQnZaaUJFYVdGc2IyY3VYRzRnS2lBZ0lDQWdJQ0JrYVdGc2IyYzZJRkJ5YjNCekxtbHVjM1JoYm1ObFQyWW9SR2xoYkc5bktTNXBjMUpsY1hWcGNtVmtYRzRnS2lBZ0lDQWdmU3hjYmlBcUlDQWdJQ0J5Wlc1a1pYSTZJR1oxYm1OMGFXOXVLQ2tnZXlBdUxpNGdmVnh1SUNvZ0lDQjlLVHRjYmlBcVhHNGdLaUJCSUcxdmNtVWdabTl5YldGc0lITndaV05wWm1sallYUnBiMjRnYjJZZ2FHOTNJSFJvWlhObElHMWxkR2h2WkhNZ1lYSmxJSFZ6WldRNlhHNGdLbHh1SUNvZ0lDQjBlWEJsSURvOUlHRnljbUY1ZkdKdmIyeDhablZ1WTN4dlltcGxZM1I4Ym5WdFltVnlmSE4wY21sdVozeHZibVZQWmloYkxpNHVYU2w4YVc1emRHRnVZMlZQWmlndUxpNHBYRzRnS2lBZ0lHUmxZMndnT2owZ1VtVmhZM1JRY205d1ZIbHdaWE11ZTNSNWNHVjlLQzVwYzFKbGNYVnBjbVZrS1Q5Y2JpQXFYRzRnS2lCRllXTm9JR0Z1WkNCbGRtVnllU0JrWldOc1lYSmhkR2x2YmlCd2NtOWtkV05sY3lCaElHWjFibU4wYVc5dUlIZHBkR2dnZEdobElITmhiV1VnYzJsbmJtRjBkWEpsTGlCVWFHbHpYRzRnS2lCaGJHeHZkM01nZEdobElHTnlaV0YwYVc5dUlHOW1JR04xYzNSdmJTQjJZV3hwWkdGMGFXOXVJR1oxYm1OMGFXOXVjeTRnUm05eUlHVjRZVzF3YkdVNlhHNGdLbHh1SUNvZ0lIWmhjaUJOZVV4cGJtc2dQU0JTWldGamRDNWpjbVZoZEdWRGJHRnpjeWg3WEc0Z0tpQWdJQ0J3Y205d1ZIbHdaWE02SUh0Y2JpQXFJQ0FnSUNBZ0x5OGdRVzRnYjNCMGFXOXVZV3dnYzNSeWFXNW5JRzl5SUZWU1NTQndjbTl3SUc1aGJXVmtJRndpYUhKbFpsd2lMbHh1SUNvZ0lDQWdJQ0JvY21WbU9pQm1kVzVqZEdsdmJpaHdjbTl3Y3l3Z2NISnZjRTVoYldVc0lHTnZiWEJ2Ym1WdWRFNWhiV1VwSUh0Y2JpQXFJQ0FnSUNBZ0lDQjJZWElnY0hKdmNGWmhiSFZsSUQwZ2NISnZjSE5iY0hKdmNFNWhiV1ZkTzF4dUlDb2dJQ0FnSUNBZ0lHbG1JQ2h3Y205d1ZtRnNkV1VnSVQwZ2JuVnNiQ0FtSmlCMGVYQmxiMllnY0hKdmNGWmhiSFZsSUNFOVBTQW5jM1J5YVc1bkp5QW1KbHh1SUNvZ0lDQWdJQ0FnSUNBZ0lDQWhLSEJ5YjNCV1lXeDFaU0JwYm5OMFlXNWpaVzltSUZWU1NTa3BJSHRjYmlBcUlDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdVpYY2dSWEp5YjNJb1hHNGdLaUFnSUNBZ0lDQWdJQ0FnSUNkRmVIQmxZM1JsWkNCaElITjBjbWx1WnlCdmNpQmhiaUJWVWtrZ1ptOXlJQ2NnS3lCd2NtOXdUbUZ0WlNBcklDY2dhVzRnSnlBclhHNGdLaUFnSUNBZ0lDQWdJQ0FnSUdOdmJYQnZibVZ1ZEU1aGJXVmNiaUFxSUNBZ0lDQWdJQ0FnSUNrN1hHNGdLaUFnSUNBZ0lDQWdmVnh1SUNvZ0lDQWdJQ0I5WEc0Z0tpQWdJQ0I5TEZ4dUlDb2dJQ0FnY21WdVpHVnlPaUJtZFc1amRHbHZiaWdwSUhzdUxpNTlYRzRnS2lBZ2ZTazdYRzRnS2x4dUlDb2dRR2x1ZEdWeWJtRnNYRzRnS2k5Y2JseHVkbUZ5SUVGT1QwNVpUVTlWVXlBOUlDYzhQR0Z1YjI1NWJXOTFjejQrSnp0Y2JseHVkbUZ5SUZKbFlXTjBVSEp2Y0ZSNWNHVnpJRDBnZTF4dUlDQmhjbkpoZVRvZ1kzSmxZWFJsVUhKcGJXbDBhWFpsVkhsd1pVTm9aV05yWlhJb0oyRnljbUY1Snlrc1hHNGdJR0p2YjJ3NklHTnlaV0YwWlZCeWFXMXBkR2wyWlZSNWNHVkRhR1ZqYTJWeUtDZGliMjlzWldGdUp5a3NYRzRnSUdaMWJtTTZJR055WldGMFpWQnlhVzFwZEdsMlpWUjVjR1ZEYUdWamEyVnlLQ2RtZFc1amRHbHZiaWNwTEZ4dUlDQnVkVzFpWlhJNklHTnlaV0YwWlZCeWFXMXBkR2wyWlZSNWNHVkRhR1ZqYTJWeUtDZHVkVzFpWlhJbktTeGNiaUFnYjJKcVpXTjBPaUJqY21WaGRHVlFjbWx0YVhScGRtVlVlWEJsUTJobFkydGxjaWduYjJKcVpXTjBKeWtzWEc0Z0lITjBjbWx1WnpvZ1kzSmxZWFJsVUhKcGJXbDBhWFpsVkhsd1pVTm9aV05yWlhJb0ozTjBjbWx1WnljcExGeHVJQ0J6ZVcxaWIydzZJR055WldGMFpWQnlhVzFwZEdsMlpWUjVjR1ZEYUdWamEyVnlLQ2R6ZVcxaWIyd25LU3hjYmx4dUlDQmhibms2SUdOeVpXRjBaVUZ1ZVZSNWNHVkRhR1ZqYTJWeUtDa3NYRzRnSUdGeWNtRjVUMlk2SUdOeVpXRjBaVUZ5Y21GNVQyWlVlWEJsUTJobFkydGxjaXhjYmlBZ1pXeGxiV1Z1ZERvZ1kzSmxZWFJsUld4bGJXVnVkRlI1Y0dWRGFHVmphMlZ5S0Nrc1hHNGdJR2x1YzNSaGJtTmxUMlk2SUdOeVpXRjBaVWx1YzNSaGJtTmxWSGx3WlVOb1pXTnJaWElzWEc0Z0lHNXZaR1U2SUdOeVpXRjBaVTV2WkdWRGFHVmphMlZ5S0Nrc1hHNGdJRzlpYW1WamRFOW1PaUJqY21WaGRHVlBZbXBsWTNSUFpsUjVjR1ZEYUdWamEyVnlMRnh1SUNCdmJtVlBaam9nWTNKbFlYUmxSVzUxYlZSNWNHVkRhR1ZqYTJWeUxGeHVJQ0J2Ym1WUFpsUjVjR1U2SUdOeVpXRjBaVlZ1YVc5dVZIbHdaVU5vWldOclpYSXNYRzRnSUhOb1lYQmxPaUJqY21WaGRHVlRhR0Z3WlZSNWNHVkRhR1ZqYTJWeVhHNTlPMXh1WEc0dktpcGNiaUFxSUdsdWJHbHVaV1FnVDJKcVpXTjBMbWx6SUhCdmJIbG1hV3hzSUhSdklHRjJiMmxrSUhKbGNYVnBjbWx1WnlCamIyNXpkVzFsY25NZ2MyaHBjQ0IwYUdWcGNpQnZkMjVjYmlBcUlHaDBkSEJ6T2k4dlpHVjJaV3h2Y0dWeUxtMXZlbWxzYkdFdWIzSm5MMlZ1TFZWVEwyUnZZM012VjJWaUwwcGhkbUZUWTNKcGNIUXZVbVZtWlhKbGJtTmxMMGRzYjJKaGJGOVBZbXBsWTNSekwwOWlhbVZqZEM5cGMxeHVJQ292WEc0dkttVnpiR2x1ZEMxa2FYTmhZbXhsSUc1dkxYTmxiR1l0WTI5dGNHRnlaU292WEc1bWRXNWpkR2x2YmlCcGN5aDRMQ0I1S1NCN1hHNGdJQzh2SUZOaGJXVldZV3gxWlNCaGJHZHZjbWwwYUcxY2JpQWdhV1lnS0hnZ1BUMDlJSGtwSUh0Y2JpQWdJQ0F2THlCVGRHVndjeUF4TFRVc0lEY3RNVEJjYmlBZ0lDQXZMeUJUZEdWd2N5QTJMbUl0Tmk1bE9pQXJNQ0FoUFNBdE1GeHVJQ0FnSUhKbGRIVnliaUI0SUNFOVBTQXdJSHg4SURFZ0x5QjRJRDA5UFNBeElDOGdlVHRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0F2THlCVGRHVndJRFl1WVRvZ1RtRk9JRDA5SUU1aFRseHVJQ0FnSUhKbGRIVnliaUI0SUNFOVBTQjRJQ1ltSUhrZ0lUMDlJSGs3WEc0Z0lIMWNibjFjYmk4cVpYTnNhVzUwTFdWdVlXSnNaU0J1YnkxelpXeG1MV052YlhCaGNtVXFMMXh1WEc0dktpcGNiaUFxSUZkbElIVnpaU0JoYmlCRmNuSnZjaTFzYVd0bElHOWlhbVZqZENCbWIzSWdZbUZqYTNkaGNtUWdZMjl0Y0dGMGFXSnBiR2wwZVNCaGN5QndaVzl3YkdVZ2JXRjVJR05oYkd4Y2JpQXFJRkJ5YjNCVWVYQmxjeUJrYVhKbFkzUnNlU0JoYm1RZ2FXNXpjR1ZqZENCMGFHVnBjaUJ2ZFhSd2RYUXVJRWh2ZDJWMlpYSWdkMlVnWkc5dUozUWdkWE5sSUhKbFlXeGNiaUFxSUVWeWNtOXljeUJoYm5sdGIzSmxMaUJYWlNCa2IyNG5kQ0JwYm5Od1pXTjBJSFJvWldseUlITjBZV05ySUdGdWVYZGhlU3dnWVc1a0lHTnlaV0YwYVc1bklIUm9aVzFjYmlBcUlHbHpJSEJ5YjJocFltbDBhWFpsYkhrZ1pYaHdaVzV6YVhabElHbG1JSFJvWlhrZ1lYSmxJR055WldGMFpXUWdkRzl2SUc5bWRHVnVMQ0J6ZFdOb0lHRnpJSGRvWVhSY2JpQXFJR2hoY0hCbGJuTWdhVzRnYjI1bFQyWlVlWEJsS0NrZ1ptOXlJR0Z1ZVNCMGVYQmxJR0psWm05eVpTQjBhR1VnYjI1bElIUm9ZWFFnYldGMFkyaGxaQzVjYmlBcUwxeHVablZ1WTNScGIyNGdVSEp2Y0ZSNWNHVkZjbkp2Y2lodFpYTnpZV2RsS1NCN1hHNGdJSFJvYVhNdWJXVnpjMkZuWlNBOUlHMWxjM05oWjJVN1hHNGdJSFJvYVhNdWMzUmhZMnNnUFNBbkp6dGNibjFjYmk4dklFMWhhMlVnWUdsdWMzUmhibU5sYjJZZ1JYSnliM0pnSUhOMGFXeHNJSGR2Y21zZ1ptOXlJSEpsZEhWeWJtVmtJR1Z5Y205eWN5NWNibEJ5YjNCVWVYQmxSWEp5YjNJdWNISnZkRzkwZVhCbElEMGdSWEp5YjNJdWNISnZkRzkwZVhCbE8xeHVYRzVtZFc1amRHbHZiaUJqY21WaGRHVkRhR0ZwYm1GaWJHVlVlWEJsUTJobFkydGxjaWgyWVd4cFpHRjBaU2tnZTF4dUlDQnBaaUFvY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlrZ2UxeHVJQ0FnSUhaaGNpQnRZVzUxWVd4UWNtOXdWSGx3WlVOaGJHeERZV05vWlNBOUlIdDlPMXh1SUNCOVhHNGdJR1oxYm1OMGFXOXVJR05vWldOclZIbHdaU2hwYzFKbGNYVnBjbVZrTENCd2NtOXdjeXdnY0hKdmNFNWhiV1VzSUdOdmJYQnZibVZ1ZEU1aGJXVXNJR3h2WTJGMGFXOXVMQ0J3Y205d1JuVnNiRTVoYldVc0lITmxZM0psZENrZ2UxeHVJQ0FnSUdOdmJYQnZibVZ1ZEU1aGJXVWdQU0JqYjIxd2IyNWxiblJPWVcxbElIeDhJRUZPVDA1WlRVOVZVenRjYmlBZ0lDQndjbTl3Um5Wc2JFNWhiV1VnUFNCd2NtOXdSblZzYkU1aGJXVWdmSHdnY0hKdmNFNWhiV1U3WEc0Z0lDQWdhV1lnS0hCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljcElIdGNiaUFnSUNBZ0lHbG1JQ2h6WldOeVpYUWdJVDA5SUZKbFlXTjBVSEp2Y0ZSNWNHVnpVMlZqY21WMElDWW1JSFI1Y0dWdlppQmpiMjV6YjJ4bElDRTlQU0FuZFc1a1pXWnBibVZrSnlrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnWTJGamFHVkxaWGtnUFNCamIyMXdiMjVsYm5ST1lXMWxJQ3NnSnpvbklDc2djSEp2Y0U1aGJXVTdYRzRnSUNBZ0lDQWdJR2xtSUNnaGJXRnVkV0ZzVUhKdmNGUjVjR1ZEWVd4c1EyRmphR1ZiWTJGamFHVkxaWGxkS1NCN1hHNGdJQ0FnSUNBZ0lDQWdjSEp2WTJWemN5NWxibll1VGs5RVJWOUZUbFlnSVQwOUlDZHdjbTlrZFdOMGFXOXVKeUEvSUhkaGNtNXBibWNvWm1Gc2MyVXNJQ2RaYjNVZ1lYSmxJRzFoYm5WaGJHeDVJR05oYkd4cGJtY2dZU0JTWldGamRDNVFjbTl3Vkhsd1pYTWdkbUZzYVdSaGRHbHZiaUFuSUNzZ0oyWjFibU4wYVc5dUlHWnZjaUIwYUdVZ1lDVnpZQ0J3Y205d0lHOXVJR0FsYzJBdUlGUm9hWE1nYVhNZ1pHVndjbVZqWVhSbFpDQW5JQ3NnSjJGdVpDQjNhV3hzSUc1dmRDQjNiM0pySUdsdUlIUm9aU0J1WlhoMElHMWhhbTl5SUhabGNuTnBiMjR1SUZsdmRTQnRZWGtnWW1VZ0p5QXJJQ2R6WldWcGJtY2dkR2hwY3lCM1lYSnVhVzVuSUdSMVpTQjBieUJoSUhSb2FYSmtMWEJoY25SNUlGQnliM0JVZVhCbGN5QnNhV0p5WVhKNUxpQW5JQ3NnSjFObFpTQm9kSFJ3Y3pvdkwyWmlMbTFsTDNKbFlXTjBMWGRoY201cGJtY3RaRzl1ZEMxallXeHNMWEJ5YjNCMGVYQmxjeUJtYjNJZ1pHVjBZV2xzY3k0bkxDQndjbTl3Um5Wc2JFNWhiV1VzSUdOdmJYQnZibVZ1ZEU1aGJXVXBJRG9nZG05cFpDQXdPMXh1SUNBZ0lDQWdJQ0FnSUcxaGJuVmhiRkJ5YjNCVWVYQmxRMkZzYkVOaFkyaGxXMk5oWTJobFMyVjVYU0E5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLSEJ5YjNCelczQnliM0JPWVcxbFhTQTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQjJZWElnYkc5allYUnBiMjVPWVcxbElEMGdVbVZoWTNSUWNtOXdWSGx3WlV4dlkyRjBhVzl1VG1GdFpYTmJiRzlqWVhScGIyNWRPMXh1SUNBZ0lDQWdhV1lnS0dselVtVnhkV2x5WldRcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHNWxkeUJRY205d1ZIbHdaVVZ5Y205eUtDZFNaWEYxYVhKbFpDQW5JQ3NnYkc5allYUnBiMjVPWVcxbElDc2dKeUJnSnlBcklIQnliM0JHZFd4c1RtRnRaU0FySUNkZ0lIZGhjeUJ1YjNRZ2MzQmxZMmxtYVdWa0lHbHVJQ2NnS3lBb0oyQW5JQ3NnWTI5dGNHOXVaVzUwVG1GdFpTQXJJQ2RnTGljcEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lISmxkSFZ5YmlCdWRXeHNPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZG1Gc2FXUmhkR1VvY0hKdmNITXNJSEJ5YjNCT1lXMWxMQ0JqYjIxd2IyNWxiblJPWVcxbExDQnNiMk5oZEdsdmJpd2djSEp2Y0VaMWJHeE9ZVzFsS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCMllYSWdZMmhoYVc1bFpFTm9aV05yVkhsd1pTQTlJR05vWldOclZIbHdaUzVpYVc1a0tHNTFiR3dzSUdaaGJITmxLVHRjYmlBZ1kyaGhhVzVsWkVOb1pXTnJWSGx3WlM1cGMxSmxjWFZwY21Wa0lEMGdZMmhsWTJ0VWVYQmxMbUpwYm1Rb2JuVnNiQ3dnZEhKMVpTazdYRzVjYmlBZ2NtVjBkWEp1SUdOb1lXbHVaV1JEYUdWamExUjVjR1U3WEc1OVhHNWNibVoxYm1OMGFXOXVJR055WldGMFpWQnlhVzFwZEdsMlpWUjVjR1ZEYUdWamEyVnlLR1Y0Y0dWamRHVmtWSGx3WlNrZ2UxeHVJQ0JtZFc1amRHbHZiaUIyWVd4cFpHRjBaU2h3Y205d2N5d2djSEp2Y0U1aGJXVXNJR052YlhCdmJtVnVkRTVoYldVc0lHeHZZMkYwYVc5dUxDQndjbTl3Um5Wc2JFNWhiV1VzSUhObFkzSmxkQ2tnZTF4dUlDQWdJSFpoY2lCd2NtOXdWbUZzZFdVZ1BTQndjbTl3YzF0d2NtOXdUbUZ0WlYwN1hHNGdJQ0FnZG1GeUlIQnliM0JVZVhCbElEMGdaMlYwVUhKdmNGUjVjR1VvY0hKdmNGWmhiSFZsS1R0Y2JpQWdJQ0JwWmlBb2NISnZjRlI1Y0dVZ0lUMDlJR1Y0Y0dWamRHVmtWSGx3WlNrZ2UxeHVJQ0FnSUNBZ2RtRnlJR3h2WTJGMGFXOXVUbUZ0WlNBOUlGSmxZV04wVUhKdmNGUjVjR1ZNYjJOaGRHbHZiazVoYldWelcyeHZZMkYwYVc5dVhUdGNiaUFnSUNBZ0lDOHZJR0J3Y205d1ZtRnNkV1ZnSUdKbGFXNW5JR2x1YzNSaGJtTmxJRzltTENCellYa3NJR1JoZEdVdmNtVm5aWGh3TENCd1lYTnpJSFJvWlNBbmIySnFaV04wSjF4dUlDQWdJQ0FnTHk4Z1kyaGxZMnNzSUdKMWRDQjNaU0JqWVc0Z2IyWm1aWElnWVNCdGIzSmxJSEJ5WldOcGMyVWdaWEp5YjNJZ2JXVnpjMkZuWlNCb1pYSmxJSEpoZEdobGNpQjBhR0Z1WEc0Z0lDQWdJQ0F2THlBbmIyWWdkSGx3WlNCZ2IySnFaV04wWUNjdVhHNGdJQ0FnSUNCMllYSWdjSEpsWTJselpWUjVjR1VnUFNCblpYUlFjbVZqYVhObFZIbHdaU2h3Y205d1ZtRnNkV1VwTzF4dVhHNGdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGQnliM0JVZVhCbFJYSnliM0lvSjBsdWRtRnNhV1FnSnlBcklHeHZZMkYwYVc5dVRtRnRaU0FySUNjZ1lDY2dLeUJ3Y205d1JuVnNiRTVoYldVZ0t5QW5ZQ0J2WmlCMGVYQmxJQ2NnS3lBb0oyQW5JQ3NnY0hKbFkybHpaVlI1Y0dVZ0t5QW5ZQ0J6ZFhCd2JHbGxaQ0IwYnlCZ0p5QXJJR052YlhCdmJtVnVkRTVoYldVZ0t5QW5ZQ3dnWlhod1pXTjBaV1FnSnlrZ0t5QW9KMkFuSUNzZ1pYaHdaV04wWldSVWVYQmxJQ3NnSjJBdUp5a3BPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnYm5Wc2JEdGNiaUFnZlZ4dUlDQnlaWFIxY200Z1kzSmxZWFJsUTJoaGFXNWhZbXhsVkhsd1pVTm9aV05yWlhJb2RtRnNhV1JoZEdVcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCamNtVmhkR1ZCYm5sVWVYQmxRMmhsWTJ0bGNpZ3BJSHRjYmlBZ2NtVjBkWEp1SUdOeVpXRjBaVU5vWVdsdVlXSnNaVlI1Y0dWRGFHVmphMlZ5S0dWdGNIUjVSblZ1WTNScGIyNHVkR2hoZEZKbGRIVnlibk1vYm5Wc2JDa3BPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQmpjbVZoZEdWQmNuSmhlVTltVkhsd1pVTm9aV05yWlhJb2RIbHdaVU5vWldOclpYSXBJSHRjYmlBZ1puVnVZM1JwYjI0Z2RtRnNhV1JoZEdVb2NISnZjSE1zSUhCeWIzQk9ZVzFsTENCamIyMXdiMjVsYm5ST1lXMWxMQ0JzYjJOaGRHbHZiaXdnY0hKdmNFWjFiR3hPWVcxbEtTQjdYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQjBlWEJsUTJobFkydGxjaUFoUFQwZ0oyWjFibU4wYVc5dUp5a2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHNWxkeUJRY205d1ZIbHdaVVZ5Y205eUtDZFFjbTl3WlhKMGVTQmdKeUFySUhCeWIzQkdkV3hzVG1GdFpTQXJJQ2RnSUc5bUlHTnZiWEJ2Ym1WdWRDQmdKeUFySUdOdmJYQnZibVZ1ZEU1aGJXVWdLeUFuWUNCb1lYTWdhVzUyWVd4cFpDQlFjbTl3Vkhsd1pTQnViM1JoZEdsdmJpQnBibk5wWkdVZ1lYSnlZWGxQWmk0bktUdGNiaUFnSUNCOVhHNGdJQ0FnZG1GeUlIQnliM0JXWVd4MVpTQTlJSEJ5YjNCelczQnliM0JPWVcxbFhUdGNiaUFnSUNCcFppQW9JVUZ5Y21GNUxtbHpRWEp5WVhrb2NISnZjRlpoYkhWbEtTa2dlMXh1SUNBZ0lDQWdkbUZ5SUd4dlkyRjBhVzl1VG1GdFpTQTlJRkpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Yms1aGJXVnpXMnh2WTJGMGFXOXVYVHRjYmlBZ0lDQWdJSFpoY2lCd2NtOXdWSGx3WlNBOUlHZGxkRkJ5YjNCVWVYQmxLSEJ5YjNCV1lXeDFaU2s3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibVYzSUZCeWIzQlVlWEJsUlhKeWIzSW9KMGx1ZG1Gc2FXUWdKeUFySUd4dlkyRjBhVzl1VG1GdFpTQXJJQ2NnWUNjZ0t5QndjbTl3Um5Wc2JFNWhiV1VnS3lBbllDQnZaaUIwZVhCbElDY2dLeUFvSjJBbklDc2djSEp2Y0ZSNWNHVWdLeUFuWUNCemRYQndiR2xsWkNCMGJ5QmdKeUFySUdOdmJYQnZibVZ1ZEU1aGJXVWdLeUFuWUN3Z1pYaHdaV04wWldRZ1lXNGdZWEp5WVhrdUp5a3BPMXh1SUNBZ0lIMWNiaUFnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElIQnliM0JXWVd4MVpTNXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnZG1GeUlHVnljbTl5SUQwZ2RIbHdaVU5vWldOclpYSW9jSEp2Y0ZaaGJIVmxMQ0JwTENCamIyMXdiMjVsYm5ST1lXMWxMQ0JzYjJOaGRHbHZiaXdnY0hKdmNFWjFiR3hPWVcxbElDc2dKMXNuSUNzZ2FTQXJJQ2RkSnl3Z1VtVmhZM1JRY205d1ZIbHdaWE5UWldOeVpYUXBPMXh1SUNBZ0lDQWdhV1lnS0dWeWNtOXlJR2x1YzNSaGJtTmxiMllnUlhKeWIzSXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1Z5Y205eU8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdiblZzYkR0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnWTNKbFlYUmxRMmhoYVc1aFlteGxWSGx3WlVOb1pXTnJaWElvZG1Gc2FXUmhkR1VwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJqY21WaGRHVkZiR1Z0Wlc1MFZIbHdaVU5vWldOclpYSW9LU0I3WEc0Z0lHWjFibU4wYVc5dUlIWmhiR2xrWVhSbEtIQnliM0J6TENCd2NtOXdUbUZ0WlN3Z1kyOXRjRzl1Wlc1MFRtRnRaU3dnYkc5allYUnBiMjRzSUhCeWIzQkdkV3hzVG1GdFpTa2dlMXh1SUNBZ0lIWmhjaUJ3Y205d1ZtRnNkV1VnUFNCd2NtOXdjMXR3Y205d1RtRnRaVjA3WEc0Z0lDQWdhV1lnS0NGU1pXRmpkRVZzWlcxbGJuUXVhWE5XWVd4cFpFVnNaVzFsYm5Rb2NISnZjRlpoYkhWbEtTa2dlMXh1SUNBZ0lDQWdkbUZ5SUd4dlkyRjBhVzl1VG1GdFpTQTlJRkpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Yms1aGJXVnpXMnh2WTJGMGFXOXVYVHRjYmlBZ0lDQWdJSFpoY2lCd2NtOXdWSGx3WlNBOUlHZGxkRkJ5YjNCVWVYQmxLSEJ5YjNCV1lXeDFaU2s3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibVYzSUZCeWIzQlVlWEJsUlhKeWIzSW9KMGx1ZG1Gc2FXUWdKeUFySUd4dlkyRjBhVzl1VG1GdFpTQXJJQ2NnWUNjZ0t5QndjbTl3Um5Wc2JFNWhiV1VnS3lBbllDQnZaaUIwZVhCbElDY2dLeUFvSjJBbklDc2djSEp2Y0ZSNWNHVWdLeUFuWUNCemRYQndiR2xsWkNCMGJ5QmdKeUFySUdOdmJYQnZibVZ1ZEU1aGJXVWdLeUFuWUN3Z1pYaHdaV04wWldRZ1lTQnphVzVuYkdVZ1VtVmhZM1JGYkdWdFpXNTBMaWNwS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHNTFiR3c3WEc0Z0lIMWNiaUFnY21WMGRYSnVJR055WldGMFpVTm9ZV2x1WVdKc1pWUjVjR1ZEYUdWamEyVnlLSFpoYkdsa1lYUmxLVHRjYm4xY2JseHVablZ1WTNScGIyNGdZM0psWVhSbFNXNXpkR0Z1WTJWVWVYQmxRMmhsWTJ0bGNpaGxlSEJsWTNSbFpFTnNZWE56S1NCN1hHNGdJR1oxYm1OMGFXOXVJSFpoYkdsa1lYUmxLSEJ5YjNCekxDQndjbTl3VG1GdFpTd2dZMjl0Y0c5dVpXNTBUbUZ0WlN3Z2JHOWpZWFJwYjI0c0lIQnliM0JHZFd4c1RtRnRaU2tnZTF4dUlDQWdJR2xtSUNnaEtIQnliM0J6VzNCeWIzQk9ZVzFsWFNCcGJuTjBZVzVqWlc5bUlHVjRjR1ZqZEdWa1EyeGhjM01wS1NCN1hHNGdJQ0FnSUNCMllYSWdiRzlqWVhScGIyNU9ZVzFsSUQwZ1VtVmhZM1JRY205d1ZIbHdaVXh2WTJGMGFXOXVUbUZ0WlhOYmJHOWpZWFJwYjI1ZE8xeHVJQ0FnSUNBZ2RtRnlJR1Y0Y0dWamRHVmtRMnhoYzNOT1lXMWxJRDBnWlhod1pXTjBaV1JEYkdGemN5NXVZVzFsSUh4OElFRk9UMDVaVFU5VlV6dGNiaUFnSUNBZ0lIWmhjaUJoWTNSMVlXeERiR0Z6YzA1aGJXVWdQU0JuWlhSRGJHRnpjMDVoYldVb2NISnZjSE5iY0hKdmNFNWhiV1ZkS1R0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ1WlhjZ1VISnZjRlI1Y0dWRmNuSnZjaWduU1c1MllXeHBaQ0FuSUNzZ2JHOWpZWFJwYjI1T1lXMWxJQ3NnSnlCZ0p5QXJJSEJ5YjNCR2RXeHNUbUZ0WlNBcklDZGdJRzltSUhSNWNHVWdKeUFySUNnbllDY2dLeUJoWTNSMVlXeERiR0Z6YzA1aGJXVWdLeUFuWUNCemRYQndiR2xsWkNCMGJ5QmdKeUFySUdOdmJYQnZibVZ1ZEU1aGJXVWdLeUFuWUN3Z1pYaHdaV04wWldRZ0p5a2dLeUFvSjJsdWMzUmhibU5sSUc5bUlHQW5JQ3NnWlhod1pXTjBaV1JEYkdGemMwNWhiV1VnS3lBbllDNG5LU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCdWRXeHNPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQmpjbVZoZEdWRGFHRnBibUZpYkdWVWVYQmxRMmhsWTJ0bGNpaDJZV3hwWkdGMFpTazdYRzU5WEc1Y2JtWjFibU4wYVc5dUlHTnlaV0YwWlVWdWRXMVVlWEJsUTJobFkydGxjaWhsZUhCbFkzUmxaRlpoYkhWbGN5a2dlMXh1SUNCcFppQW9JVUZ5Y21GNUxtbHpRWEp5WVhrb1pYaHdaV04wWldSV1lXeDFaWE1wS1NCN1hHNGdJQ0FnY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlBL0lIZGhjbTVwYm1jb1ptRnNjMlVzSUNkSmJuWmhiR2xrSUdGeVozVnRaVzUwSUhOMWNIQnNhV1ZrSUhSdklHOXVaVTltTENCbGVIQmxZM1JsWkNCaGJpQnBibk4wWVc1alpTQnZaaUJoY25KaGVTNG5LU0E2SUhadmFXUWdNRHRjYmlBZ0lDQnlaWFIxY200Z1pXMXdkSGxHZFc1amRHbHZiaTUwYUdGMFVtVjBkWEp1YzA1MWJHdzdYRzRnSUgxY2JseHVJQ0JtZFc1amRHbHZiaUIyWVd4cFpHRjBaU2h3Y205d2N5d2djSEp2Y0U1aGJXVXNJR052YlhCdmJtVnVkRTVoYldVc0lHeHZZMkYwYVc5dUxDQndjbTl3Um5Wc2JFNWhiV1VwSUh0Y2JpQWdJQ0IyWVhJZ2NISnZjRlpoYkhWbElEMGdjSEp2Y0hOYmNISnZjRTVoYldWZE8xeHVJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z1pYaHdaV04wWldSV1lXeDFaWE11YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lHbG1JQ2hwY3lod2NtOXdWbUZzZFdVc0lHVjRjR1ZqZEdWa1ZtRnNkV1Z6VzJsZEtTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdiblZzYkR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2JHOWpZWFJwYjI1T1lXMWxJRDBnVW1WaFkzUlFjbTl3Vkhsd1pVeHZZMkYwYVc5dVRtRnRaWE5iYkc5allYUnBiMjVkTzF4dUlDQWdJSFpoY2lCMllXeDFaWE5UZEhKcGJtY2dQU0JLVTA5T0xuTjBjbWx1WjJsbWVTaGxlSEJsWTNSbFpGWmhiSFZsY3lrN1hHNGdJQ0FnY21WMGRYSnVJRzVsZHlCUWNtOXdWSGx3WlVWeWNtOXlLQ2RKYm5aaGJHbGtJQ2NnS3lCc2IyTmhkR2x2Yms1aGJXVWdLeUFuSUdBbklDc2djSEp2Y0VaMWJHeE9ZVzFsSUNzZ0oyQWdiMllnZG1Gc2RXVWdZQ2NnS3lCd2NtOXdWbUZzZFdVZ0t5QW5ZQ0FuSUNzZ0tDZHpkWEJ3YkdsbFpDQjBieUJnSnlBcklHTnZiWEJ2Ym1WdWRFNWhiV1VnS3lBbllDd2daWGh3WldOMFpXUWdiMjVsSUc5bUlDY2dLeUIyWVd4MVpYTlRkSEpwYm1jZ0t5QW5MaWNwS1R0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnWTNKbFlYUmxRMmhoYVc1aFlteGxWSGx3WlVOb1pXTnJaWElvZG1Gc2FXUmhkR1VwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJqY21WaGRHVlBZbXBsWTNSUFpsUjVjR1ZEYUdWamEyVnlLSFI1Y0dWRGFHVmphMlZ5S1NCN1hHNGdJR1oxYm1OMGFXOXVJSFpoYkdsa1lYUmxLSEJ5YjNCekxDQndjbTl3VG1GdFpTd2dZMjl0Y0c5dVpXNTBUbUZ0WlN3Z2JHOWpZWFJwYjI0c0lIQnliM0JHZFd4c1RtRnRaU2tnZTF4dUlDQWdJR2xtSUNoMGVYQmxiMllnZEhsd1pVTm9aV05yWlhJZ0lUMDlJQ2RtZFc1amRHbHZiaWNwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ1WlhjZ1VISnZjRlI1Y0dWRmNuSnZjaWduVUhKdmNHVnlkSGtnWUNjZ0t5QndjbTl3Um5Wc2JFNWhiV1VnS3lBbllDQnZaaUJqYjIxd2IyNWxiblFnWUNjZ0t5QmpiMjF3YjI1bGJuUk9ZVzFsSUNzZ0oyQWdhR0Z6SUdsdWRtRnNhV1FnVUhKdmNGUjVjR1VnYm05MFlYUnBiMjRnYVc1emFXUmxJRzlpYW1WamRFOW1MaWNwTzF4dUlDQWdJSDFjYmlBZ0lDQjJZWElnY0hKdmNGWmhiSFZsSUQwZ2NISnZjSE5iY0hKdmNFNWhiV1ZkTzF4dUlDQWdJSFpoY2lCd2NtOXdWSGx3WlNBOUlHZGxkRkJ5YjNCVWVYQmxLSEJ5YjNCV1lXeDFaU2s3WEc0Z0lDQWdhV1lnS0hCeWIzQlVlWEJsSUNFOVBTQW5iMkpxWldOMEp5a2dlMXh1SUNBZ0lDQWdkbUZ5SUd4dlkyRjBhVzl1VG1GdFpTQTlJRkpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Yms1aGJXVnpXMnh2WTJGMGFXOXVYVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnVaWGNnVUhKdmNGUjVjR1ZGY25KdmNpZ25TVzUyWVd4cFpDQW5JQ3NnYkc5allYUnBiMjVPWVcxbElDc2dKeUJnSnlBcklIQnliM0JHZFd4c1RtRnRaU0FySUNkZ0lHOW1JSFI1Y0dVZ0p5QXJJQ2duWUNjZ0t5QndjbTl3Vkhsd1pTQXJJQ2RnSUhOMWNIQnNhV1ZrSUhSdklHQW5JQ3NnWTI5dGNHOXVaVzUwVG1GdFpTQXJJQ2RnTENCbGVIQmxZM1JsWkNCaGJpQnZZbXBsWTNRdUp5a3BPMXh1SUNBZ0lIMWNiaUFnSUNCbWIzSWdLSFpoY2lCclpYa2dhVzRnY0hKdmNGWmhiSFZsS1NCN1hHNGdJQ0FnSUNCcFppQW9jSEp2Y0ZaaGJIVmxMbWhoYzA5M2JsQnliM0JsY25SNUtHdGxlU2twSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJR1Z5Y205eUlEMGdkSGx3WlVOb1pXTnJaWElvY0hKdmNGWmhiSFZsTENCclpYa3NJR052YlhCdmJtVnVkRTVoYldVc0lHeHZZMkYwYVc5dUxDQndjbTl3Um5Wc2JFNWhiV1VnS3lBbkxpY2dLeUJyWlhrc0lGSmxZV04wVUhKdmNGUjVjR1Z6VTJWamNtVjBLVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tHVnljbTl5SUdsdWMzUmhibU5sYjJZZ1JYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1pYSnliM0k3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHNTFiR3c3WEc0Z0lIMWNiaUFnY21WMGRYSnVJR055WldGMFpVTm9ZV2x1WVdKc1pWUjVjR1ZEYUdWamEyVnlLSFpoYkdsa1lYUmxLVHRjYm4xY2JseHVablZ1WTNScGIyNGdZM0psWVhSbFZXNXBiMjVVZVhCbFEyaGxZMnRsY2loaGNuSmhlVTltVkhsd1pVTm9aV05yWlhKektTQjdYRzRnSUdsbUlDZ2hRWEp5WVhrdWFYTkJjbkpoZVNoaGNuSmhlVTltVkhsd1pVTm9aV05yWlhKektTa2dlMXh1SUNBZ0lIQnliMk5sYzNNdVpXNTJMazVQUkVWZlJVNVdJQ0U5UFNBbmNISnZaSFZqZEdsdmJpY2dQeUIzWVhKdWFXNW5LR1poYkhObExDQW5TVzUyWVd4cFpDQmhjbWQxYldWdWRDQnpkWEJ3YkdsbFpDQjBieUJ2Ym1WUFpsUjVjR1VzSUdWNGNHVmpkR1ZrSUdGdUlHbHVjM1JoYm1ObElHOW1JR0Z5Y21GNUxpY3BJRG9nZG05cFpDQXdPMXh1SUNBZ0lISmxkSFZ5YmlCbGJYQjBlVVoxYm1OMGFXOXVMblJvWVhSU1pYUjFjbTV6VG5Wc2JEdGNiaUFnZlZ4dVhHNGdJR1oxYm1OMGFXOXVJSFpoYkdsa1lYUmxLSEJ5YjNCekxDQndjbTl3VG1GdFpTd2dZMjl0Y0c5dVpXNTBUbUZ0WlN3Z2JHOWpZWFJwYjI0c0lIQnliM0JHZFd4c1RtRnRaU2tnZTF4dUlDQWdJR1p2Y2lBb2RtRnlJR2tnUFNBd095QnBJRHdnWVhKeVlYbFBabFI1Y0dWRGFHVmphMlZ5Y3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdkbUZ5SUdOb1pXTnJaWElnUFNCaGNuSmhlVTltVkhsd1pVTm9aV05yWlhKelcybGRPMXh1SUNBZ0lDQWdhV1lnS0dOb1pXTnJaWElvY0hKdmNITXNJSEJ5YjNCT1lXMWxMQ0JqYjIxd2IyNWxiblJPWVcxbExDQnNiMk5oZEdsdmJpd2djSEp2Y0VaMWJHeE9ZVzFsTENCU1pXRmpkRkJ5YjNCVWVYQmxjMU5sWTNKbGRDa2dQVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdiblZzYkR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2JHOWpZWFJwYjI1T1lXMWxJRDBnVW1WaFkzUlFjbTl3Vkhsd1pVeHZZMkYwYVc5dVRtRnRaWE5iYkc5allYUnBiMjVkTzF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVUhKdmNGUjVjR1ZGY25KdmNpZ25TVzUyWVd4cFpDQW5JQ3NnYkc5allYUnBiMjVPWVcxbElDc2dKeUJnSnlBcklIQnliM0JHZFd4c1RtRnRaU0FySUNkZ0lITjFjSEJzYVdWa0lIUnZJQ2NnS3lBb0oyQW5JQ3NnWTI5dGNHOXVaVzUwVG1GdFpTQXJJQ2RnTGljcEtUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z1kzSmxZWFJsUTJoaGFXNWhZbXhsVkhsd1pVTm9aV05yWlhJb2RtRnNhV1JoZEdVcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCamNtVmhkR1ZPYjJSbFEyaGxZMnRsY2lncElIdGNiaUFnWm5WdVkzUnBiMjRnZG1Gc2FXUmhkR1VvY0hKdmNITXNJSEJ5YjNCT1lXMWxMQ0JqYjIxd2IyNWxiblJPWVcxbExDQnNiMk5oZEdsdmJpd2djSEp2Y0VaMWJHeE9ZVzFsS1NCN1hHNGdJQ0FnYVdZZ0tDRnBjMDV2WkdVb2NISnZjSE5iY0hKdmNFNWhiV1ZkS1NrZ2UxeHVJQ0FnSUNBZ2RtRnlJR3h2WTJGMGFXOXVUbUZ0WlNBOUlGSmxZV04wVUhKdmNGUjVjR1ZNYjJOaGRHbHZiazVoYldWelcyeHZZMkYwYVc5dVhUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCdVpYY2dVSEp2Y0ZSNWNHVkZjbkp2Y2lnblNXNTJZV3hwWkNBbklDc2diRzlqWVhScGIyNU9ZVzFsSUNzZ0p5QmdKeUFySUhCeWIzQkdkV3hzVG1GdFpTQXJJQ2RnSUhOMWNIQnNhV1ZrSUhSdklDY2dLeUFvSjJBbklDc2dZMjl0Y0c5dVpXNTBUbUZ0WlNBcklDZGdMQ0JsZUhCbFkzUmxaQ0JoSUZKbFlXTjBUbTlrWlM0bktTazdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ1ZFd4c08xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCamNtVmhkR1ZEYUdGcGJtRmliR1ZVZVhCbFEyaGxZMnRsY2loMllXeHBaR0YwWlNrN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdOeVpXRjBaVk5vWVhCbFZIbHdaVU5vWldOclpYSW9jMmhoY0dWVWVYQmxjeWtnZTF4dUlDQm1kVzVqZEdsdmJpQjJZV3hwWkdGMFpTaHdjbTl3Y3l3Z2NISnZjRTVoYldVc0lHTnZiWEJ2Ym1WdWRFNWhiV1VzSUd4dlkyRjBhVzl1TENCd2NtOXdSblZzYkU1aGJXVXBJSHRjYmlBZ0lDQjJZWElnY0hKdmNGWmhiSFZsSUQwZ2NISnZjSE5iY0hKdmNFNWhiV1ZkTzF4dUlDQWdJSFpoY2lCd2NtOXdWSGx3WlNBOUlHZGxkRkJ5YjNCVWVYQmxLSEJ5YjNCV1lXeDFaU2s3WEc0Z0lDQWdhV1lnS0hCeWIzQlVlWEJsSUNFOVBTQW5iMkpxWldOMEp5a2dlMXh1SUNBZ0lDQWdkbUZ5SUd4dlkyRjBhVzl1VG1GdFpTQTlJRkpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Yms1aGJXVnpXMnh2WTJGMGFXOXVYVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnVaWGNnVUhKdmNGUjVjR1ZGY25KdmNpZ25TVzUyWVd4cFpDQW5JQ3NnYkc5allYUnBiMjVPWVcxbElDc2dKeUJnSnlBcklIQnliM0JHZFd4c1RtRnRaU0FySUNkZ0lHOW1JSFI1Y0dVZ1lDY2dLeUJ3Y205d1ZIbHdaU0FySUNkZ0lDY2dLeUFvSjNOMWNIQnNhV1ZrSUhSdklHQW5JQ3NnWTI5dGNHOXVaVzUwVG1GdFpTQXJJQ2RnTENCbGVIQmxZM1JsWkNCZ2IySnFaV04wWUM0bktTazdYRzRnSUNBZ2ZWeHVJQ0FnSUdadmNpQW9kbUZ5SUd0bGVTQnBiaUJ6YUdGd1pWUjVjR1Z6S1NCN1hHNGdJQ0FnSUNCMllYSWdZMmhsWTJ0bGNpQTlJSE5vWVhCbFZIbHdaWE5iYTJWNVhUdGNiaUFnSUNBZ0lHbG1JQ2doWTJobFkydGxjaWtnZTF4dUlDQWdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUhaaGNpQmxjbkp2Y2lBOUlHTm9aV05yWlhJb2NISnZjRlpoYkhWbExDQnJaWGtzSUdOdmJYQnZibVZ1ZEU1aGJXVXNJR3h2WTJGMGFXOXVMQ0J3Y205d1JuVnNiRTVoYldVZ0t5QW5MaWNnS3lCclpYa3NJRkpsWVdOMFVISnZjRlI1Y0dWelUyVmpjbVYwS1R0Y2JpQWdJQ0FnSUdsbUlDaGxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1pYSnliM0k3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCdWRXeHNPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQmpjbVZoZEdWRGFHRnBibUZpYkdWVWVYQmxRMmhsWTJ0bGNpaDJZV3hwWkdGMFpTazdYRzU5WEc1Y2JtWjFibU4wYVc5dUlHbHpUbTlrWlNod2NtOXdWbUZzZFdVcElIdGNiaUFnYzNkcGRHTm9JQ2gwZVhCbGIyWWdjSEp2Y0ZaaGJIVmxLU0I3WEc0Z0lDQWdZMkZ6WlNBbmJuVnRZbVZ5SnpwY2JpQWdJQ0JqWVhObElDZHpkSEpwYm1jbk9seHVJQ0FnSUdOaGMyVWdKM1Z1WkdWbWFXNWxaQ2M2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdJQ0JqWVhObElDZGliMjlzWldGdUp6cGNiaUFnSUNBZ0lISmxkSFZ5YmlBaGNISnZjRlpoYkhWbE8xeHVJQ0FnSUdOaGMyVWdKMjlpYW1WamRDYzZYRzRnSUNBZ0lDQnBaaUFvUVhKeVlYa3VhWE5CY25KaGVTaHdjbTl3Vm1Gc2RXVXBLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ3Y205d1ZtRnNkV1V1WlhabGNua29hWE5PYjJSbEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHbG1JQ2h3Y205d1ZtRnNkV1VnUFQwOUlHNTFiR3dnZkh3Z1VtVmhZM1JGYkdWdFpXNTBMbWx6Vm1Gc2FXUkZiR1Z0Wlc1MEtIQnliM0JXWVd4MVpTa3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJwZEdWeVlYUnZja1p1SUQwZ1oyVjBTWFJsY21GMGIzSkdiaWh3Y205d1ZtRnNkV1VwTzF4dUlDQWdJQ0FnYVdZZ0tHbDBaWEpoZEc5eVJtNHBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHbDBaWEpoZEc5eUlEMGdhWFJsY21GMGIzSkdiaTVqWVd4c0tIQnliM0JXWVd4MVpTazdYRzRnSUNBZ0lDQWdJSFpoY2lCemRHVndPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FYUmxjbUYwYjNKR2JpQWhQVDBnY0hKdmNGWmhiSFZsTG1WdWRISnBaWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQjNhR2xzWlNBb0lTaHpkR1Z3SUQwZ2FYUmxjbUYwYjNJdWJtVjRkQ2dwS1M1a2IyNWxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvSVdselRtOWtaU2h6ZEdWd0xuWmhiSFZsS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUM4dklFbDBaWEpoZEc5eUlIZHBiR3dnY0hKdmRtbGtaU0JsYm5SeWVTQmJheXgyWFNCMGRYQnNaWE1nY21GMGFHVnlJSFJvWVc0Z2RtRnNkV1Z6TGx4dUlDQWdJQ0FnSUNBZ0lIZG9hV3hsSUNnaEtITjBaWEFnUFNCcGRHVnlZWFJ2Y2k1dVpYaDBLQ2twTG1SdmJtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJsYm5SeWVTQTlJSE4wWlhBdWRtRnNkV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWlc1MGNua3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0NGcGMwNXZaR1VvWlc1MGNubGJNVjBwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdabUZzYzJVN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNBZ0lHUmxabUYxYkhRNlhHNGdJQ0FnSUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnYVhOVGVXMWliMndvY0hKdmNGUjVjR1VzSUhCeWIzQldZV3gxWlNrZ2UxeHVJQ0F2THlCT1lYUnBkbVVnVTNsdFltOXNMbHh1SUNCcFppQW9jSEp2Y0ZSNWNHVWdQVDA5SUNkemVXMWliMnduS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJSDFjYmx4dUlDQXZMeUF4T1M0MExqTXVOU0JUZVcxaWIyd3VjSEp2ZEc5MGVYQmxXMEJBZEc5VGRISnBibWRVWVdkZElEMDlQU0FuVTNsdFltOXNKMXh1SUNCcFppQW9jSEp2Y0ZaaGJIVmxXeWRBUUhSdlUzUnlhVzVuVkdGbkoxMGdQVDA5SUNkVGVXMWliMnduS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJ5ZFdVN1hHNGdJSDFjYmx4dUlDQXZMeUJHWVd4c1ltRmpheUJtYjNJZ2JtOXVMWE53WldNZ1kyOXRjR3hwWVc1MElGTjViV0p2YkhNZ2QyaHBZMmdnWVhKbElIQnZiSGxtYVd4c1pXUXVYRzRnSUdsbUlDaDBlWEJsYjJZZ1UzbHRZbTlzSUQwOVBTQW5ablZ1WTNScGIyNG5JQ1ltSUhCeWIzQldZV3gxWlNCcGJuTjBZVzVqWlc5bUlGTjViV0p2YkNrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwY25WbE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlHWmhiSE5sTzF4dWZWeHVYRzR2THlCRmNYVnBkbUZzWlc1MElHOW1JR0IwZVhCbGIyWmdJR0oxZENCM2FYUm9JSE53WldOcFlXd2dhR0Z1Wkd4cGJtY2dabTl5SUdGeWNtRjVJR0Z1WkNCeVpXZGxlSEF1WEc1bWRXNWpkR2x2YmlCblpYUlFjbTl3Vkhsd1pTaHdjbTl3Vm1Gc2RXVXBJSHRjYmlBZ2RtRnlJSEJ5YjNCVWVYQmxJRDBnZEhsd1pXOW1JSEJ5YjNCV1lXeDFaVHRjYmlBZ2FXWWdLRUZ5Y21GNUxtbHpRWEp5WVhrb2NISnZjRlpoYkhWbEtTa2dlMXh1SUNBZ0lISmxkSFZ5YmlBbllYSnlZWGtuTzF4dUlDQjlYRzRnSUdsbUlDaHdjbTl3Vm1Gc2RXVWdhVzV6ZEdGdVkyVnZaaUJTWldkRmVIQXBJSHRjYmlBZ0lDQXZMeUJQYkdRZ2QyVmlhMmwwY3lBb1lYUWdiR1ZoYzNRZ2RXNTBhV3dnUVc1a2NtOXBaQ0EwTGpBcElISmxkSFZ5YmlBblpuVnVZM1JwYjI0bklISmhkR2hsY2lCMGFHRnVYRzRnSUNBZ0x5OGdKMjlpYW1WamRDY2dabTl5SUhSNWNHVnZaaUJoSUZKbFowVjRjQzRnVjJVbmJHd2dibTl5YldGc2FYcGxJSFJvYVhNZ2FHVnlaU0J6YnlCMGFHRjBJQzlpYkdFdlhHNGdJQ0FnTHk4Z2NHRnpjMlZ6SUZCeWIzQlVlWEJsY3k1dlltcGxZM1F1WEc0Z0lDQWdjbVYwZFhKdUlDZHZZbXBsWTNRbk8xeHVJQ0I5WEc0Z0lHbG1JQ2hwYzFONWJXSnZiQ2h3Y205d1ZIbHdaU3dnY0hKdmNGWmhiSFZsS1NrZ2UxeHVJQ0FnSUhKbGRIVnliaUFuYzNsdFltOXNKenRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdjSEp2Y0ZSNWNHVTdYRzU5WEc1Y2JpOHZJRlJvYVhNZ2FHRnVaR3hsY3lCdGIzSmxJSFI1Y0dWeklIUm9ZVzRnWUdkbGRGQnliM0JVZVhCbFlDNGdUMjVzZVNCMWMyVmtJR1p2Y2lCbGNuSnZjaUJ0WlhOellXZGxjeTVjYmk4dklGTmxaU0JnWTNKbFlYUmxVSEpwYldsMGFYWmxWSGx3WlVOb1pXTnJaWEpnTGx4dVpuVnVZM1JwYjI0Z1oyVjBVSEpsWTJselpWUjVjR1VvY0hKdmNGWmhiSFZsS1NCN1hHNGdJSFpoY2lCd2NtOXdWSGx3WlNBOUlHZGxkRkJ5YjNCVWVYQmxLSEJ5YjNCV1lXeDFaU2s3WEc0Z0lHbG1JQ2h3Y205d1ZIbHdaU0E5UFQwZ0oyOWlhbVZqZENjcElIdGNiaUFnSUNCcFppQW9jSEp2Y0ZaaGJIVmxJR2x1YzNSaGJtTmxiMllnUkdGMFpTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlDZGtZWFJsSnp0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0hCeWIzQldZV3gxWlNCcGJuTjBZVzVqWlc5bUlGSmxaMFY0Y0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUNkeVpXZGxlSEFuTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdjSEp2Y0ZSNWNHVTdYRzU5WEc1Y2JpOHZJRkpsZEhWeWJuTWdZMnhoYzNNZ2JtRnRaU0J2WmlCMGFHVWdiMkpxWldOMExDQnBaaUJoYm5rdVhHNW1kVzVqZEdsdmJpQm5aWFJEYkdGemMwNWhiV1VvY0hKdmNGWmhiSFZsS1NCN1hHNGdJR2xtSUNnaGNISnZjRlpoYkhWbExtTnZibk4wY25WamRHOXlJSHg4SUNGd2NtOXdWbUZzZFdVdVkyOXVjM1J5ZFdOMGIzSXVibUZ0WlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJCVGs5T1dVMVBWVk03WEc0Z0lIMWNiaUFnY21WMGRYSnVJSEJ5YjNCV1lXeDFaUzVqYjI1emRISjFZM1J2Y2k1dVlXMWxPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlGSmxZV04wVUhKdmNGUjVjR1Z6T3lKZGZRPT0iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUmVhY3RQcm9wVHlwZXNTZWNyZXRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0UHVyZUNvbXBvbmVudFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnQnKTtcbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3ROb29wVXBkYXRlUXVldWUnKTtcblxudmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuZnVuY3Rpb24gUmVhY3RQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIC8vIER1cGxpY2F0ZWQgZnJvbSBSZWFjdENvbXBvbmVudC5cbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cbkNvbXBvbmVudER1bW15LnByb3RvdHlwZSA9IFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZTtcblJlYWN0UHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcblJlYWN0UHVyZUNvbXBvbmVudC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFjdFB1cmVDb21wb25lbnQ7XG4vLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cbl9hc3NpZ24oUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RDb21wb25lbnQucHJvdG90eXBlKTtcblJlYWN0UHVyZUNvbXBvbmVudC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHVyZUNvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgUmVhY3RWZXJzaW9uXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICcxNS4zLjInOyIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgY2FuRGVmaW5lUHJvcGVydHlcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd4JywgeyBnZXQ6IGZ1bmN0aW9uICgpIHt9IH0pO1xuICAgIGNhbkRlZmluZVByb3BlcnR5ID0gdHJ1ZTtcbiAgfSBjYXRjaCAoeCkge1xuICAgIC8vIElFIHdpbGwgZmFpbCBvbiBkZWZpbmVQcm9wZXJ0eVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FuRGVmaW5lUHJvcGVydHk7XG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklteHBZaTlqWVc1RVpXWnBibVZRY205d1pYSjBlUzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQklpd2labWxzWlNJNkltZGxibVZ5WVhSbFpDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUl2S2lwY2JpQXFJRU52Y0hseWFXZG9kQ0F5TURFekxYQnlaWE5sYm5Rc0lFWmhZMlZpYjI5ckxDQkpibU11WEc0Z0tpQkJiR3dnY21sbmFIUnpJSEpsYzJWeWRtVmtMbHh1SUNwY2JpQXFJRlJvYVhNZ2MyOTFjbU5sSUdOdlpHVWdhWE1nYkdsalpXNXpaV1FnZFc1a1pYSWdkR2hsSUVKVFJDMXpkSGxzWlNCc2FXTmxibk5sSUdadmRXNWtJR2x1SUhSb1pWeHVJQ29nVEVsRFJVNVRSU0JtYVd4bElHbHVJSFJvWlNCeWIyOTBJR1JwY21WamRHOXllU0J2WmlCMGFHbHpJSE52ZFhKalpTQjBjbVZsTGlCQmJpQmhaR1JwZEdsdmJtRnNJR2R5WVc1MFhHNGdLaUJ2WmlCd1lYUmxiblFnY21sbmFIUnpJR05oYmlCaVpTQm1iM1Z1WkNCcGJpQjBhR1VnVUVGVVJVNVVVeUJtYVd4bElHbHVJSFJvWlNCellXMWxJR1JwY21WamRHOXllUzVjYmlBcVhHNGdLaUJBY0hKdmRtbGtaWE5OYjJSMWJHVWdZMkZ1UkdWbWFXNWxVSEp2Y0dWeWRIbGNiaUFxTDF4dVhHNG5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JuWmhjaUJqWVc1RVpXWnBibVZRY205d1pYSjBlU0E5SUdaaGJITmxPMXh1YVdZZ0tIQnliMk5sYzNNdVpXNTJMazVQUkVWZlJVNVdJQ0U5UFNBbmNISnZaSFZqZEdsdmJpY3BJSHRjYmlBZ2RISjVJSHRjYmlBZ0lDQlBZbXBsWTNRdVpHVm1hVzVsVUhKdmNHVnlkSGtvZTMwc0lDZDRKeXdnZXlCblpYUTZJR1oxYm1OMGFXOXVJQ2dwSUh0OUlIMHBPMXh1SUNBZ0lHTmhia1JsWm1sdVpWQnliM0JsY25SNUlEMGdkSEoxWlR0Y2JpQWdmU0JqWVhSamFDQW9lQ2tnZTF4dUlDQWdJQzh2SUVsRklIZHBiR3dnWm1GcGJDQnZiaUJrWldacGJtVlFjbTl3WlhKMGVWeHVJQ0I5WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdZMkZ1UkdWbWFXNWxVSEp2Y0dWeWRIazdJbDE5IiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBjaGVja1JlYWN0VHlwZVNwZWNcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMnKTtcbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/b2JqZWN0fSBlbGVtZW50IFRoZSBSZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0gez9udW1iZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCwgZGVidWdJRCkge1xuICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICB2YXIgZXJyb3I7XG4gICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gUmVhY3QuUHJvcFR5cGVzLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzg0JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRXJyb3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpIDogdm9pZCAwO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgdmFyIGNvbXBvbmVudFN0YWNrSW5mbyA9ICcnO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWJ1Z0lEICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCAlcyB0eXBlOiAlcyVzJywgbG9jYXRpb24sIGVycm9yLm1lc3NhZ2UsIGNvbXBvbmVudFN0YWNrSW5mbykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tSZWFjdFR5cGVTcGVjO1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5amFHVmphMUpsWVdOMFZIbHdaVk53WldNdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b3FYRzRnS2lCRGIzQjVjbWxuYUhRZ01qQXhNeTF3Y21WelpXNTBMQ0JHWVdObFltOXZheXdnU1c1akxseHVJQ29nUVd4c0lISnBaMmgwY3lCeVpYTmxjblpsWkM1Y2JpQXFYRzRnS2lCVWFHbHpJSE52ZFhKalpTQmpiMlJsSUdseklHeHBZMlZ1YzJWa0lIVnVaR1Z5SUhSb1pTQkNVMFF0YzNSNWJHVWdiR2xqWlc1elpTQm1iM1Z1WkNCcGJpQjBhR1ZjYmlBcUlFeEpRMFZPVTBVZ1ptbHNaU0JwYmlCMGFHVWdjbTl2ZENCa2FYSmxZM1J2Y25rZ2IyWWdkR2hwY3lCemIzVnlZMlVnZEhKbFpTNGdRVzRnWVdSa2FYUnBiMjVoYkNCbmNtRnVkRnh1SUNvZ2IyWWdjR0YwWlc1MElISnBaMmgwY3lCallXNGdZbVVnWm05MWJtUWdhVzRnZEdobElGQkJWRVZPVkZNZ1ptbHNaU0JwYmlCMGFHVWdjMkZ0WlNCa2FYSmxZM1J2Y25rdVhHNGdLbHh1SUNvZ1FIQnliM1pwWkdWelRXOWtkV3hsSUdOb1pXTnJVbVZoWTNSVWVYQmxVM0JsWTF4dUlDb3ZYRzVjYmlkMWMyVWdjM1J5YVdOMEp6dGNibHh1ZG1GeUlGOXdjbTlrU1c1MllYSnBZVzUwSUQwZ2NtVnhkV2x5WlNnbkxpOXlaV0ZqZEZCeWIyUkpiblpoY21saGJuUW5LVHRjYmx4dWRtRnlJRkpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Yms1aGJXVnpJRDBnY21WeGRXbHlaU2duTGk5U1pXRmpkRkJ5YjNCVWVYQmxURzlqWVhScGIyNU9ZVzFsY3ljcE8xeHVkbUZ5SUZKbFlXTjBVSEp2Y0ZSNWNHVnpVMlZqY21WMElEMGdjbVZ4ZFdseVpTZ25MaTlTWldGamRGQnliM0JVZVhCbGMxTmxZM0psZENjcE8xeHVYRzUyWVhJZ2FXNTJZWEpwWVc1MElEMGdjbVZ4ZFdseVpTZ25abUpxY3k5c2FXSXZhVzUyWVhKcFlXNTBKeWs3WEc1MllYSWdkMkZ5Ym1sdVp5QTlJSEpsY1hWcGNtVW9KMlppYW5NdmJHbGlMM2RoY201cGJtY25LVHRjYmx4dWRtRnlJRkpsWVdOMFEyOXRjRzl1Wlc1MFZISmxaVWh2YjJzN1hHNWNibWxtSUNoMGVYQmxiMllnY0hKdlkyVnpjeUFoUFQwZ0ozVnVaR1ZtYVc1bFpDY2dKaVlnY0hKdlkyVnpjeTVsYm5ZZ0ppWWdjSEp2WTJWemN5NWxibll1VGs5RVJWOUZUbFlnUFQwOUlDZDBaWE4wSnlrZ2UxeHVJQ0F2THlCVVpXMXdiM0poY25rZ2FHRmpheTVjYmlBZ0x5OGdTVzVzYVc1bElISmxjWFZwY21WeklHUnZiaWQwSUhkdmNtc2dkMlZzYkNCM2FYUm9JRXBsYzNRNlhHNGdJQzh2SUdoMGRIQnpPaTh2WjJsMGFIVmlMbU52YlM5bVlXTmxZbTl2YXk5eVpXRmpkQzlwYzNOMVpYTXZOekkwTUZ4dUlDQXZMeUJTWlcxdmRtVWdkR2hsSUdsdWJHbHVaU0J5WlhGMWFYSmxjeUIzYUdWdUlIZGxJR1J2YmlkMElHNWxaV1FnZEdobGJTQmhibmx0YjNKbE9seHVJQ0F2THlCb2RIUndjem92TDJkcGRHaDFZaTVqYjIwdlptRmpaV0p2YjJzdmNtVmhZM1F2Y0hWc2JDODNNVGM0WEc0Z0lGSmxZV04wUTI5dGNHOXVaVzUwVkhKbFpVaHZiMnNnUFNCeVpYRjFhWEpsS0NjdUwxSmxZV04wUTI5dGNHOXVaVzUwVkhKbFpVaHZiMnNuS1R0Y2JuMWNibHh1ZG1GeUlHeHZaMmRsWkZSNWNHVkdZV2xzZFhKbGN5QTlJSHQ5TzF4dVhHNHZLaXBjYmlBcUlFRnpjMlZ5ZENCMGFHRjBJSFJvWlNCMllXeDFaWE1nYldGMFkyZ2dkMmwwYUNCMGFHVWdkSGx3WlNCemNHVmpjeTVjYmlBcUlFVnljbTl5SUcxbGMzTmhaMlZ6SUdGeVpTQnRaVzF2Y21sNlpXUWdZVzVrSUhkcGJHd2diMjVzZVNCaVpTQnphRzkzYmlCdmJtTmxMbHh1SUNwY2JpQXFJRUJ3WVhKaGJTQjdiMkpxWldOMGZTQjBlWEJsVTNCbFkzTWdUV0Z3SUc5bUlHNWhiV1VnZEc4Z1lTQlNaV0ZqZEZCeWIzQlVlWEJsWEc0Z0tpQkFjR0Z5WVcwZ2UyOWlhbVZqZEgwZ2RtRnNkV1Z6SUZKMWJuUnBiV1VnZG1Gc2RXVnpJSFJvWVhRZ2JtVmxaQ0IwYnlCaVpTQjBlWEJsTFdOb1pXTnJaV1JjYmlBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCc2IyTmhkR2x2YmlCbExtY3VJRndpY0hKdmNGd2lMQ0JjSW1OdmJuUmxlSFJjSWl3Z1hDSmphR2xzWkNCamIyNTBaWGgwWENKY2JpQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bmZTQmpiMjF3YjI1bGJuUk9ZVzFsSUU1aGJXVWdiMllnZEdobElHTnZiWEJ2Ym1WdWRDQm1iM0lnWlhKeWIzSWdiV1Z6YzJGblpYTXVYRzRnS2lCQWNHRnlZVzBnZXo5dlltcGxZM1I5SUdWc1pXMWxiblFnVkdobElGSmxZV04wSUdWc1pXMWxiblFnZEdoaGRDQnBjeUJpWldsdVp5QjBlWEJsTFdOb1pXTnJaV1JjYmlBcUlFQndZWEpoYlNCN1AyNTFiV0psY24wZ1pHVmlkV2RKUkNCVWFHVWdVbVZoWTNRZ1kyOXRjRzl1Wlc1MElHbHVjM1JoYm1ObElIUm9ZWFFnYVhNZ1ltVnBibWNnZEhsd1pTMWphR1ZqYTJWa1hHNGdLaUJBY0hKcGRtRjBaVnh1SUNvdlhHNW1kVzVqZEdsdmJpQmphR1ZqYTFKbFlXTjBWSGx3WlZOd1pXTW9kSGx3WlZOd1pXTnpMQ0IyWVd4MVpYTXNJR3h2WTJGMGFXOXVMQ0JqYjIxd2IyNWxiblJPWVcxbExDQmxiR1Z0Wlc1MExDQmtaV0oxWjBsRUtTQjdYRzRnSUdadmNpQW9kbUZ5SUhSNWNHVlRjR1ZqVG1GdFpTQnBiaUIwZVhCbFUzQmxZM01wSUh0Y2JpQWdJQ0JwWmlBb2RIbHdaVk53WldOekxtaGhjMDkzYmxCeWIzQmxjblI1S0hSNWNHVlRjR1ZqVG1GdFpTa3BJSHRjYmlBZ0lDQWdJSFpoY2lCbGNuSnZjanRjYmlBZ0lDQWdJQzh2SUZCeWIzQWdkSGx3WlNCMllXeHBaR0YwYVc5dUlHMWhlU0IwYUhKdmR5NGdTVzRnWTJGelpTQjBhR1Y1SUdSdkxDQjNaU0JrYjI0bmRDQjNZVzUwSUhSdlhHNGdJQ0FnSUNBdkx5Qm1ZV2xzSUhSb1pTQnlaVzVrWlhJZ2NHaGhjMlVnZDJobGNtVWdhWFFnWkdsa2JpZDBJR1poYVd3Z1ltVm1iM0psTGlCVGJ5QjNaU0JzYjJjZ2FYUXVYRzRnSUNBZ0lDQXZMeUJCWm5SbGNpQjBhR1Z6WlNCb1lYWmxJR0psWlc0Z1kyeGxZVzVsWkNCMWNDd2dkMlVuYkd3Z2JHVjBJSFJvWlcwZ2RHaHliM2N1WEc0Z0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJVYUdseklHbHpJR2x1ZEdWdWRHbHZibUZzYkhrZ1lXNGdhVzUyWVhKcFlXNTBJSFJvWVhRZ1oyVjBjeUJqWVhWbmFIUXVJRWwwSjNNZ2RHaGxJSE5oYldWY2JpQWdJQ0FnSUNBZ0x5OGdZbVZvWVhacGIzSWdZWE1nZDJsMGFHOTFkQ0IwYUdseklITjBZWFJsYldWdWRDQmxlR05sY0hRZ2QybDBhQ0JoSUdKbGRIUmxjaUJ0WlhOellXZGxMbHh1SUNBZ0lDQWdJQ0FoS0hSNWNHVnZaaUIwZVhCbFUzQmxZM05iZEhsd1pWTndaV05PWVcxbFhTQTlQVDBnSjJaMWJtTjBhVzl1SnlrZ1B5QndjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5JRDhnYVc1MllYSnBZVzUwS0daaGJITmxMQ0FuSlhNNklDVnpJSFI1Y0dVZ1lDVnpZQ0JwY3lCcGJuWmhiR2xrT3lCcGRDQnRkWE4wSUdKbElHRWdablZ1WTNScGIyNHNJSFZ6ZFdGc2JIa2dabkp2YlNCU1pXRmpkQzVRY205d1ZIbHdaWE11Snl3Z1kyOXRjRzl1Wlc1MFRtRnRaU0I4ZkNBblVtVmhZM1FnWTJ4aGMzTW5MQ0JTWldGamRGQnliM0JVZVhCbFRHOWpZWFJwYjI1T1lXMWxjMXRzYjJOaGRHbHZibDBzSUhSNWNHVlRjR1ZqVG1GdFpTa2dPaUJmY0hKdlpFbHVkbUZ5YVdGdWRDZ25PRFFuTENCamIyMXdiMjVsYm5ST1lXMWxJSHg4SUNkU1pXRmpkQ0JqYkdGemN5Y3NJRkpsWVdOMFVISnZjRlI1Y0dWTWIyTmhkR2x2Yms1aGJXVnpXMnh2WTJGMGFXOXVYU3dnZEhsd1pWTndaV05PWVcxbEtTQTZJSFp2YVdRZ01EdGNiaUFnSUNBZ0lDQWdaWEp5YjNJZ1BTQjBlWEJsVTNCbFkzTmJkSGx3WlZOd1pXTk9ZVzFsWFNoMllXeDFaWE1zSUhSNWNHVlRjR1ZqVG1GdFpTd2dZMjl0Y0c5dVpXNTBUbUZ0WlN3Z2JHOWpZWFJwYjI0c0lHNTFiR3dzSUZKbFlXTjBVSEp2Y0ZSNWNHVnpVMlZqY21WMEtUdGNiaUFnSUNBZ0lIMGdZMkYwWTJnZ0tHVjRLU0I3WEc0Z0lDQWdJQ0FnSUdWeWNtOXlJRDBnWlhnN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCd2NtOWpaWE56TG1WdWRpNU9UMFJGWDBWT1ZpQWhQVDBnSjNCeWIyUjFZM1JwYjI0bklEOGdkMkZ5Ym1sdVp5Z2haWEp5YjNJZ2ZId2daWEp5YjNJZ2FXNXpkR0Z1WTJWdlppQkZjbkp2Y2l3Z0p5VnpPaUIwZVhCbElITndaV05wWm1sallYUnBiMjRnYjJZZ0pYTWdZQ1Z6WUNCcGN5QnBiblpoYkdsa095QjBhR1VnZEhsd1pTQmphR1ZqYTJWeUlDY2dLeUFuWm5WdVkzUnBiMjRnYlhWemRDQnlaWFIxY200Z1lHNTFiR3hnSUc5eUlHRnVJR0JGY25KdmNtQWdZblYwSUhKbGRIVnlibVZrSUdFZ0pYTXVJQ2NnS3lBbldXOTFJRzFoZVNCb1lYWmxJR1p2Y21kdmRIUmxiaUIwYnlCd1lYTnpJR0Z1SUdGeVozVnRaVzUwSUhSdklIUm9aU0IwZVhCbElHTm9aV05yWlhJZ0p5QXJJQ2RqY21WaGRHOXlJQ2hoY25KaGVVOW1MQ0JwYm5OMFlXNWpaVTltTENCdlltcGxZM1JQWml3Z2IyNWxUMllzSUc5dVpVOW1WSGx3WlN3Z1lXNWtJQ2NnS3lBbmMyaGhjR1VnWVd4c0lISmxjWFZwY21VZ1lXNGdZWEpuZFcxbGJuUXBMaWNzSUdOdmJYQnZibVZ1ZEU1aGJXVWdmSHdnSjFKbFlXTjBJR05zWVhOekp5d2dVbVZoWTNSUWNtOXdWSGx3WlV4dlkyRjBhVzl1VG1GdFpYTmJiRzlqWVhScGIyNWRMQ0IwZVhCbFUzQmxZMDVoYldVc0lIUjVjR1Z2WmlCbGNuSnZjaWtnT2lCMmIybGtJREE3WEc0Z0lDQWdJQ0JwWmlBb1pYSnliM0lnYVc1emRHRnVZMlZ2WmlCRmNuSnZjaUFtSmlBaEtHVnljbTl5TG0xbGMzTmhaMlVnYVc0Z2JHOW5aMlZrVkhsd1pVWmhhV3gxY21WektTa2dlMXh1SUNBZ0lDQWdJQ0F2THlCUGJteDVJRzF2Ym1sMGIzSWdkR2hwY3lCbVlXbHNkWEpsSUc5dVkyVWdZbVZqWVhWelpTQjBhR1Z5WlNCMFpXNWtjeUIwYnlCaVpTQmhJR3h2ZENCdlppQjBhR1ZjYmlBZ0lDQWdJQ0FnTHk4Z2MyRnRaU0JsY25KdmNpNWNiaUFnSUNBZ0lDQWdiRzluWjJWa1ZIbHdaVVpoYVd4MWNtVnpXMlZ5Y205eUxtMWxjM05oWjJWZElEMGdkSEoxWlR0Y2JseHVJQ0FnSUNBZ0lDQjJZWElnWTI5dGNHOXVaVzUwVTNSaFkydEpibVp2SUQwZ0p5YzdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tIQnliMk5sYzNNdVpXNTJMazVQUkVWZlJVNVdJQ0U5UFNBbmNISnZaSFZqZEdsdmJpY3BJSHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9JVkpsWVdOMFEyOXRjRzl1Wlc1MFZISmxaVWh2YjJzcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUZKbFlXTjBRMjl0Y0c5dVpXNTBWSEpsWlVodmIyc2dQU0J5WlhGMWFYSmxLQ2N1TDFKbFlXTjBRMjl0Y0c5dVpXNTBWSEpsWlVodmIyc25LVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdhV1lnS0dSbFluVm5TVVFnSVQwOUlHNTFiR3dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR052YlhCdmJtVnVkRk4wWVdOclNXNW1ieUE5SUZKbFlXTjBRMjl0Y0c5dVpXNTBWSEpsWlVodmIyc3VaMlYwVTNSaFkydEJaR1JsYm1SMWJVSjVTVVFvWkdWaWRXZEpSQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGxiR1Z0Wlc1MElDRTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyMXdiMjVsYm5SVGRHRmphMGx1Wm04Z1BTQlNaV0ZqZEVOdmJYQnZibVZ1ZEZSeVpXVkliMjlyTG1kbGRFTjFjbkpsYm5SVGRHRmphMEZrWkdWdVpIVnRLR1ZzWlcxbGJuUXBPMXh1SUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNnUHlCM1lYSnVhVzVuS0daaGJITmxMQ0FuUm1GcGJHVmtJQ1Z6SUhSNWNHVTZJQ1Z6SlhNbkxDQnNiMk5oZEdsdmJpd2daWEp5YjNJdWJXVnpjMkZuWlN3Z1kyOXRjRzl1Wlc1MFUzUmhZMnRKYm1adktTQTZJSFp2YVdRZ01EdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYm4xY2JseHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQmphR1ZqYTFKbFlXTjBWSGx3WlZOd1pXTTdJbDE5IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIGdldEl0ZXJhdG9yRm5cbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuXG52YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gKlxuICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gKlxuICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICogICAgICAgLi4uXG4gKiAgICAgfVxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRJdGVyYXRvckZuOyIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgb25seUNoaWxkXG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5vbmx5XG4gKlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYSBzaW5nbGUgY2hpbGQgZ2V0c1xuICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG9cbiAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlXG4gKiBzdHJ1Y3R1cmUuXG4gKi9cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICAhUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDMnKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9ubHlDaGlsZDtcbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW14cFlpOXZibXg1UTJocGJHUXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEVpTENKbWFXeGxJam9pWjJWdVpYSmhkR1ZrTG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFLbHh1SUNvZ1EyOXdlWEpwWjJoMElESXdNVE10Y0hKbGMyVnVkQ3dnUm1GalpXSnZiMnNzSUVsdVl5NWNiaUFxSUVGc2JDQnlhV2RvZEhNZ2NtVnpaWEoyWldRdVhHNGdLbHh1SUNvZ1ZHaHBjeUJ6YjNWeVkyVWdZMjlrWlNCcGN5QnNhV05sYm5ObFpDQjFibVJsY2lCMGFHVWdRbE5FTFhOMGVXeGxJR3hwWTJWdWMyVWdabTkxYm1RZ2FXNGdkR2hsWEc0Z0tpQk1TVU5GVGxORklHWnBiR1VnYVc0Z2RHaGxJSEp2YjNRZ1pHbHlaV04wYjNKNUlHOW1JSFJvYVhNZ2MyOTFjbU5sSUhSeVpXVXVJRUZ1SUdGa1pHbDBhVzl1WVd3Z1ozSmhiblJjYmlBcUlHOW1JSEJoZEdWdWRDQnlhV2RvZEhNZ1kyRnVJR0psSUdadmRXNWtJR2x1SUhSb1pTQlFRVlJGVGxSVElHWnBiR1VnYVc0Z2RHaGxJSE5oYldVZ1pHbHlaV04wYjNKNUxseHVJQ3BjYmlBcUlFQndjbTkyYVdSbGMwMXZaSFZzWlNCdmJteDVRMmhwYkdSY2JpQXFMMXh1SjNWelpTQnpkSEpwWTNRbk8xeHVYRzUyWVhJZ1gzQnliMlJKYm5aaGNtbGhiblFnUFNCeVpYRjFhWEpsS0NjdUwzSmxZV04wVUhKdlpFbHVkbUZ5YVdGdWRDY3BPMXh1WEc1MllYSWdVbVZoWTNSRmJHVnRaVzUwSUQwZ2NtVnhkV2x5WlNnbkxpOVNaV0ZqZEVWc1pXMWxiblFuS1R0Y2JseHVkbUZ5SUdsdWRtRnlhV0Z1ZENBOUlISmxjWFZwY21Vb0oyWmlhbk12YkdsaUwybHVkbUZ5YVdGdWRDY3BPMXh1WEc0dktpcGNiaUFxSUZKbGRIVnlibk1nZEdobElHWnBjbk4wSUdOb2FXeGtJR2x1SUdFZ1kyOXNiR1ZqZEdsdmJpQnZaaUJqYUdsc1pISmxiaUJoYm1RZ2RtVnlhV1pwWlhNZ2RHaGhkQ0IwYUdWeVpWeHVJQ29nYVhNZ2IyNXNlU0J2Ym1VZ1kyaHBiR1FnYVc0Z2RHaGxJR052Ykd4bFkzUnBiMjR1WEc0Z0tseHVJQ29nVTJWbElHaDBkSEJ6T2k4dlptRmpaV0p2YjJzdVoybDBhSFZpTG1sdkwzSmxZV04wTDJSdlkzTXZkRzl3TFd4bGRtVnNMV0Z3YVM1b2RHMXNJM0psWVdOMExtTm9hV3hrY21WdUxtOXViSGxjYmlBcVhHNGdLaUJVYUdVZ1kzVnljbVZ1ZENCcGJYQnNaVzFsYm5SaGRHbHZiaUJ2WmlCMGFHbHpJR1oxYm1OMGFXOXVJR0Z6YzNWdFpYTWdkR2hoZENCaElITnBibWRzWlNCamFHbHNaQ0JuWlhSelhHNGdLaUJ3WVhOelpXUWdkMmwwYUc5MWRDQmhJSGR5WVhCd1pYSXNJR0oxZENCMGFHVWdjSFZ5Y0c5elpTQnZaaUIwYUdseklHaGxiSEJsY2lCbWRXNWpkR2x2YmlCcGN5QjBiMXh1SUNvZ1lXSnpkSEpoWTNRZ1lYZGhlU0IwYUdVZ2NHRnlkR2xqZFd4aGNpQnpkSEoxWTNSMWNtVWdiMllnWTJocGJHUnlaVzR1WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHMvYjJKcVpXTjBmU0JqYUdsc1pISmxiaUJEYUdsc1pDQmpiMnhzWldOMGFXOXVJSE4wY25WamRIVnlaUzVjYmlBcUlFQnlaWFIxY200Z2UxSmxZV04wUld4bGJXVnVkSDBnVkdobElHWnBjbk4wSUdGdVpDQnZibXg1SUdCU1pXRmpkRVZzWlcxbGJuUmdJR052Ym5SaGFXNWxaQ0JwYmlCMGFHVmNiaUFxSUhOMGNuVmpkSFZ5WlM1Y2JpQXFMMXh1Wm5WdVkzUnBiMjRnYjI1c2VVTm9hV3hrS0dOb2FXeGtjbVZ1S1NCN1hHNGdJQ0ZTWldGamRFVnNaVzFsYm5RdWFYTldZV3hwWkVWc1pXMWxiblFvWTJocGJHUnlaVzRwSUQ4Z2NISnZZMlZ6Y3k1bGJuWXVUazlFUlY5RlRsWWdJVDA5SUNkd2NtOWtkV04wYVc5dUp5QS9JR2x1ZG1GeWFXRnVkQ2htWVd4elpTd2dKMUpsWVdOMExrTm9hV3hrY21WdUxtOXViSGtnWlhod1pXTjBaV1FnZEc4Z2NtVmpaV2wyWlNCaElITnBibWRzWlNCU1pXRmpkQ0JsYkdWdFpXNTBJR05vYVd4a0xpY3BJRG9nWDNCeWIyUkpiblpoY21saGJuUW9KekUwTXljcElEb2dkbTlwWkNBd08xeHVJQ0J5WlhSMWNtNGdZMmhwYkdSeVpXNDdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2IyNXNlVU5vYVd4a095SmRmUT09IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSByZWFjdFByb2RJbnZhcmlhbnRcbiAqIFxuICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogV0FSTklORzogRE8gTk9UIG1hbnVhbGx5IHJlcXVpcmUgdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGBpbnZhcmlhbnQoLi4uKWAgdXNlZCBieSB0aGUgZXJyb3IgY29kZSBzeXN0ZW1cbiAqIGFuZCB3aWxsIF9vbmx5XyBiZSByZXF1aXJlZCBieSB0aGUgY29ycmVzcG9uZGluZyBiYWJlbCBwYXNzLlxuICogSXQgYWx3YXlzIHRocm93cy5cbiAqL1xuXG5mdW5jdGlvbiByZWFjdFByb2RJbnZhcmlhbnQoY29kZSkge1xuICB2YXIgYXJnQ291bnQgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcblxuICB2YXIgbWVzc2FnZSA9ICdNaW5pZmllZCBSZWFjdCBlcnJvciAjJyArIGNvZGUgKyAnOyB2aXNpdCAnICsgJ2h0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PScgKyBjb2RlO1xuXG4gIGZvciAodmFyIGFyZ0lkeCA9IDA7IGFyZ0lkeCA8IGFyZ0NvdW50OyBhcmdJZHgrKykge1xuICAgIG1lc3NhZ2UgKz0gJyZhcmdzW109JyArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbYXJnSWR4ICsgMV0pO1xuICB9XG5cbiAgbWVzc2FnZSArPSAnIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCcgKyAnIGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLic7XG5cbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgcmVhY3RQcm9kSW52YXJpYW50J3Mgb3duIGZyYW1lXG5cbiAgdGhyb3cgZXJyb3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhY3RQcm9kSW52YXJpYW50OyIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgdHJhdmVyc2VBbGxDaGlsZHJlblxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG5cbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTtcbiAgfVxuICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwgUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIGNhbGxiYWNrKHRyYXZlcnNlQ29udGV4dCwgY2hpbGRyZW4sXG4gICAgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLlxuICAgIG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcbiAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IGNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGlpID0gMDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcnO1xuICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICAgIGlmIChtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07XG4gICAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKSArIFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7XG4gICAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZCBvciB3cmFwIHRoZSBvYmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICsgJ1JlYWN0IGFkZC1vbnMuJztcbiAgICAgICAgaWYgKGNoaWxkcmVuLl9pc1JlYWN0RWxlbWVudCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBJdCBsb29rcyBsaWtlIHlvdVxcJ3JlIHVzaW5nIGFuIGVsZW1lbnQgY3JlYXRlZCBieSBhIGRpZmZlcmVudCAnICsgJ3ZlcnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFjdC4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgYWRkZW5kdW0gKz0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogX3Byb2RJbnZhcmlhbnQoJzMxJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLCBidXRcbiAqIG1pZ2h0IGFsc28gYmUgc3BlY2lmaWVkIHRocm91Z2ggYXR0cmlidXRlczpcbiAqXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4sIC4uLilgXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMubGVmdFBhbmVsQ2hpbGRyZW4sIC4uLilgXG4gKlxuICogVGhlIGB0cmF2ZXJzZUNvbnRleHRgIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggdGhlXG4gKiBlbnRpcmUgdHJhdmVyc2FsLiBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhY2N1bXVsYXRpb25zIG9yIGFueXRoaW5nIGVsc2UgdGhhdFxuICogdGhlIGNhbGxiYWNrIG1pZ2h0IGZpbmQgcmVsZXZhbnQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBvYmplY3QuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgVG8gaW52b2tlIHVwb24gdHJhdmVyc2luZyBlYWNoIGNoaWxkLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgZm9yIHRyYXZlcnNhbC5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sICcnLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmF2ZXJzZUFsbENoaWxkcmVuO1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5MGNtRjJaWEp6WlVGc2JFTm9hV3hrY21WdUxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQklpd2labWxzWlNJNkltZGxibVZ5WVhSbFpDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUl2S2lwY2JpQXFJRU52Y0hseWFXZG9kQ0F5TURFekxYQnlaWE5sYm5Rc0lFWmhZMlZpYjI5ckxDQkpibU11WEc0Z0tpQkJiR3dnY21sbmFIUnpJSEpsYzJWeWRtVmtMbHh1SUNwY2JpQXFJRlJvYVhNZ2MyOTFjbU5sSUdOdlpHVWdhWE1nYkdsalpXNXpaV1FnZFc1a1pYSWdkR2hsSUVKVFJDMXpkSGxzWlNCc2FXTmxibk5sSUdadmRXNWtJR2x1SUhSb1pWeHVJQ29nVEVsRFJVNVRSU0JtYVd4bElHbHVJSFJvWlNCeWIyOTBJR1JwY21WamRHOXllU0J2WmlCMGFHbHpJSE52ZFhKalpTQjBjbVZsTGlCQmJpQmhaR1JwZEdsdmJtRnNJR2R5WVc1MFhHNGdLaUJ2WmlCd1lYUmxiblFnY21sbmFIUnpJR05oYmlCaVpTQm1iM1Z1WkNCcGJpQjBhR1VnVUVGVVJVNVVVeUJtYVd4bElHbHVJSFJvWlNCellXMWxJR1JwY21WamRHOXllUzVjYmlBcVhHNGdLaUJBY0hKdmRtbGtaWE5OYjJSMWJHVWdkSEpoZG1WeWMyVkJiR3hEYUdsc1pISmxibHh1SUNvdlhHNWNiaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHVkbUZ5SUY5d2NtOWtTVzUyWVhKcFlXNTBJRDBnY21WeGRXbHlaU2duTGk5eVpXRmpkRkJ5YjJSSmJuWmhjbWxoYm5RbktUdGNibHh1ZG1GeUlGSmxZV04wUTNWeWNtVnVkRTkzYm1WeUlEMGdjbVZ4ZFdseVpTZ25MaTlTWldGamRFTjFjbkpsYm5SUGQyNWxjaWNwTzF4dWRtRnlJRkpsWVdOMFJXeGxiV1Z1ZENBOUlISmxjWFZwY21Vb0p5NHZVbVZoWTNSRmJHVnRaVzUwSnlrN1hHNWNiblpoY2lCblpYUkpkR1Z5WVhSdmNrWnVJRDBnY21WeGRXbHlaU2duTGk5blpYUkpkR1Z5WVhSdmNrWnVKeWs3WEc1MllYSWdhVzUyWVhKcFlXNTBJRDBnY21WeGRXbHlaU2duWm1KcWN5OXNhV0l2YVc1MllYSnBZVzUwSnlrN1hHNTJZWElnUzJWNVJYTmpZWEJsVlhScGJITWdQU0J5WlhGMWFYSmxLQ2N1TDB0bGVVVnpZMkZ3WlZWMGFXeHpKeWs3WEc1MllYSWdkMkZ5Ym1sdVp5QTlJSEpsY1hWcGNtVW9KMlppYW5NdmJHbGlMM2RoY201cGJtY25LVHRjYmx4dWRtRnlJRk5GVUVGU1FWUlBVaUE5SUNjdUp6dGNiblpoY2lCVFZVSlRSVkJCVWtGVVQxSWdQU0FuT2ljN1hHNWNiaThxS2x4dUlDb2dWRTlFVHpvZ1ZHVnpkQ0IwYUdGMElHRWdjMmx1WjJ4bElHTm9hV3hrSUdGdVpDQmhiaUJoY25KaGVTQjNhWFJvSUc5dVpTQnBkR1Z0SUdoaGRtVWdkR2hsSUhOaGJXVWdhMlY1WEc0Z0tpQndZWFIwWlhKdUxseHVJQ292WEc1Y2JuWmhjaUJrYVdSWFlYSnVRV0p2ZFhSTllYQnpJRDBnWm1Gc2MyVTdYRzVjYmk4cUtseHVJQ29nUjJWdVpYSmhkR1VnWVNCclpYa2djM1J5YVc1bklIUm9ZWFFnYVdSbGJuUnBabWxsY3lCaElHTnZiWEJ2Ym1WdWRDQjNhWFJvYVc0Z1lTQnpaWFF1WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHNxZlNCamIyMXdiMjVsYm5RZ1FTQmpiMjF3YjI1bGJuUWdkR2hoZENCamIzVnNaQ0JqYjI1MFlXbHVJR0VnYldGdWRXRnNJR3RsZVM1Y2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQnBibVJsZUNCSmJtUmxlQ0IwYUdGMElHbHpJSFZ6WldRZ2FXWWdZU0J0WVc1MVlXd2dhMlY1SUdseklHNXZkQ0J3Y205MmFXUmxaQzVjYmlBcUlFQnlaWFIxY200Z2UzTjBjbWx1WjMxY2JpQXFMMXh1Wm5WdVkzUnBiMjRnWjJWMFEyOXRjRzl1Wlc1MFMyVjVLR052YlhCdmJtVnVkQ3dnYVc1a1pYZ3BJSHRjYmlBZ0x5OGdSRzhnYzI5dFpTQjBlWEJsWTJobFkydHBibWNnYUdWeVpTQnphVzVqWlNCM1pTQmpZV3hzSUhSb2FYTWdZbXhwYm1Sc2VTNGdWMlVnZDJGdWRDQjBieUJsYm5OMWNtVmNiaUFnTHk4Z2RHaGhkQ0IzWlNCa2IyNG5kQ0JpYkc5amF5QndiM1JsYm5ScFlXd2dablYwZFhKbElFVlRJRUZRU1hNdVhHNGdJR2xtSUNoamIyMXdiMjVsYm5RZ0ppWWdkSGx3Wlc5bUlHTnZiWEJ2Ym1WdWRDQTlQVDBnSjI5aWFtVmpkQ2NnSmlZZ1kyOXRjRzl1Wlc1MExtdGxlU0FoUFNCdWRXeHNLU0I3WEc0Z0lDQWdMeThnUlhod2JHbGphWFFnYTJWNVhHNGdJQ0FnY21WMGRYSnVJRXRsZVVWelkyRndaVlYwYVd4ekxtVnpZMkZ3WlNoamIyMXdiMjVsYm5RdWEyVjVLVHRjYmlBZ2ZWeHVJQ0F2THlCSmJYQnNhV05wZENCclpYa2daR1YwWlhKdGFXNWxaQ0JpZVNCMGFHVWdhVzVrWlhnZ2FXNGdkR2hsSUhObGRGeHVJQ0J5WlhSMWNtNGdhVzVrWlhndWRHOVRkSEpwYm1jb016WXBPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFQndZWEpoYlNCN1B5cDlJR05vYVd4a2NtVnVJRU5vYVd4a2NtVnVJSFJ5WldVZ1kyOXVkR0ZwYm1WeUxseHVJQ29nUUhCaGNtRnRJSHNoYzNSeWFXNW5mU0J1WVcxbFUyOUdZWElnVG1GdFpTQnZaaUIwYUdVZ2EyVjVJSEJoZEdnZ2MyOGdabUZ5TGx4dUlDb2dRSEJoY21GdElIc2hablZ1WTNScGIyNTlJR05oYkd4aVlXTnJJRU5oYkd4aVlXTnJJSFJ2SUdsdWRtOXJaU0IzYVhSb0lHVmhZMmdnWTJocGJHUWdabTkxYm1RdVhHNGdLaUJBY0dGeVlXMGdlejhxZlNCMGNtRjJaWEp6WlVOdmJuUmxlSFFnVlhObFpDQjBieUJ3WVhOeklHbHVabTl5YldGMGFXOXVJSFJvY205MVoyaHZkWFFnZEdobElIUnlZWFpsY25OaGJGeHVJQ29nY0hKdlkyVnpjeTVjYmlBcUlFQnlaWFIxY200Z2V5RnVkVzFpWlhKOUlGUm9aU0J1ZFcxaVpYSWdiMllnWTJocGJHUnlaVzRnYVc0Z2RHaHBjeUJ6ZFdKMGNtVmxMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQjBjbUYyWlhKelpVRnNiRU5vYVd4a2NtVnVTVzF3YkNoamFHbHNaSEpsYml3Z2JtRnRaVk52Um1GeUxDQmpZV3hzWW1GamF5d2dkSEpoZG1WeWMyVkRiMjUwWlhoMEtTQjdYRzRnSUhaaGNpQjBlWEJsSUQwZ2RIbHdaVzltSUdOb2FXeGtjbVZ1TzF4dVhHNGdJR2xtSUNoMGVYQmxJRDA5UFNBbmRXNWtaV1pwYm1Wa0p5QjhmQ0IwZVhCbElEMDlQU0FuWW05dmJHVmhiaWNwSUh0Y2JpQWdJQ0F2THlCQmJHd2diMllnZEdobElHRmliM1psSUdGeVpTQndaWEpqWldsMlpXUWdZWE1nYm5Wc2JDNWNiaUFnSUNCamFHbHNaSEpsYmlBOUlHNTFiR3c3WEc0Z0lIMWNibHh1SUNCcFppQW9ZMmhwYkdSeVpXNGdQVDA5SUc1MWJHd2dmSHdnZEhsd1pTQTlQVDBnSjNOMGNtbHVaeWNnZkh3Z2RIbHdaU0E5UFQwZ0oyNTFiV0psY2ljZ2ZId2dVbVZoWTNSRmJHVnRaVzUwTG1selZtRnNhV1JGYkdWdFpXNTBLR05vYVd4a2NtVnVLU2tnZTF4dUlDQWdJR05oYkd4aVlXTnJLSFJ5WVhabGNuTmxRMjl1ZEdWNGRDd2dZMmhwYkdSeVpXNHNYRzRnSUNBZ0x5OGdTV1lnYVhRbmN5QjBhR1VnYjI1c2VTQmphR2xzWkN3Z2RISmxZWFFnZEdobElHNWhiV1VnWVhNZ2FXWWdhWFFnZDJGeklIZHlZWEJ3WldRZ2FXNGdZVzRnWVhKeVlYbGNiaUFnSUNBdkx5QnpieUIwYUdGMElHbDBKM01nWTI5dWMybHpkR1Z1ZENCcFppQjBhR1VnYm5WdFltVnlJRzltSUdOb2FXeGtjbVZ1SUdkeWIzZHpMbHh1SUNBZ0lHNWhiV1ZUYjBaaGNpQTlQVDBnSnljZ1B5QlRSVkJCVWtGVVQxSWdLeUJuWlhSRGIyMXdiMjVsYm5STFpYa29ZMmhwYkdSeVpXNHNJREFwSURvZ2JtRnRaVk52Um1GeUtUdGNiaUFnSUNCeVpYUjFjbTRnTVR0Y2JpQWdmVnh1WEc0Z0lIWmhjaUJqYUdsc1pEdGNiaUFnZG1GeUlHNWxlSFJPWVcxbE8xeHVJQ0IyWVhJZ2MzVmlkSEpsWlVOdmRXNTBJRDBnTURzZ0x5OGdRMjkxYm5RZ2IyWWdZMmhwYkdSeVpXNGdabTkxYm1RZ2FXNGdkR2hsSUdOMWNuSmxiblFnYzNWaWRISmxaUzVjYmlBZ2RtRnlJRzVsZUhST1lXMWxVSEpsWm1sNElEMGdibUZ0WlZOdlJtRnlJRDA5UFNBbkp5QS9JRk5GVUVGU1FWUlBVaUE2SUc1aGJXVlRiMFpoY2lBcklGTlZRbE5GVUVGU1FWUlBVanRjYmx4dUlDQnBaaUFvUVhKeVlYa3VhWE5CY25KaGVTaGphR2xzWkhKbGJpa3BJSHRjYmlBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJR05vYVd4a2NtVnVMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCamFHbHNaQ0E5SUdOb2FXeGtjbVZ1VzJsZE8xeHVJQ0FnSUNBZ2JtVjRkRTVoYldVZ1BTQnVaWGgwVG1GdFpWQnlaV1pwZUNBcklHZGxkRU52YlhCdmJtVnVkRXRsZVNoamFHbHNaQ3dnYVNrN1hHNGdJQ0FnSUNCemRXSjBjbVZsUTI5MWJuUWdLejBnZEhKaGRtVnljMlZCYkd4RGFHbHNaSEpsYmtsdGNHd29ZMmhwYkdRc0lHNWxlSFJPWVcxbExDQmpZV3hzWW1GamF5d2dkSEpoZG1WeWMyVkRiMjUwWlhoMEtUdGNiaUFnSUNCOVhHNGdJSDBnWld4elpTQjdYRzRnSUNBZ2RtRnlJR2wwWlhKaGRHOXlSbTRnUFNCblpYUkpkR1Z5WVhSdmNrWnVLR05vYVd4a2NtVnVLVHRjYmlBZ0lDQnBaaUFvYVhSbGNtRjBiM0pHYmlrZ2UxeHVJQ0FnSUNBZ2RtRnlJR2wwWlhKaGRHOXlJRDBnYVhSbGNtRjBiM0pHYmk1allXeHNLR05vYVd4a2NtVnVLVHRjYmlBZ0lDQWdJSFpoY2lCemRHVndPMXh1SUNBZ0lDQWdhV1lnS0dsMFpYSmhkRzl5Um00Z0lUMDlJR05vYVd4a2NtVnVMbVZ1ZEhKcFpYTXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHbHBJRDBnTUR0Y2JpQWdJQ0FnSUNBZ2QyaHBiR1VnS0NFb2MzUmxjQ0E5SUdsMFpYSmhkRzl5TG01bGVIUW9LU2t1Wkc5dVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUdOb2FXeGtJRDBnYzNSbGNDNTJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ0lDQnVaWGgwVG1GdFpTQTlJRzVsZUhST1lXMWxVSEpsWm1sNElDc2daMlYwUTI5dGNHOXVaVzUwUzJWNUtHTm9hV3hrTENCcGFTc3JLVHRjYmlBZ0lDQWdJQ0FnSUNCemRXSjBjbVZsUTI5MWJuUWdLejBnZEhKaGRtVnljMlZCYkd4RGFHbHNaSEpsYmtsdGNHd29ZMmhwYkdRc0lHNWxlSFJPWVcxbExDQmpZV3hzWW1GamF5d2dkSEpoZG1WeWMyVkRiMjUwWlhoMEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdhV1lnS0hCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljcElIdGNiaUFnSUNBZ0lDQWdJQ0IyWVhJZ2JXRndjMEZ6UTJocGJHUnlaVzVCWkdSbGJtUjFiU0E5SUNjbk8xeHVJQ0FnSUNBZ0lDQWdJR2xtSUNoU1pXRmpkRU4xY25KbGJuUlBkMjVsY2k1amRYSnlaVzUwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2JXRndjMEZ6UTJocGJHUnlaVzVQZDI1bGNrNWhiV1VnUFNCU1pXRmpkRU4xY25KbGJuUlBkMjVsY2k1amRYSnlaVzUwTG1kbGRFNWhiV1VvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodFlYQnpRWE5EYUdsc1pISmxiazkzYm1WeVRtRnRaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0J0WVhCelFYTkRhR2xzWkhKbGJrRmtaR1Z1WkhWdElEMGdKeUJEYUdWamF5QjBhR1VnY21WdVpHVnlJRzFsZEdodlpDQnZaaUJnSnlBcklHMWhjSE5CYzBOb2FXeGtjbVZ1VDNkdVpYSk9ZVzFsSUNzZ0oyQXVKenRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ2NISnZZMlZ6Y3k1bGJuWXVUazlFUlY5RlRsWWdJVDA5SUNkd2NtOWtkV04wYVc5dUp5QS9JSGRoY201cGJtY29aR2xrVjJGeWJrRmliM1YwVFdGd2N5d2dKMVZ6YVc1bklFMWhjSE1nWVhNZ1kyaHBiR1J5Wlc0Z2FYTWdibTkwSUhsbGRDQm1kV3hzZVNCemRYQndiM0owWldRdUlFbDBJR2x6SUdGdUlDY2dLeUFuWlhod1pYSnBiV1Z1ZEdGc0lHWmxZWFIxY21VZ2RHaGhkQ0J0YVdkb2RDQmlaU0J5WlcxdmRtVmtMaUJEYjI1MlpYSjBJR2wwSUhSdklHRWdKeUFySUNkelpYRjFaVzVqWlNBdklHbDBaWEpoWW14bElHOW1JR3RsZVdWa0lGSmxZV04wUld4bGJXVnVkSE1nYVc1emRHVmhaQzRsY3ljc0lHMWhjSE5CYzBOb2FXeGtjbVZ1UVdSa1pXNWtkVzBwSURvZ2RtOXBaQ0F3TzF4dUlDQWdJQ0FnSUNBZ0lHUnBaRmRoY201QlltOTFkRTFoY0hNZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDOHZJRWwwWlhKaGRHOXlJSGRwYkd3Z2NISnZkbWxrWlNCbGJuUnllU0JiYXl4MlhTQjBkWEJzWlhNZ2NtRjBhR1Z5SUhSb1lXNGdkbUZzZFdWekxseHVJQ0FnSUNBZ0lDQjNhR2xzWlNBb0lTaHpkR1Z3SUQwZ2FYUmxjbUYwYjNJdWJtVjRkQ2dwS1M1a2IyNWxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJR1Z1ZEhKNUlEMGdjM1JsY0M1MllXeDFaVHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9aVzUwY25rcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOb2FXeGtJRDBnWlc1MGNubGJNVjA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnVaWGgwVG1GdFpTQTlJRzVsZUhST1lXMWxVSEpsWm1sNElDc2dTMlY1UlhOallYQmxWWFJwYkhNdVpYTmpZWEJsS0dWdWRISjVXekJkS1NBcklGTlZRbE5GVUVGU1FWUlBVaUFySUdkbGRFTnZiWEJ2Ym1WdWRFdGxlU2hqYUdsc1pDd2dNQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpkV0owY21WbFEyOTFiblFnS3owZ2RISmhkbVZ5YzJWQmJHeERhR2xzWkhKbGJrbHRjR3dvWTJocGJHUXNJRzVsZUhST1lXMWxMQ0JqWVd4c1ltRmpheXdnZEhKaGRtVnljMlZEYjI1MFpYaDBLVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1VnUFQwOUlDZHZZbXBsWTNRbktTQjdYRzRnSUNBZ0lDQjJZWElnWVdSa1pXNWtkVzBnUFNBbkp6dGNiaUFnSUNBZ0lHbG1JQ2h3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM0J5YjJSMVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lHRmtaR1Z1WkhWdElEMGdKeUJKWmlCNWIzVWdiV1ZoYm5RZ2RHOGdjbVZ1WkdWeUlHRWdZMjlzYkdWamRHbHZiaUJ2WmlCamFHbHNaSEpsYml3Z2RYTmxJR0Z1SUdGeWNtRjVJQ2NnS3lBbmFXNXpkR1ZoWkNCdmNpQjNjbUZ3SUhSb1pTQnZZbXBsWTNRZ2RYTnBibWNnWTNKbFlYUmxSbkpoWjIxbGJuUW9iMkpxWldOMEtTQm1jbTl0SUhSb1pTQW5JQ3NnSjFKbFlXTjBJR0ZrWkMxdmJuTXVKenRjYmlBZ0lDQWdJQ0FnYVdZZ0tHTm9hV3hrY21WdUxsOXBjMUpsWVdOMFJXeGxiV1Z1ZENrZ2UxeHVJQ0FnSUNBZ0lDQWdJR0ZrWkdWdVpIVnRJRDBnSnlCSmRDQnNiMjlyY3lCc2FXdGxJSGx2ZFZ4Y0ozSmxJSFZ6YVc1bklHRnVJR1ZzWlcxbGJuUWdZM0psWVhSbFpDQmllU0JoSUdScFptWmxjbVZ1ZENBbklDc2dKM1psY25OcGIyNGdiMllnVW1WaFkzUXVJRTFoYTJVZ2MzVnlaU0IwYnlCMWMyVWdiMjVzZVNCdmJtVWdZMjl3ZVNCdlppQlNaV0ZqZEM0bk8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNoU1pXRmpkRU4xY25KbGJuUlBkMjVsY2k1amRYSnlaVzUwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdkbUZ5SUc1aGJXVWdQU0JTWldGamRFTjFjbkpsYm5SUGQyNWxjaTVqZFhKeVpXNTBMbWRsZEU1aGJXVW9LVHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9ibUZ0WlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWVdSa1pXNWtkVzBnS3owZ0p5QkRhR1ZqYXlCMGFHVWdjbVZ1WkdWeUlHMWxkR2h2WkNCdlppQmdKeUFySUc1aGJXVWdLeUFuWUM0bk8xeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnZG1GeUlHTm9hV3hrY21WdVUzUnlhVzVuSUQwZ1UzUnlhVzVuS0dOb2FXeGtjbVZ1S1R0Y2JpQWdJQ0FnSUNGbVlXeHpaU0EvSUhCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljZ1B5QnBiblpoY21saGJuUW9abUZzYzJVc0lDZFBZbXBsWTNSeklHRnlaU0J1YjNRZ2RtRnNhV1FnWVhNZ1lTQlNaV0ZqZENCamFHbHNaQ0FvWm05MWJtUTZJQ1Z6S1M0bGN5Y3NJR05vYVd4a2NtVnVVM1J5YVc1bklEMDlQU0FuVzI5aWFtVmpkQ0JQWW1wbFkzUmRKeUEvSUNkdlltcGxZM1FnZDJsMGFDQnJaWGx6SUhzbklDc2dUMkpxWldOMExtdGxlWE1vWTJocGJHUnlaVzRwTG1wdmFXNG9KeXdnSnlrZ0t5QW5mU2NnT2lCamFHbHNaSEpsYmxOMGNtbHVaeXdnWVdSa1pXNWtkVzBwSURvZ1gzQnliMlJKYm5aaGNtbGhiblFvSnpNeEp5d2dZMmhwYkdSeVpXNVRkSEpwYm1jZ1BUMDlJQ2RiYjJKcVpXTjBJRTlpYW1WamRGMG5JRDhnSjI5aWFtVmpkQ0IzYVhSb0lHdGxlWE1nZXljZ0t5QlBZbXBsWTNRdWEyVjVjeWhqYUdsc1pISmxiaWt1YW05cGJpZ25MQ0FuS1NBcklDZDlKeUE2SUdOb2FXeGtjbVZ1VTNSeWFXNW5MQ0JoWkdSbGJtUjFiU2tnT2lCMmIybGtJREE3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSE4xWW5SeVpXVkRiM1Z1ZER0Y2JuMWNibHh1THlvcVhHNGdLaUJVY21GMlpYSnpaWE1nWTJocGJHUnlaVzRnZEdoaGRDQmhjbVVnZEhsd2FXTmhiR3g1SUhOd1pXTnBabWxsWkNCaGN5QmdjSEp2Y0hNdVkyaHBiR1J5Wlc1Z0xDQmlkWFJjYmlBcUlHMXBaMmgwSUdGc2MyOGdZbVVnYzNCbFkybG1hV1ZrSUhSb2NtOTFaMmdnWVhSMGNtbGlkWFJsY3pwY2JpQXFYRzRnS2lBdElHQjBjbUYyWlhKelpVRnNiRU5vYVd4a2NtVnVLSFJvYVhNdWNISnZjSE11WTJocGJHUnlaVzRzSUM0dUxpbGdYRzRnS2lBdElHQjBjbUYyWlhKelpVRnNiRU5vYVd4a2NtVnVLSFJvYVhNdWNISnZjSE11YkdWbWRGQmhibVZzUTJocGJHUnlaVzRzSUM0dUxpbGdYRzRnS2x4dUlDb2dWR2hsSUdCMGNtRjJaWEp6WlVOdmJuUmxlSFJnSUdseklHRnVJRzl3ZEdsdmJtRnNJR0Z5WjNWdFpXNTBJSFJvWVhRZ2FYTWdjR0Z6YzJWa0lIUm9jbTkxWjJnZ2RHaGxYRzRnS2lCbGJuUnBjbVVnZEhKaGRtVnljMkZzTGlCSmRDQmpZVzRnWW1VZ2RYTmxaQ0IwYnlCemRHOXlaU0JoWTJOMWJYVnNZWFJwYjI1eklHOXlJR0Z1ZVhSb2FXNW5JR1ZzYzJVZ2RHaGhkRnh1SUNvZ2RHaGxJR05oYkd4aVlXTnJJRzFwWjJoMElHWnBibVFnY21Wc1pYWmhiblF1WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHMvS24wZ1kyaHBiR1J5Wlc0Z1EyaHBiR1J5Wlc0Z2RISmxaU0J2WW1wbFkzUXVYRzRnS2lCQWNHRnlZVzBnZXlGbWRXNWpkR2x2Ym4wZ1kyRnNiR0poWTJzZ1ZHOGdhVzUyYjJ0bElIVndiMjRnZEhKaGRtVnljMmx1WnlCbFlXTm9JR05vYVd4a0xseHVJQ29nUUhCaGNtRnRJSHMvS24wZ2RISmhkbVZ5YzJWRGIyNTBaWGgwSUVOdmJuUmxlSFFnWm05eUlIUnlZWFpsY25OaGJDNWNiaUFxSUVCeVpYUjFjbTRnZXlGdWRXMWlaWEo5SUZSb1pTQnVkVzFpWlhJZ2IyWWdZMmhwYkdSeVpXNGdhVzRnZEdocGN5QnpkV0owY21WbExseHVJQ292WEc1bWRXNWpkR2x2YmlCMGNtRjJaWEp6WlVGc2JFTm9hV3hrY21WdUtHTm9hV3hrY21WdUxDQmpZV3hzWW1GamF5d2dkSEpoZG1WeWMyVkRiMjUwWlhoMEtTQjdYRzRnSUdsbUlDaGphR2xzWkhKbGJpQTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ2NtVjBkWEp1SURBN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2RISmhkbVZ5YzJWQmJHeERhR2xzWkhKbGJrbHRjR3dvWTJocGJHUnlaVzRzSUNjbkxDQmpZV3hzWW1GamF5d2dkSEpoZG1WeWMyVkRiMjUwWlhoMEtUdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCMGNtRjJaWEp6WlVGc2JFTm9hV3hrY21WdU95SmRmUT09IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbmQgZGlzY2FyZHMgaW5wdXRzOyBpdCBoYXMgbm8gc2lkZSBlZmZlY3RzLiBUaGlzIGlzXG4gKiBwcmltYXJpbHkgdXNlZnVsIGlkaW9tYXRpY2FsbHkgZm9yIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIGVuZHBvaW50cyB3aGljaFxuICogYWx3YXlzIG5lZWQgdG8gYmUgY2FsbGFibGUsIHNpbmNlIEpTIGxhY2tzIGEgbnVsbC1jYWxsIGlkaW9tIGFsYSBDb2NvYS5cbiAqL1xudmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge307XG5cbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbjtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlID0gbWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCA9IG1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzO1xufTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIGFyZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW1wdHlGdW5jdGlvbjsiLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlbXB0eU9iamVjdDtcbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OW1ZbXB6TDJ4cFlpOWxiWEIwZVU5aWFtVmpkQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pTzBGQlFVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUtseHVJQ29nUTI5d2VYSnBaMmgwSUNoaktTQXlNREV6TFhCeVpYTmxiblFzSUVaaFkyVmliMjlyTENCSmJtTXVYRzRnS2lCQmJHd2djbWxuYUhSeklISmxjMlZ5ZG1Wa0xseHVJQ3BjYmlBcUlGUm9hWE1nYzI5MWNtTmxJR052WkdVZ2FYTWdiR2xqWlc1elpXUWdkVzVrWlhJZ2RHaGxJRUpUUkMxemRIbHNaU0JzYVdObGJuTmxJR1p2ZFc1a0lHbHVJSFJvWlZ4dUlDb2dURWxEUlU1VFJTQm1hV3hsSUdsdUlIUm9aU0J5YjI5MElHUnBjbVZqZEc5eWVTQnZaaUIwYUdseklITnZkWEpqWlNCMGNtVmxMaUJCYmlCaFpHUnBkR2x2Ym1Gc0lHZHlZVzUwWEc0Z0tpQnZaaUJ3WVhSbGJuUWdjbWxuYUhSeklHTmhiaUJpWlNCbWIzVnVaQ0JwYmlCMGFHVWdVRUZVUlU1VVV5Qm1hV3hsSUdsdUlIUm9aU0J6WVcxbElHUnBjbVZqZEc5eWVTNWNiaUFxWEc0Z0tpOWNibHh1SjNWelpTQnpkSEpwWTNRbk8xeHVYRzUyWVhJZ1pXMXdkSGxQWW1wbFkzUWdQU0I3ZlR0Y2JseHVhV1lnS0hCeWIyTmxjM011Wlc1MkxrNVBSRVZmUlU1V0lDRTlQU0FuY0hKdlpIVmpkR2x2YmljcElIdGNiaUFnVDJKcVpXTjBMbVp5WldWNlpTaGxiWEIwZVU5aWFtVmpkQ2s3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdaVzF3ZEhsUFltcGxZM1E3SWwxOSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5bVltcHpMMnhwWWk5cGJuWmhjbWxoYm5RdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUVOdmNIbHlhV2RvZENBb1l5a2dNakF4TXkxd2NtVnpaVzUwTENCR1lXTmxZbTl2YXl3Z1NXNWpMbHh1SUNvZ1FXeHNJSEpwWjJoMGN5QnlaWE5sY25abFpDNWNiaUFxWEc0Z0tpQlVhR2x6SUhOdmRYSmpaU0JqYjJSbElHbHpJR3hwWTJWdWMyVmtJSFZ1WkdWeUlIUm9aU0JDVTBRdGMzUjViR1VnYkdsalpXNXpaU0JtYjNWdVpDQnBiaUIwYUdWY2JpQXFJRXhKUTBWT1UwVWdabWxzWlNCcGJpQjBhR1VnY205dmRDQmthWEpsWTNSdmNua2diMllnZEdocGN5QnpiM1Z5WTJVZ2RISmxaUzRnUVc0Z1lXUmthWFJwYjI1aGJDQm5jbUZ1ZEZ4dUlDb2diMllnY0dGMFpXNTBJSEpwWjJoMGN5QmpZVzRnWW1VZ1ptOTFibVFnYVc0Z2RHaGxJRkJCVkVWT1ZGTWdabWxzWlNCcGJpQjBhR1VnYzJGdFpTQmthWEpsWTNSdmNua3VYRzRnS2x4dUlDb3ZYRzVjYmlkMWMyVWdjM1J5YVdOMEp6dGNibHh1THlvcVhHNGdLaUJWYzJVZ2FXNTJZWEpwWVc1MEtDa2dkRzhnWVhOelpYSjBJSE4wWVhSbElIZG9hV05vSUhsdmRYSWdjSEp2WjNKaGJTQmhjM04xYldWeklIUnZJR0psSUhSeWRXVXVYRzRnS2x4dUlDb2dVSEp2ZG1sa1pTQnpjSEpwYm5SbUxYTjBlV3hsSUdadmNtMWhkQ0FvYjI1c2VTQWxjeUJwY3lCemRYQndiM0owWldRcElHRnVaQ0JoY21kMWJXVnVkSE5jYmlBcUlIUnZJSEJ5YjNacFpHVWdhVzVtYjNKdFlYUnBiMjRnWVdKdmRYUWdkMmhoZENCaWNtOXJaU0JoYm1RZ2QyaGhkQ0I1YjNVZ2QyVnlaVnh1SUNvZ1pYaHdaV04wYVc1bkxseHVJQ3BjYmlBcUlGUm9aU0JwYm5aaGNtbGhiblFnYldWemMyRm5aU0IzYVd4c0lHSmxJSE4wY21sd2NHVmtJR2x1SUhCeWIyUjFZM1JwYjI0c0lHSjFkQ0IwYUdVZ2FXNTJZWEpwWVc1MFhHNGdLaUIzYVd4c0lISmxiV0ZwYmlCMGJ5Qmxibk4xY21VZ2JHOW5hV01nWkc5bGN5QnViM1FnWkdsbVptVnlJR2x1SUhCeWIyUjFZM1JwYjI0dVhHNGdLaTljYmx4dVpuVnVZM1JwYjI0Z2FXNTJZWEpwWVc1MEtHTnZibVJwZEdsdmJpd2dabTl5YldGMExDQmhMQ0JpTENCakxDQmtMQ0JsTENCbUtTQjdYRzRnSUdsbUlDaHdjbTlqWlhOekxtVnVkaTVPVDBSRlgwVk9WaUFoUFQwZ0ozQnliMlIxWTNScGIyNG5LU0I3WEc0Z0lDQWdhV1lnS0dadmNtMWhkQ0E5UFQwZ2RXNWtaV1pwYm1Wa0tTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0oybHVkbUZ5YVdGdWRDQnlaWEYxYVhKbGN5QmhiaUJsY25KdmNpQnRaWE56WVdkbElHRnlaM1Z0Wlc1MEp5azdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdhV1lnS0NGamIyNWthWFJwYjI0cElIdGNiaUFnSUNCMllYSWdaWEp5YjNJN1hHNGdJQ0FnYVdZZ0tHWnZjbTFoZENBOVBUMGdkVzVrWldacGJtVmtLU0I3WEc0Z0lDQWdJQ0JsY25KdmNpQTlJRzVsZHlCRmNuSnZjaWduVFdsdWFXWnBaV1FnWlhoalpYQjBhVzl1SUc5alkzVnljbVZrT3lCMWMyVWdkR2hsSUc1dmJpMXRhVzVwWm1sbFpDQmtaWFlnWlc1MmFYSnZibTFsYm5RZ0p5QXJJQ2RtYjNJZ2RHaGxJR1oxYkd3Z1pYSnliM0lnYldWemMyRm5aU0JoYm1RZ1lXUmthWFJwYjI1aGJDQm9aV3h3Wm5Wc0lIZGhjbTVwYm1kekxpY3BPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMllYSWdZWEpuY3lBOUlGdGhMQ0JpTENCakxDQmtMQ0JsTENCbVhUdGNiaUFnSUNBZ0lIWmhjaUJoY21kSmJtUmxlQ0E5SURBN1hHNGdJQ0FnSUNCbGNuSnZjaUE5SUc1bGR5QkZjbkp2Y2lobWIzSnRZWFF1Y21Wd2JHRmpaU2d2SlhNdlp5d2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWVhKbmMxdGhjbWRKYm1SbGVDc3JYVHRjYmlBZ0lDQWdJSDBwS1R0Y2JpQWdJQ0FnSUdWeWNtOXlMbTVoYldVZ1BTQW5TVzUyWVhKcFlXNTBJRlpwYjJ4aGRHbHZiaWM3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdaWEp5YjNJdVpuSmhiV1Z6Vkc5UWIzQWdQU0F4T3lBdkx5QjNaU0JrYjI0bmRDQmpZWEpsSUdGaWIzVjBJR2x1ZG1GeWFXRnVkQ2R6SUc5M2JpQm1jbUZ0WlZ4dUlDQWdJSFJvY205M0lHVnljbTl5TzF4dUlDQjlYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2FXNTJZWEpwWVc1ME95SmRmUT09IiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrcyBzdGF0aWMtb25seVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJy4vaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhbiBlbnVtZXJhdGlvbiB3aXRoIGtleXMgZXF1YWwgdG8gdGhlaXIgdmFsdWUuXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICB2YXIgQ09MT1JTID0ga2V5TWlycm9yKHtibHVlOiBudWxsLCByZWQ6IG51bGx9KTtcbiAqICAgdmFyIG15Q29sb3IgPSBDT0xPUlMuYmx1ZTtcbiAqICAgdmFyIGlzQ29sb3JWYWxpZCA9ICEhQ09MT1JTW215Q29sb3JdO1xuICpcbiAqIFRoZSBsYXN0IGxpbmUgY291bGQgbm90IGJlIHBlcmZvcm1lZCBpZiB0aGUgdmFsdWVzIG9mIHRoZSBnZW5lcmF0ZWQgZW51bSB3ZXJlXG4gKiBub3QgZXF1YWwgdG8gdGhlaXIga2V5cy5cbiAqXG4gKiAgIElucHV0OiAge2tleTE6IHZhbDEsIGtleTI6IHZhbDJ9XG4gKiAgIE91dHB1dDoge2tleTE6IGtleTEsIGtleTI6IGtleTJ9XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG52YXIga2V5TWlycm9yID0gZnVuY3Rpb24ga2V5TWlycm9yKG9iaikge1xuICB2YXIgcmV0ID0ge307XG4gIHZhciBrZXk7XG4gICEob2JqIGluc3RhbmNlb2YgT2JqZWN0ICYmICFBcnJheS5pc0FycmF5KG9iaikpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2tleU1pcnJvciguLi4pOiBBcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIGZvciAoa2V5IGluIG9iaikge1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXRba2V5XSA9IGtleTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBrZXlNaXJyb3I7XG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTltWW1wekwyeHBZaTlyWlhsTmFYSnliM0l1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMjl3ZVhKcFoyaDBJQ2hqS1NBeU1ERXpMWEJ5WlhObGJuUXNJRVpoWTJWaWIyOXJMQ0JKYm1NdVhHNGdLaUJCYkd3Z2NtbG5hSFJ6SUhKbGMyVnlkbVZrTGx4dUlDcGNiaUFxSUZSb2FYTWdjMjkxY21ObElHTnZaR1VnYVhNZ2JHbGpaVzV6WldRZ2RXNWtaWElnZEdobElFSlRSQzF6ZEhsc1pTQnNhV05sYm5ObElHWnZkVzVrSUdsdUlIUm9aVnh1SUNvZ1RFbERSVTVUUlNCbWFXeGxJR2x1SUhSb1pTQnliMjkwSUdScGNtVmpkRzl5ZVNCdlppQjBhR2x6SUhOdmRYSmpaU0IwY21WbExpQkJiaUJoWkdScGRHbHZibUZzSUdkeVlXNTBYRzRnS2lCdlppQndZWFJsYm5RZ2NtbG5hSFJ6SUdOaGJpQmlaU0JtYjNWdVpDQnBiaUIwYUdVZ1VFRlVSVTVVVXlCbWFXeGxJR2x1SUhSb1pTQnpZVzFsSUdScGNtVmpkRzl5ZVM1Y2JpQXFYRzRnS2lCQWRIbHdaV05vWldOcmN5QnpkR0YwYVdNdGIyNXNlVnh1SUNvdlhHNWNiaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHVkbUZ5SUdsdWRtRnlhV0Z1ZENBOUlISmxjWFZwY21Vb0p5NHZhVzUyWVhKcFlXNTBKeWs3WEc1Y2JpOHFLbHh1SUNvZ1EyOXVjM1J5ZFdOMGN5QmhiaUJsYm5WdFpYSmhkR2x2YmlCM2FYUm9JR3RsZVhNZ1pYRjFZV3dnZEc4Z2RHaGxhWElnZG1Gc2RXVXVYRzRnS2x4dUlDb2dSbTl5SUdWNFlXMXdiR1U2WEc0Z0tseHVJQ29nSUNCMllYSWdRMDlNVDFKVElEMGdhMlY1VFdseWNtOXlLSHRpYkhWbE9pQnVkV3hzTENCeVpXUTZJRzUxYkd4OUtUdGNiaUFxSUNBZ2RtRnlJRzE1UTI5c2IzSWdQU0JEVDB4UFVsTXVZbXgxWlR0Y2JpQXFJQ0FnZG1GeUlHbHpRMjlzYjNKV1lXeHBaQ0E5SUNFaFEwOU1UMUpUVzIxNVEyOXNiM0pkTzF4dUlDcGNiaUFxSUZSb1pTQnNZWE4wSUd4cGJtVWdZMjkxYkdRZ2JtOTBJR0psSUhCbGNtWnZjbTFsWkNCcFppQjBhR1VnZG1Gc2RXVnpJRzltSUhSb1pTQm5aVzVsY21GMFpXUWdaVzUxYlNCM1pYSmxYRzRnS2lCdWIzUWdaWEYxWVd3Z2RHOGdkR2hsYVhJZ2EyVjVjeTVjYmlBcVhHNGdLaUFnSUVsdWNIVjBPaUFnZTJ0bGVURTZJSFpoYkRFc0lHdGxlVEk2SUhaaGJESjlYRzRnS2lBZ0lFOTFkSEIxZERvZ2UydGxlVEU2SUd0bGVURXNJR3RsZVRJNklHdGxlVEo5WEc0Z0tseHVJQ29nUUhCaGNtRnRJSHR2WW1wbFkzUjlJRzlpYWx4dUlDb2dRSEpsZEhWeWJpQjdiMkpxWldOMGZWeHVJQ292WEc1MllYSWdhMlY1VFdseWNtOXlJRDBnWm5WdVkzUnBiMjRnYTJWNVRXbHljbTl5S0c5aWFpa2dlMXh1SUNCMllYSWdjbVYwSUQwZ2UzMDdYRzRnSUhaaGNpQnJaWGs3WEc0Z0lDRW9iMkpxSUdsdWMzUmhibU5sYjJZZ1QySnFaV04wSUNZbUlDRkJjbkpoZVM1cGMwRnljbUY1S0c5aWFpa3BJRDhnY0hKdlkyVnpjeTVsYm5ZdVRrOUVSVjlGVGxZZ0lUMDlJQ2R3Y205a2RXTjBhVzl1SnlBL0lHbHVkbUZ5YVdGdWRDaG1ZV3h6WlN3Z0oydGxlVTFwY25KdmNpZ3VMaTRwT2lCQmNtZDFiV1Z1ZENCdGRYTjBJR0psSUdGdUlHOWlhbVZqZEM0bktTQTZJR2x1ZG1GeWFXRnVkQ2htWVd4elpTa2dPaUIyYjJsa0lEQTdYRzRnSUdadmNpQW9hMlY1SUdsdUlHOWlhaWtnZTF4dUlDQWdJR2xtSUNnaGIySnFMbWhoYzA5M2JsQnliM0JsY25SNUtHdGxlU2twSUh0Y2JpQWdJQ0FnSUdOdmJuUnBiblZsTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFJiYTJWNVhTQTlJR3RsZVR0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnY21WME8xeHVmVHRjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCclpYbE5hWEp5YjNJN0lsMTkiLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKipcbiAqIEFsbG93cyBleHRyYWN0aW9uIG9mIGEgbWluaWZpZWQga2V5LiBMZXQncyB0aGUgYnVpbGQgc3lzdGVtIG1pbmlmeSBrZXlzXG4gKiB3aXRob3V0IGxvc2luZyB0aGUgYWJpbGl0eSB0byBkeW5hbWljYWxseSB1c2Uga2V5IHN0cmluZ3MgYXMgdmFsdWVzXG4gKiB0aGVtc2VsdmVzLiBQYXNzIGluIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIGtleS92YWwgcGFpciBhbmQgaXQgd2lsbCByZXR1cm5cbiAqIHlvdSB0aGUgc3RyaW5nIGtleSBvZiB0aGF0IHNpbmdsZSByZWNvcmQuIFN1cHBvc2UgeW91IHdhbnQgdG8gZ3JhYiB0aGVcbiAqIHZhbHVlIGZvciBhIGtleSAnY2xhc3NOYW1lJyBpbnNpZGUgb2YgYW4gb2JqZWN0LiBLZXkvdmFsIG1pbmlmaWNhdGlvbiBtYXlcbiAqIGhhdmUgYWxpYXNlZCB0aGF0IGtleSB0byBiZSAneGExMicuIGtleU9mKHtjbGFzc05hbWU6IG51bGx9KSB3aWxsIHJldHVyblxuICogJ3hhMTInIGluIHRoYXQgY2FzZS4gUmVzb2x2ZSBrZXlzIHlvdSB3YW50IHRvIHVzZSBvbmNlIGF0IHN0YXJ0dXAgdGltZSwgdGhlblxuICogcmV1c2UgdGhvc2UgcmVzb2x1dGlvbnMuXG4gKi9cbnZhciBrZXlPZiA9IGZ1bmN0aW9uIGtleU9mKG9uZUtleU9iaikge1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBvbmVLZXlPYmopIHtcbiAgICBpZiAoIW9uZUtleU9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5T2Y7IiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gZW1wdHlGdW5jdGlvbjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCAoeCkge31cbiAgICB9O1xuXG4gICAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQpIHtcbiAgICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybWF0LmluZGV4T2YoJ0ZhaWxlZCBDb21wb3NpdGUgcHJvcFR5cGU6ICcpID09PSAwKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JlIENvbXBvc2l0ZUNvbXBvbmVudCBwcm9wdHlwZSBjaGVjay5cbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDogMCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFdhcm5pbmcuYXBwbHkodW5kZWZpbmVkLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgICAgfVxuICAgIH07XG4gIH0pKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OW1ZbXB6TDJ4cFlpOTNZWEp1YVc1bkxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMjl3ZVhKcFoyaDBJREl3TVRRdE1qQXhOU3dnUm1GalpXSnZiMnNzSUVsdVl5NWNiaUFxSUVGc2JDQnlhV2RvZEhNZ2NtVnpaWEoyWldRdVhHNGdLbHh1SUNvZ1ZHaHBjeUJ6YjNWeVkyVWdZMjlrWlNCcGN5QnNhV05sYm5ObFpDQjFibVJsY2lCMGFHVWdRbE5FTFhOMGVXeGxJR3hwWTJWdWMyVWdabTkxYm1RZ2FXNGdkR2hsWEc0Z0tpQk1TVU5GVGxORklHWnBiR1VnYVc0Z2RHaGxJSEp2YjNRZ1pHbHlaV04wYjNKNUlHOW1JSFJvYVhNZ2MyOTFjbU5sSUhSeVpXVXVJRUZ1SUdGa1pHbDBhVzl1WVd3Z1ozSmhiblJjYmlBcUlHOW1JSEJoZEdWdWRDQnlhV2RvZEhNZ1kyRnVJR0psSUdadmRXNWtJR2x1SUhSb1pTQlFRVlJGVGxSVElHWnBiR1VnYVc0Z2RHaGxJSE5oYldVZ1pHbHlaV04wYjNKNUxseHVJQ3BjYmlBcUwxeHVYRzRuZFhObElITjBjbWxqZENjN1hHNWNiblpoY2lCbGJYQjBlVVoxYm1OMGFXOXVJRDBnY21WeGRXbHlaU2duTGk5bGJYQjBlVVoxYm1OMGFXOXVKeWs3WEc1Y2JpOHFLbHh1SUNvZ1UybHRhV3hoY2lCMGJ5QnBiblpoY21saGJuUWdZblYwSUc5dWJIa2diRzluY3lCaElIZGhjbTVwYm1jZ2FXWWdkR2hsSUdOdmJtUnBkR2x2YmlCcGN5QnViM1FnYldWMExseHVJQ29nVkdocGN5QmpZVzRnWW1VZ2RYTmxaQ0IwYnlCc2IyY2dhWE56ZFdWeklHbHVJR1JsZG1Wc2IzQnRaVzUwSUdWdWRtbHliMjV0Wlc1MGN5QnBiaUJqY21sMGFXTmhiRnh1SUNvZ2NHRjBhSE11SUZKbGJXOTJhVzVuSUhSb1pTQnNiMmRuYVc1bklHTnZaR1VnWm05eUlIQnliMlIxWTNScGIyNGdaVzUyYVhKdmJtMWxiblJ6SUhkcGJHd2dhMlZsY0NCMGFHVmNiaUFxSUhOaGJXVWdiRzluYVdNZ1lXNWtJR1p2Ykd4dmR5QjBhR1VnYzJGdFpTQmpiMlJsSUhCaGRHaHpMbHh1SUNvdlhHNWNiblpoY2lCM1lYSnVhVzVuSUQwZ1pXMXdkSGxHZFc1amRHbHZianRjYmx4dWFXWWdLSEJ5YjJObGMzTXVaVzUyTGs1UFJFVmZSVTVXSUNFOVBTQW5jSEp2WkhWamRHbHZiaWNwSUh0Y2JpQWdLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0IyWVhJZ2NISnBiblJYWVhKdWFXNW5JRDBnWm5WdVkzUnBiMjRnY0hKcGJuUlhZWEp1YVc1bktHWnZjbTFoZENrZ2UxeHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ1gyeGxiaUE5SUdGeVozVnRaVzUwY3k1c1pXNW5kR2dzSUdGeVozTWdQU0JCY25KaGVTaGZiR1Z1SUQ0Z01TQS9JRjlzWlc0Z0xTQXhJRG9nTUNrc0lGOXJaWGtnUFNBeE95QmZhMlY1SUR3Z1gyeGxianNnWDJ0bGVTc3JLU0I3WEc0Z0lDQWdJQ0FnSUdGeVozTmJYMnRsZVNBdElERmRJRDBnWVhKbmRXMWxiblJ6VzE5clpYbGRPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0IyWVhJZ1lYSm5TVzVrWlhnZ1BTQXdPMXh1SUNBZ0lDQWdkbUZ5SUcxbGMzTmhaMlVnUFNBblYyRnlibWx1WnpvZ0p5QXJJR1p2Y20xaGRDNXlaWEJzWVdObEtDOGxjeTluTENCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhjbWR6VzJGeVowbHVaR1Y0S3l0ZE8xeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JR052Ym5OdmJHVWdJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ0lDQWdJR052Ym5OdmJHVXVaWEp5YjNJb2JXVnpjMkZuWlNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0F2THlBdExTMGdWMlZzWTI5dFpTQjBieUJrWldKMVoyZHBibWNnVW1WaFkzUWdMUzB0WEc0Z0lDQWdJQ0FnSUM4dklGUm9hWE1nWlhKeWIzSWdkMkZ6SUhSb2NtOTNiaUJoY3lCaElHTnZiblpsYm1sbGJtTmxJSE52SUhSb1lYUWdlVzkxSUdOaGJpQjFjMlVnZEdocGN5QnpkR0ZqYTF4dUlDQWdJQ0FnSUNBdkx5QjBieUJtYVc1a0lIUm9aU0JqWVd4c2MybDBaU0IwYUdGMElHTmhkWE5sWkNCMGFHbHpJSGRoY201cGJtY2dkRzhnWm1seVpTNWNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHMWxjM05oWjJVcE8xeHVJQ0FnSUNBZ2ZTQmpZWFJqYUNBb2VDa2dlMzFjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdkMkZ5Ym1sdVp5QTlJR1oxYm1OMGFXOXVJSGRoY201cGJtY29ZMjl1WkdsMGFXOXVMQ0JtYjNKdFlYUXBJSHRjYmlBZ0lDQWdJR2xtSUNobWIzSnRZWFFnUFQwOUlIVnVaR1ZtYVc1bFpDa2dlMXh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMkIzWVhKdWFXNW5LR052Ym1ScGRHbHZiaXdnWm05eWJXRjBMQ0F1TGk1aGNtZHpLV0FnY21WeGRXbHlaWE1nWVNCM1lYSnVhVzVuSUNjZ0t5QW5iV1Z6YzJGblpTQmhjbWQxYldWdWRDY3BPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JwWmlBb1ptOXliV0YwTG1sdVpHVjRUMllvSjBaaGFXeGxaQ0JEYjIxd2IzTnBkR1VnY0hKdmNGUjVjR1U2SUNjcElEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmpzZ0x5OGdTV2R1YjNKbElFTnZiWEJ2YzJsMFpVTnZiWEJ2Ym1WdWRDQndjbTl3ZEhsd1pTQmphR1ZqYXk1Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2FXWWdLQ0ZqYjI1a2FYUnBiMjRwSUh0Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ1gyeGxiaklnUFNCaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvTENCaGNtZHpJRDBnUVhKeVlYa29YMnhsYmpJZ1BpQXlJRDhnWDJ4bGJqSWdMU0F5SURvZ01Da3NJRjlyWlhreUlEMGdNanNnWDJ0bGVUSWdQQ0JmYkdWdU1qc2dYMnRsZVRJckt5a2dlMXh1SUNBZ0lDQWdJQ0FnSUdGeVozTmJYMnRsZVRJZ0xTQXlYU0E5SUdGeVozVnRaVzUwYzF0ZmEyVjVNbDA3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQndjbWx1ZEZkaGNtNXBibWN1WVhCd2JIa29kVzVrWldacGJtVmtMQ0JiWm05eWJXRjBYUzVqYjI1allYUW9ZWEpuY3lrcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNGdJSDBwS0NrN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnZDJGeWJtbHVaenNpWFgwPSIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9SZWFjdCcpO1xuIl19 | |
| 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})({1:[function(require,module,exports){ | |
| // shim for using process in browser | |
| var process = module.exports = {}; | |
| process.nextTick = (function () { | |
| var canSetImmediate = typeof window !== 'undefined' | |
| && window.setImmediate; | |
| var canMutationObserver = typeof window !== 'undefined' | |
| && window.MutationObserver; | |
| var canPost = typeof window !== 'undefined' | |
| && window.postMessage && window.addEventListener | |
| ; | |
| if (canSetImmediate) { | |
| return function (f) { return window.setImmediate(f) }; | |
| } | |
| var queue = []; | |
| if (canMutationObserver) { | |
| var hiddenDiv = document.createElement("div"); | |
| var observer = new MutationObserver(function () { | |
| var queueList = queue.slice(); | |
| queue.length = 0; | |
| queueList.forEach(function (fn) { | |
| fn(); | |
| }); | |
| }); | |
| observer.observe(hiddenDiv, { attributes: true }); | |
| return function nextTick(fn) { | |
| if (!queue.length) { | |
| hiddenDiv.setAttribute('yes', 'no'); | |
| } | |
| queue.push(fn); | |
| }; | |
| } | |
| if (canPost) { | |
| window.addEventListener('message', function (ev) { | |
| var source = ev.source; | |
| if ((source === window || source === null) && ev.data === 'process-tick') { | |
| ev.stopPropagation(); | |
| if (queue.length > 0) { | |
| var fn = queue.shift(); | |
| fn(); | |
| } | |
| } | |
| }, true); | |
| return function nextTick(fn) { | |
| queue.push(fn); | |
| window.postMessage('process-tick', '*'); | |
| }; | |
| } | |
| return function nextTick(fn) { | |
| setTimeout(fn, 0); | |
| }; | |
| })(); | |
| process.title = 'browser'; | |
| process.browser = true; | |
| process.env = {}; | |
| process.argv = []; | |
| function noop() {} | |
| process.on = noop; | |
| process.addListener = noop; | |
| process.once = noop; | |
| process.off = noop; | |
| process.removeListener = noop; | |
| process.removeAllListeners = noop; | |
| process.emit = noop; | |
| process.binding = function (name) { | |
| throw new Error('process.binding is not supported'); | |
| }; | |
| // TODO(shtylman) | |
| process.cwd = function () { return '/' }; | |
| process.chdir = function (dir) { | |
| throw new Error('process.chdir is not supported'); | |
| }; | |
| },{}],2:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule AutoFocusUtils | |
| */ | |
| 'use strict'; | |
| var ReactDOMComponentTree = require('./ReactDOMComponentTree'); | |
| var focusNode = require('fbjs/lib/focusNode'); | |
| var AutoFocusUtils = { | |
| focusDOMComponent: function () { | |
| focusNode(ReactDOMComponentTree.getNodeFromInstance(this)); | |
| } | |
| }; | |
| module.exports = AutoFocusUtils; | |
| },{"./ReactDOMComponentTree":42,"fbjs/lib/focusNode":148}],3:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule BeforeInputEventPlugin | |
| */ | |
| 'use strict'; | |
| var EventConstants = require('./EventConstants'); | |
| var EventPropagators = require('./EventPropagators'); | |
| var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment'); | |
| var FallbackCompositionState = require('./FallbackCompositionState'); | |
| var SyntheticCompositionEvent = require('./SyntheticCompositionEvent'); | |
| var SyntheticInputEvent = require('./SyntheticInputEvent'); | |
| var keyOf = require('fbjs/lib/keyOf'); | |
| var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space | |
| var START_KEYCODE = 229; | |
| var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window; | |
| var documentMode = null; | |
| if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) { | |
| documentMode = document.documentMode; | |
| } | |
| // Webkit offers a very useful `textInput` event that can be used to | |
| // directly represent `beforeInput`. The IE `textinput` event is not as | |
| // useful, so we don't use it. | |
| var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto(); | |
| // In IE9+, we have access to composition events, but the data supplied | |
| // by the native compositionend event may be incorrect. Japanese ideographic | |
| // spaces, for instance (\u3000) are not recorded correctly. | |
| var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); | |
| /** | |
| * Opera <= 12 includes TextEvent in window, but does not fire | |
| * text input events. Rely on keypress instead. | |
| */ | |
| function isPresto() { | |
| var opera = window.opera; | |
| return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12; | |
| } | |
| var SPACEBAR_CODE = 32; | |
| var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); | |
| var topLevelTypes = EventConstants.topLevelTypes; | |
| // Events and their corresponding property names. | |
| var eventTypes = { | |
| beforeInput: { | |
| phasedRegistrationNames: { | |
| bubbled: keyOf({ onBeforeInput: null }), | |
| captured: keyOf({ onBeforeInputCapture: null }) | |
| }, | |
| dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste] | |
| }, | |
| compositionEnd: { | |
| phasedRegistrationNames: { | |
| bubbled: keyOf({ onCompositionEnd: null }), | |
| captured: keyOf({ onCompositionEndCapture: null }) | |
| }, | |
| dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] | |
| }, | |
| compositionStart: { | |
| phasedRegistrationNames: { | |
| bubbled: keyOf({ onCompositionStart: null }), | |
| captured: keyOf({ onCompositionStartCapture: null }) | |
| }, | |
| dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] | |
| }, | |
| compositionUpdate: { | |
| phasedRegistrationNames: { | |
| bubbled: keyOf({ onCompositionUpdate: null }), | |
| captured: keyOf({ onCompositionUpdateCapture: null }) | |
| }, | |
| dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] | |
| } | |
| }; | |
| // Track whether we've ever handled a keypress on the space key. | |
| var hasSpaceKeypress = false; | |
| /** | |
| * Return whether a native keypress event is assumed to be a command. | |
| * This is required because Firefox fires `keypress` events for key commands | |
| * (cut, copy, select-all, etc.) even though no character is inserted. | |
| */ | |
| function isKeypressCommand(nativeEvent) { | |
| return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && | |
| // ctrlKey && altKey is equivalent to AltGr, and is not a command. | |
| !(nativeEvent.ctrlKey && nativeEvent.altKey); | |
| } | |
| /** | |
| * Translate native top level events into event types. | |
| * | |
| * @param {string} topLevelType | |
| * @return {object} | |
| */ | |
| function getCompositionEventType(topLevelType) { | |
| switch (topLevelType) { | |
| case topLevelTypes.topCompositionStart: | |
| return eventTypes.compositionStart; | |
| case topLevelTypes.topCompositionEnd: | |
| return eventTypes.compositionEnd; | |
| case topLevelTypes.topCompositionUpdate: | |
| return eventTypes.compositionUpdate; | |
| } | |
| } | |
| /** | |
| * Does our fallback best-guess model think this event signifies that | |
| * composition has begun? | |
| * | |
| * @param {string} topLevelType | |
| * @param {object} nativeEvent | |
| * @return {boolean} | |
| */ | |
| function isFallbackCompositionStart(topLevelType, nativeEvent) { | |
| return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE; | |
| } | |
| /** | |
| * Does our fallback mode think that this event is the end of composition? | |
| * | |
| * @param {string} topLevelType | |
| * @param {object} nativeEvent | |
| * @return {boolean} | |
| */ | |
| function isFallbackCompositionEnd(topLevelType, nativeEvent) { | |
| switch (topLevelType) { | |
| case topLevelTypes.topKeyUp: | |
| // Command keys insert or clear IME input. | |
| return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; | |
| case topLevelTypes.topKeyDown: | |
| // Expect IME keyCode on each keydown. If we get any other | |
| // code we must have exited earlier. | |
| return nativeEvent.keyCode !== START_KEYCODE; | |
| case topLevelTypes.topKeyPress: | |
| case topLevelTypes.topMouseDown: | |
| case topLevelTypes.topBlur: | |
| // Events are not possible without cancelling IME. | |
| return true; | |
| default: | |
| return false; | |
| } | |
| } | |
| /** | |
| * Google Input Tools provides composition data via a CustomEvent, | |
| * with the `data` property populated in the `detail` object. If this | |
| * is available on the event object, use it. If not, this is a plain | |
| * composition event and we have nothing special to extract. | |
| * | |
| * @param {object} nativeEvent | |
| * @return {?string} | |
| */ | |
| function getDataFromCustomEvent(nativeEvent) { | |
| var detail = nativeEvent.detail; | |
| if (typeof detail === 'object' && 'data' in detail) { | |
| return detail.data; | |
| } | |
| return null; | |
| } | |
| // Track the current IME composition fallback object, if any. | |
| var currentComposition = null; | |
| /** | |
| * @return {?object} A SyntheticCompositionEvent. | |
| */ | |
| function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { | |
| var eventType; | |
| var fallbackData; | |
| if (canUseCompositionEvent) { | |
| eventType = getCompositionEventType(topLevelType); | |
| } else if (!currentComposition) { | |
| if (isFallbackCompositionStart(topLevelType, nativeEvent)) { | |
| eventType = eventTypes.compositionStart; | |
| } | |
| } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { | |
| eventType = eventTypes.compositionEnd; | |
| } | |
| if (!eventType) { | |
| return null; | |
| } | |
| if (useFallbackCompositionData) { | |
| // The current composition is stored statically and must not be | |
| // overwritten while composition continues. | |
| if (!currentComposition && eventType === eventTypes.compositionStart) { | |
| currentComposition = FallbackCompositionState.getPooled(nativeEventTarget); | |
| } else if (eventType === eventTypes.compositionEnd) { | |
| if (currentComposition) { | |
| fallbackData = currentComposition.getData(); | |
| } | |
| } | |
| } | |
| var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget); | |
| if (fallbackData) { | |
| // Inject data generated from fallback path into the synthetic event. | |
| // This matches the property of native CompositionEventInterface. | |
| event.data = fallbackData; | |
| } else { | |
| var customData = getDataFromCustomEvent(nativeEvent); | |
| if (customData !== null) { | |
| event.data = customData; | |
| } | |
| } | |
| EventPropagators.accumulateTwoPhaseDispatches(event); | |
| return event; | |
| } | |
| /** | |
| * @param {string} topLevelType Record from `EventConstants`. | |
| * @param {object} nativeEvent Native browser event. | |
| * @return {?string} The string corresponding to this `beforeInput` event. | |
| */ | |
| function getNativeBeforeInputChars(topLevelType, nativeEvent) { | |
| switch (topLevelType) { | |
| case topLevelTypes.topCompositionEnd: | |
| return getDataFromCustomEvent(nativeEvent); | |
| case topLevelTypes.topKeyPress: | |
| /** | |
| * If native `textInput` events are available, our goal is to make | |
| * use of them. However, there is a special case: the spacebar key. | |
| * In Webkit, preventing default on a spacebar `textInput` event | |
| * cancels character insertion, but it *also* causes the browser | |
| * to fall back to its default spacebar behavior of scrolling the | |
| * page. | |
| * | |
| * Tracking at: | |
| * https://code.google.com/p/chromium/issues/detail?id=355103 | |
| * | |
| * To avoid this issue, use the keypress event as if no `textInput` | |
| * event is available. | |
| */ | |
| var which = nativeEvent.which; | |
| if (which !== SPACEBAR_CODE) { | |
| return null; | |
| } | |
| hasSpaceKeypress = true; | |
| return SPACEBAR_CHAR; | |
| case topLevelTypes.topTextInput: | |
| // Record the characters to be added to the DOM. | |
| var chars = nativeEvent.data; | |
| // If it's a spacebar character, assume that we have already handled | |
| // it at the keypress level and bail immediately. Android Chrome | |
| // doesn't give us keycodes, so we need to blacklist it. | |
| if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { | |
| return null; | |
| } | |
| return chars; | |
| default: | |
| // For other native event types, do nothing. | |
| return null; | |
| } | |
| } | |
| /** | |
| * For browsers that do not provide the `textInput` event, extract the | |
| * appropriate string to use for SyntheticInputEvent. | |
| * | |
| * @param {string} topLevelType Record from `EventConstants`. | |
| * @param {object} nativeEvent Native browser event. | |
| * @return {?string} The fallback string for this `beforeInput` event. | |
| */ | |
| function getFallbackBeforeInputChars(topLevelType, nativeEvent) { | |
| // If we are currently composing (IME) and using a fallback to do so, | |
| // try to extract the composed characters from the fallback object. | |
| // If composition event is available, we extract a string only at | |
| // compositionevent, otherwise extract it at fallback events. | |
| if (currentComposition) { | |
| if (topLevelType === topLevelTypes.topCompositionEnd || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) { | |
| var chars = currentComposition.getData(); | |
| FallbackCompositionState.release(currentComposition); | |
| currentComposition = null; | |
| return chars; | |
| } | |
| return null; | |
| } | |
| switch (topLevelType) { | |
| case topLevelTypes.topPaste: | |
| // If a paste event occurs after a keypress, throw out the input | |
| // chars. Paste events should not lead to BeforeInput events. | |
| return null; | |
| case topLevelTypes.topKeyPress: | |
| /** | |
| * As of v27, Firefox may fire keypress events even when no character | |
| * will be inserted. A few possibilities: | |
| * | |
| * - `which` is `0`. Arrow keys, Esc key, etc. | |
| * | |
| * - `which` is the pressed key code, but no char is available. | |
| * Ex: 'AltGr + d` in Polish. There is no modified character for | |
| * this key combination and no character is inserted into the | |
| * document, but FF fires the keypress for char code `100` anyway. | |
| * No `input` event will occur. | |
| * | |
| * - `which` is the pressed key code, but a command combination is | |
| * being used. Ex: `Cmd+C`. No character is inserted, and no | |
| * `input` event will occur. | |
| */ | |
| if (nativeEvent.which && !isKeypressCommand(nativeEvent)) { | |
| return String.fromCharCode(nativeEvent.which); | |
| } | |
| return null; | |
| case topLevelTypes.topCompositionEnd: | |
| return useFallbackCompositionData ? null : nativeEvent.data; | |
| default: | |
| return null; | |
| } | |
| } | |
| /** | |
| * Extract a SyntheticInputEvent for `beforeInput`, based on either native | |
| * `textInput` or fallback behavior. | |
| * | |
| * @return {?object} A SyntheticInputEvent. | |
| */ | |
| function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { | |
| var chars; | |
| if (canUseTextInputEvent) { | |
| chars = getNativeBeforeInputChars(topLevelType, nativeEvent); | |
| } else { | |
| chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); | |
| } | |
| // If no characters are being inserted, no BeforeInput event should | |
| // be fired. | |
| if (!chars) { | |
| return null; | |
| } | |
| var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget); | |
| event.data = chars; | |
| EventPropagators.accumulateTwoPhaseDispatches(event); | |
| return event; | |
| } | |
| /** | |
| * Create an `onBeforeInput` event to match | |
| * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. | |
| * | |
| * This event plugin is based on the native `textInput` event | |
| * available in Chrome, Safari, Opera, and IE. This event fires after | |
| * `onKeyPress` and `onCompositionEnd`, but before `onInput`. | |
| * | |
| * `beforeInput` is spec'd but not implemented in any browsers, and | |
| * the `input` event does not provide any useful information about what has | |
| * actually been added, contrary to the spec. Thus, `textInput` is the best | |
| * available event to identify the characters that have actually been inserted | |
| * into the target node. | |
| * | |
| * This plugin is also responsible for emitting `composition` events, thus | |
| * allowing us to share composition fallback code for both `beforeInput` and | |
| * `composition` event types. | |
| */ | |
| var BeforeInputEventPlugin = { | |
| eventTypes: eventTypes, | |
| extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { | |
| return [extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget)]; | |
| } | |
| }; | |
| module.exports = BeforeInputEventPlugin; | |
| },{"./EventConstants":17,"./EventPropagators":21,"./FallbackCompositionState":22,"./SyntheticCompositionEvent":96,"./SyntheticInputEvent":100,"fbjs/lib/ExecutionEnvironment":140,"fbjs/lib/keyOf":158}],4:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule CSSProperty | |
| */ | |
| 'use strict'; | |
| /** | |
| * CSS properties which accept numbers but are not in units of "px". | |
| */ | |
| var isUnitlessNumber = { | |
| animationIterationCount: true, | |
| borderImageOutset: true, | |
| borderImageSlice: true, | |
| borderImageWidth: true, | |
| boxFlex: true, | |
| boxFlexGroup: true, | |
| boxOrdinalGroup: true, | |
| columnCount: true, | |
| flex: true, | |
| flexGrow: true, | |
| flexPositive: true, | |
| flexShrink: true, | |
| flexNegative: true, | |
| flexOrder: true, | |
| gridRow: true, | |
| gridColumn: true, | |
| fontWeight: true, | |
| lineClamp: true, | |
| lineHeight: true, | |
| opacity: true, | |
| order: true, | |
| orphans: true, | |
| tabSize: true, | |
| widows: true, | |
| zIndex: true, | |
| zoom: true, | |
| // SVG-related properties | |
| fillOpacity: true, | |
| floodOpacity: true, | |
| stopOpacity: true, | |
| strokeDasharray: true, | |
| strokeDashoffset: true, | |
| strokeMiterlimit: true, | |
| strokeOpacity: true, | |
| strokeWidth: true | |
| }; | |
| /** | |
| * @param {string} prefix vendor-specific prefix, eg: Webkit | |
| * @param {string} key style name, eg: transitionDuration | |
| * @return {string} style name prefixed with `prefix`, properly camelCased, eg: | |
| * WebkitTransitionDuration | |
| */ | |
| function prefixKey(prefix, key) { | |
| return prefix + key.charAt(0).toUpperCase() + key.substring(1); | |
| } | |
| /** | |
| * Support style names that may come passed in prefixed by adding permutations | |
| * of vendor prefixes. | |
| */ | |
| var prefixes = ['Webkit', 'ms', 'Moz', 'O']; | |
| // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an | |
| // infinite loop, because it iterates over the newly added props too. | |
| Object.keys(isUnitlessNumber).forEach(function (prop) { | |
| prefixes.forEach(function (prefix) { | |
| isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; | |
| }); | |
| }); | |
| /** | |
| * Most style properties can be unset by doing .style[prop] = '' but IE8 | |
| * doesn't like doing that with shorthand properties so for the properties that | |
| * IE8 breaks on, which are listed here, we instead unset each of the | |
| * individual properties. See http://bugs.jquery.com/ticket/12385. | |
| * The 4-value 'clock' properties like margin, padding, border-width seem to | |
| * behave without any problems. Curiously, list-style works too without any | |
| * special prodding. | |
| */ | |
| var shorthandPropertyExpansions = { | |
| background: { | |
| backgroundAttachment: true, | |
| backgroundColor: true, | |
| backgroundImage: true, | |
| backgroundPositionX: true, | |
| backgroundPositionY: true, | |
| backgroundRepeat: true | |
| }, | |
| backgroundPosition: { | |
| backgroundPositionX: true, | |
| backgroundPositionY: true | |
| }, | |
| border: { | |
| borderWidth: true, | |
| borderStyle: true, | |
| borderColor: true | |
| }, | |
| borderBottom: { | |
| borderBottomWidth: true, | |
| borderBottomStyle: true, | |
| borderBottomColor: true | |
| }, | |
| borderLeft: { | |
| borderLeftWidth: true, | |
| borderLeftStyle: true, | |
| borderLeftColor: true | |
| }, | |
| borderRight: { | |
| borderRightWidth: true, | |
| borderRightStyle: true, | |
| borderRightColor: true | |
| }, | |
| borderTop: { | |
| borderTopWidth: true, | |
| borderTopStyle: true, | |
| borderTopColor: true | |
| }, | |
| font: { | |
| fontStyle: true, | |
| fontVariant: true, | |
| fontWeight: true, | |
| fontSize: true, | |
| lineHeight: true, | |
| fontFamily: true | |
| }, | |
| outline: { | |
| outlineWidth: true, | |
| outlineStyle: true, | |
| outlineColor: true | |
| } | |
| }; | |
| var CSSProperty = { | |
| isUnitlessNumber: isUnitlessNumber, | |
| shorthandPropertyExpansions: shorthandPropertyExpansions | |
| }; | |
| module.exports = CSSProperty; | |
| },{}],5:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule CSSPropertyOperations | |
| */ | |
| 'use strict'; | |
| var CSSProperty = require('./CSSProperty'); | |
| var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment'); | |
| var ReactInstrumentation = require('./ReactInstrumentation'); | |
| var camelizeStyleName = require('fbjs/lib/camelizeStyleName'); | |
| var dangerousStyleValue = require('./dangerousStyleValue'); | |
| var hyphenateStyleName = require('fbjs/lib/hyphenateStyleName'); | |
| var memoizeStringOnly = require('fbjs/lib/memoizeStringOnly'); | |
| var warning = require('fbjs/lib/warning'); | |
| var processStyleName = memoizeStringOnly(function (styleName) { | |
| return hyphenateStyleName(styleName); | |
| }); | |
| var hasShorthandPropertyBug = false; | |
| var styleFloatAccessor = 'cssFloat'; | |
| if (ExecutionEnvironment.canUseDOM) { | |
| var tempStyle = document.createElement('div').style; | |
| try { | |
| // IE8 throws "Invalid argument." if resetting shorthand style properties. | |
| tempStyle.font = ''; | |
| } catch (e) { | |
| hasShorthandPropertyBug = true; | |
| } | |
| // IE8 only supports accessing cssFloat (standard) as styleFloat | |
| if (document.documentElement.style.cssFloat === undefined) { | |
| styleFloatAccessor = 'styleFloat'; | |
| } | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| // 'msTransform' is correct, but the other prefixes should be capitalized | |
| var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; | |
| // style values shouldn't contain a semicolon | |
| var badStyleValueWithSemicolonPattern = /;\s*$/; | |
| var warnedStyleNames = {}; | |
| var warnedStyleValues = {}; | |
| var warnedForNaNValue = false; | |
| var warnHyphenatedStyleName = function (name, owner) { | |
| if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { | |
| return; | |
| } | |
| warnedStyleNames[name] = true; | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?%s', name, camelizeStyleName(name), checkRenderMessage(owner)) : void 0; | |
| }; | |
| var warnBadVendoredStyleName = function (name, owner) { | |
| if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { | |
| return; | |
| } | |
| warnedStyleNames[name] = true; | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?%s', name, name.charAt(0).toUpperCase() + name.slice(1), checkRenderMessage(owner)) : void 0; | |
| }; | |
| var warnStyleValueWithSemicolon = function (name, value, owner) { | |
| if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { | |
| return; | |
| } | |
| warnedStyleValues[value] = true; | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Style property values shouldn\'t contain a semicolon.%s ' + 'Try "%s: %s" instead.', checkRenderMessage(owner), name, value.replace(badStyleValueWithSemicolonPattern, '')) : void 0; | |
| }; | |
| var warnStyleValueIsNaN = function (name, value, owner) { | |
| if (warnedForNaNValue) { | |
| return; | |
| } | |
| warnedForNaNValue = true; | |
| process.env.NODE_ENV !== 'production' ? warning(false, '`NaN` is an invalid value for the `%s` css style property.%s', name, checkRenderMessage(owner)) : void 0; | |
| }; | |
| var checkRenderMessage = function (owner) { | |
| if (owner) { | |
| var name = owner.getName(); | |
| if (name) { | |
| return ' Check the render method of `' + name + '`.'; | |
| } | |
| } | |
| return ''; | |
| }; | |
| /** | |
| * @param {string} name | |
| * @param {*} value | |
| * @param {ReactDOMComponent} component | |
| */ | |
| var warnValidStyle = function (name, value, component) { | |
| var owner; | |
| if (component) { | |
| owner = component._currentElement._owner; | |
| } | |
| if (name.indexOf('-') > -1) { | |
| warnHyphenatedStyleName(name, owner); | |
| } else if (badVendoredStyleNamePattern.test(name)) { | |
| warnBadVendoredStyleName(name, owner); | |
| } else if (badStyleValueWithSemicolonPattern.test(value)) { | |
| warnStyleValueWithSemicolon(name, value, owner); | |
| } | |
| if (typeof value === 'number' && isNaN(value)) { | |
| warnStyleValueIsNaN(name, value, owner); | |
| } | |
| }; | |
| } | |
| /** | |
| * Operations for dealing with CSS properties. | |
| */ | |
| var CSSPropertyOperations = { | |
| /** | |
| * Serializes a mapping of style properties for use as inline styles: | |
| * | |
| * > createMarkupForStyles({width: '200px', height: 0}) | |
| * "width:200px;height:0;" | |
| * | |
| * Undefined values are ignored so that declarative programming is easier. | |
| * The result should be HTML-escaped before insertion into the DOM. | |
| * | |
| * @param {object} styles | |
| * @param {ReactDOMComponent} component | |
| * @return {?string} | |
| */ | |
| createMarkupForStyles: function (styles, component) { | |
| var serialized = ''; | |
| for (var styleName in styles) { | |
| if (!styles.hasOwnProperty(styleName)) { | |
| continue; | |
| } | |
| var styleValue = styles[styleName]; | |
| if (process.env.NODE_ENV !== 'production') { | |
| warnValidStyle(styleName, styleValue, component); | |
| } | |
| if (styleValue != null) { | |
| serialized += processStyleName(styleName) + ':'; | |
| serialized += dangerousStyleValue(styleName, styleValue, component) + ';'; | |
| } | |
| } | |
| return serialized || null; | |
| }, | |
| /** | |
| * Sets the value for multiple styles on a node. If a value is specified as | |
| * '' (empty string), the corresponding style property will be unset. | |
| * | |
| * @param {DOMElement} node | |
| * @param {object} styles | |
| * @param {ReactDOMComponent} component | |
| */ | |
| setValueForStyles: function (node, styles, component) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(component._debugID, 'update styles', styles); | |
| } | |
| var style = node.style; | |
| for (var styleName in styles) { | |
| if (!styles.hasOwnProperty(styleName)) { | |
| continue; | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| warnValidStyle(styleName, styles[styleName], component); | |
| } | |
| var styleValue = dangerousStyleValue(styleName, styles[styleName], component); | |
| if (styleName === 'float' || styleName === 'cssFloat') { | |
| styleName = styleFloatAccessor; | |
| } | |
| if (styleValue) { | |
| style[styleName] = styleValue; | |
| } else { | |
| var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName]; | |
| if (expansion) { | |
| // Shorthand property that IE8 won't like unsetting, so unset each | |
| // component to placate it | |
| for (var individualStyleName in expansion) { | |
| style[individualStyleName] = ''; | |
| } | |
| } else { | |
| style[styleName] = ''; | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| module.exports = CSSPropertyOperations; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvQ1NTUHJvcGVydHlPcGVyYXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIENTU1Byb3BlcnR5T3BlcmF0aW9uc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIENTU1Byb3BlcnR5ID0gcmVxdWlyZSgnLi9DU1NQcm9wZXJ0eScpO1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIGNhbWVsaXplU3R5bGVOYW1lID0gcmVxdWlyZSgnZmJqcy9saWIvY2FtZWxpemVTdHlsZU5hbWUnKTtcbnZhciBkYW5nZXJvdXNTdHlsZVZhbHVlID0gcmVxdWlyZSgnLi9kYW5nZXJvdXNTdHlsZVZhbHVlJyk7XG52YXIgaHlwaGVuYXRlU3R5bGVOYW1lID0gcmVxdWlyZSgnZmJqcy9saWIvaHlwaGVuYXRlU3R5bGVOYW1lJyk7XG52YXIgbWVtb2l6ZVN0cmluZ09ubHkgPSByZXF1aXJlKCdmYmpzL2xpYi9tZW1vaXplU3RyaW5nT25seScpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBwcm9jZXNzU3R5bGVOYW1lID0gbWVtb2l6ZVN0cmluZ09ubHkoZnVuY3Rpb24gKHN0eWxlTmFtZSkge1xuICByZXR1cm4gaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSk7XG59KTtcblxudmFyIGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnID0gZmFsc2U7XG52YXIgc3R5bGVGbG9hdEFjY2Vzc29yID0gJ2Nzc0Zsb2F0JztcbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgdmFyIHRlbXBTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlO1xuICB0cnkge1xuICAgIC8vIElFOCB0aHJvd3MgXCJJbnZhbGlkIGFyZ3VtZW50LlwiIGlmIHJlc2V0dGluZyBzaG9ydGhhbmQgc3R5bGUgcHJvcGVydGllcy5cbiAgICB0ZW1wU3R5bGUuZm9udCA9ICcnO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgPSB0cnVlO1xuICB9XG4gIC8vIElFOCBvbmx5IHN1cHBvcnRzIGFjY2Vzc2luZyBjc3NGbG9hdCAoc3RhbmRhcmQpIGFzIHN0eWxlRmxvYXRcbiAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jc3NGbG9hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3R5bGVGbG9hdEFjY2Vzc29yID0gJ3N0eWxlRmxvYXQnO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcbiAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLztcblxuICAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb25cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuXG4gIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307XG4gIHZhciB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9O1xuICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTtcblxuICB2YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSwgb3duZXIpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgY2FtZWxpemVTdHlsZU5hbWUobmFtZSksIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSwgb3duZXIpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKSA6IHZvaWQgMDtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1N0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuXFwndCBjb250YWluIGEgc2VtaWNvbG9uLiVzICcgKyAnVHJ5IFwiJXM6ICVzXCIgaW5zdGVhZC4nLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKSA6IHZvaWQgMDtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3duZXIpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJXMnLCBuYW1lLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKSA6IHZvaWQgMDtcbiAgfTtcblxuICB2YXIgY2hlY2tSZW5kZXJNZXNzYWdlID0gZnVuY3Rpb24gKG93bmVyKSB7XG4gICAgaWYgKG93bmVyKSB7XG4gICAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnRcbiAgICovXG4gIHZhciB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgY29tcG9uZW50KSB7XG4gICAgdmFyIG93bmVyO1xuICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgfVxuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lLCBvd25lcik7XG4gICAgfSBlbHNlIGlmIChiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lKG5hbWUsIG93bmVyKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlLCBvd25lcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlLCBvd25lcik7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBDU1MgcHJvcGVydGllcy5cbiAqL1xudmFyIENTU1Byb3BlcnR5T3BlcmF0aW9ucyA9IHtcblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1hcHBpbmcgb2Ygc3R5bGUgcHJvcGVydGllcyBmb3IgdXNlIGFzIGlubGluZSBzdHlsZXM6XG4gICAqXG4gICAqICAgPiBjcmVhdGVNYXJrdXBGb3JTdHlsZXMoe3dpZHRoOiAnMjAwcHgnLCBoZWlnaHQ6IDB9KVxuICAgKiAgIFwid2lkdGg6MjAwcHg7aGVpZ2h0OjA7XCJcbiAgICpcbiAgICogVW5kZWZpbmVkIHZhbHVlcyBhcmUgaWdub3JlZCBzbyB0aGF0IGRlY2xhcmF0aXZlIHByb2dyYW1taW5nIGlzIGVhc2llci5cbiAgICogVGhlIHJlc3VsdCBzaG91bGQgYmUgSFRNTC1lc2NhcGVkIGJlZm9yZSBpbnNlcnRpb24gaW50byB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzXG4gICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfVxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9yU3R5bGVzOiBmdW5jdGlvbiAoc3R5bGVzLCBjb21wb25lbnQpIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9ICcnO1xuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBjb21wb25lbnQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBzZXJpYWxpemVkICs9IHByb2Nlc3NTdHlsZU5hbWUoc3R5bGVOYW1lKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgY29tcG9uZW50KSArICc7JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICAgKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqL1xuICBzZXRWYWx1ZUZvclN0eWxlczogZnVuY3Rpb24gKG5vZGUsIHN0eWxlcywgY29tcG9uZW50KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oY29tcG9uZW50Ll9kZWJ1Z0lELCAndXBkYXRlIHN0eWxlcycsIHN0eWxlcyk7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50KTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBjb21wb25lbnQpO1xuICAgICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0JyB8fCBzdHlsZU5hbWUgPT09ICdjc3NGbG9hdCcpIHtcbiAgICAgICAgc3R5bGVOYW1lID0gc3R5bGVGbG9hdEFjY2Vzc29yO1xuICAgICAgfVxuICAgICAgaWYgKHN0eWxlVmFsdWUpIHtcbiAgICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXhwYW5zaW9uID0gaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgJiYgQ1NTUHJvcGVydHkuc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW3N0eWxlTmFtZV07XG4gICAgICAgIGlmIChleHBhbnNpb24pIHtcbiAgICAgICAgICAvLyBTaG9ydGhhbmQgcHJvcGVydHkgdGhhdCBJRTggd29uJ3QgbGlrZSB1bnNldHRpbmcsIHNvIHVuc2V0IGVhY2hcbiAgICAgICAgICAvLyBjb21wb25lbnQgdG8gcGxhY2F0ZSBpdFxuICAgICAgICAgIGZvciAodmFyIGluZGl2aWR1YWxTdHlsZU5hbWUgaW4gZXhwYW5zaW9uKSB7XG4gICAgICAgICAgICBzdHlsZVtpbmRpdmlkdWFsU3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHlsZVtzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDU1NQcm9wZXJ0eU9wZXJhdGlvbnM7Il19 | |
| },{"./CSSProperty":4,"./ReactInstrumentation":70,"./dangerousStyleValue":114,"_process":1,"fbjs/lib/ExecutionEnvironment":140,"fbjs/lib/camelizeStyleName":142,"fbjs/lib/hyphenateStyleName":153,"fbjs/lib/memoizeStringOnly":159,"fbjs/lib/warning":163}],6:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule CallbackQueue | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'), | |
| _assign = require('object-assign'); | |
| var PooledClass = require('./PooledClass'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| /** | |
| * A specialized pseudo-event module to help keep track of components waiting to | |
| * be notified when their DOM representations are available for use. | |
| * | |
| * This implements `PooledClass`, so you should never need to instantiate this. | |
| * Instead, use `CallbackQueue.getPooled()`. | |
| * | |
| * @class ReactMountReady | |
| * @implements PooledClass | |
| * @internal | |
| */ | |
| function CallbackQueue() { | |
| this._callbacks = null; | |
| this._contexts = null; | |
| } | |
| _assign(CallbackQueue.prototype, { | |
| /** | |
| * Enqueues a callback to be invoked when `notifyAll` is invoked. | |
| * | |
| * @param {function} callback Invoked when `notifyAll` is invoked. | |
| * @param {?object} context Context to call `callback` with. | |
| * @internal | |
| */ | |
| enqueue: function (callback, context) { | |
| this._callbacks = this._callbacks || []; | |
| this._contexts = this._contexts || []; | |
| this._callbacks.push(callback); | |
| this._contexts.push(context); | |
| }, | |
| /** | |
| * Invokes all enqueued callbacks and clears the queue. This is invoked after | |
| * the DOM representation of a component has been created or updated. | |
| * | |
| * @internal | |
| */ | |
| notifyAll: function () { | |
| var callbacks = this._callbacks; | |
| var contexts = this._contexts; | |
| if (callbacks) { | |
| !(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : _prodInvariant('24') : void 0; | |
| this._callbacks = null; | |
| this._contexts = null; | |
| for (var i = 0; i < callbacks.length; i++) { | |
| callbacks[i].call(contexts[i]); | |
| } | |
| callbacks.length = 0; | |
| contexts.length = 0; | |
| } | |
| }, | |
| checkpoint: function () { | |
| return this._callbacks ? this._callbacks.length : 0; | |
| }, | |
| rollback: function (len) { | |
| if (this._callbacks) { | |
| this._callbacks.length = len; | |
| this._contexts.length = len; | |
| } | |
| }, | |
| /** | |
| * Resets the internal queue. | |
| * | |
| * @internal | |
| */ | |
| reset: function () { | |
| this._callbacks = null; | |
| this._contexts = null; | |
| }, | |
| /** | |
| * `PooledClass` looks for this. | |
| */ | |
| destructor: function () { | |
| this.reset(); | |
| } | |
| }); | |
| PooledClass.addPoolingTo(CallbackQueue); | |
| module.exports = CallbackQueue; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvQ2FsbGJhY2tRdWV1ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBDYWxsYmFja1F1ZXVlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgcHNldWRvLWV2ZW50IG1vZHVsZSB0byBoZWxwIGtlZXAgdHJhY2sgb2YgY29tcG9uZW50cyB3YWl0aW5nIHRvXG4gKiBiZSBub3RpZmllZCB3aGVuIHRoZWlyIERPTSByZXByZXNlbnRhdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50cyBgUG9vbGVkQ2xhc3NgLCBzbyB5b3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy5cbiAqIEluc3RlYWQsIHVzZSBgQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKWAuXG4gKlxuICogQGNsYXNzIFJlYWN0TW91bnRSZWFkeVxuICogQGltcGxlbWVudHMgUG9vbGVkQ2xhc3NcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBDYWxsYmFja1F1ZXVlKCkge1xuICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICB0aGlzLl9jb250ZXh0cyA9IG51bGw7XG59XG5cbl9hc3NpZ24oQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUsIHtcblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgSW52b2tlZCB3aGVuIGBub3RpZnlBbGxgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dCBDb250ZXh0IHRvIGNhbGwgYGNhbGxiYWNrYCB3aXRoLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWU6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCBbXTtcbiAgICB0aGlzLl9jb250ZXh0cyA9IHRoaXMuX2NvbnRleHRzIHx8IFtdO1xuICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB0aGlzLl9jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGFsbCBlbnF1ZXVlZCBjYWxsYmFja3MgYW5kIGNsZWFycyB0aGUgcXVldWUuIFRoaXMgaXMgaW52b2tlZCBhZnRlclxuICAgKiB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIGEgY29tcG9uZW50IGhhcyBiZWVuIGNyZWF0ZWQgb3IgdXBkYXRlZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBub3RpZnlBbGw6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzO1xuICAgIHZhciBjb250ZXh0cyA9IHRoaXMuX2NvbnRleHRzO1xuICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICEoY2FsbGJhY2tzLmxlbmd0aCA9PT0gY29udGV4dHMubGVuZ3RoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNtYXRjaGVkIGxpc3Qgb2YgY29udGV4dHMgaW4gY2FsbGJhY2sgcXVldWUnKSA6IF9wcm9kSW52YXJpYW50KCcyNCcpIDogdm9pZCAwO1xuICAgICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKGNvbnRleHRzW2ldKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgICAgY29udGV4dHMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH0sXG5cbiAgY2hlY2twb2ludDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9jYWxsYmFja3MgPyB0aGlzLl9jYWxsYmFja3MubGVuZ3RoIDogMDtcbiAgfSxcblxuICByb2xsYmFjazogZnVuY3Rpb24gKGxlbikge1xuICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPSBsZW47XG4gICAgICB0aGlzLl9jb250ZXh0cy5sZW5ndGggPSBsZW47XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGludGVybmFsIHF1ZXVlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLl9jb250ZXh0cyA9IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMuXG4gICAqL1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbn0pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oQ2FsbGJhY2tRdWV1ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FsbGJhY2tRdWV1ZTsiXX0= | |
| },{"./PooledClass":26,"./reactProdInvariant":132,"_process":1,"fbjs/lib/invariant":154,"object-assign":164}],7:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule ChangeEventPlugin | |
| */ | |
| 'use strict'; | |
| var EventConstants = require('./EventConstants'); | |
| var EventPluginHub = require('./EventPluginHub'); | |
| var EventPropagators = require('./EventPropagators'); | |
| var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment'); | |
| var ReactDOMComponentTree = require('./ReactDOMComponentTree'); | |
| var ReactUpdates = require('./ReactUpdates'); | |
| var SyntheticEvent = require('./SyntheticEvent'); | |
| var getEventTarget = require('./getEventTarget'); | |
| var isEventSupported = require('./isEventSupported'); | |
| var isTextInputElement = require('./isTextInputElement'); | |
| var keyOf = require('fbjs/lib/keyOf'); | |
| var topLevelTypes = EventConstants.topLevelTypes; | |
| var eventTypes = { | |
| change: { | |
| phasedRegistrationNames: { | |
| bubbled: keyOf({ onChange: null }), | |
| captured: keyOf({ onChangeCapture: null }) | |
| }, | |
| dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange] | |
| } | |
| }; | |
| /** | |
| * For IE shims | |
| */ | |
| var activeElement = null; | |
| var activeElementInst = null; | |
| var activeElementValue = null; | |
| var activeElementValueProp = null; | |
| /** | |
| * SECTION: handle `change` event | |
| */ | |
| function shouldUseChangeEvent(elem) { | |
| var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); | |
| return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; | |
| } | |
| var doesChangeEventBubble = false; | |
| if (ExecutionEnvironment.canUseDOM) { | |
| // See `handleChange` comment below | |
| doesChangeEventBubble = isEventSupported('change') && (!document.documentMode || document.documentMode > 8); | |
| } | |
| function manualDispatchChangeEvent(nativeEvent) { | |
| var event = SyntheticEvent.getPooled(eventTypes.change, activeElementInst, nativeEvent, getEventTarget(nativeEvent)); | |
| EventPropagators.accumulateTwoPhaseDispatches(event); | |
| // If change and propertychange bubbled, we'd just bind to it like all the | |
| // other events and have it go through ReactBrowserEventEmitter. Since it | |
| // doesn't, we manually listen for the events and so we have to enqueue and | |
| // process the abstract event manually. | |
| // | |
| // Batching is necessary here in order to ensure that all event handlers run | |
| // before the next rerender (including event handlers attached to ancestor | |
| // elements instead of directly on the input). Without this, controlled | |
| // components don't work properly in conjunction with event bubbling because | |
| // the component is rerendered and the value reverted before all the event | |
| // handlers can run. See https://github.com/facebook/react/issues/708. | |
| ReactUpdates.batchedUpdates(runEventInBatch, event); | |
| } | |
| function runEventInBatch(event) { | |
| EventPluginHub.enqueueEvents(event); | |
| EventPluginHub.processEventQueue(false); | |
| } | |
| function startWatchingForChangeEventIE8(target, targetInst) { | |
| activeElement = target; | |
| activeElementInst = targetInst; | |
| activeElement.attachEvent('onchange', manualDispatchChangeEvent); | |
| } | |
| function stopWatchingForChangeEventIE8() { | |
| if (!activeElement) { | |
| return; | |
| } | |
| activeElement.detachEvent('onchange', manualDispatchChangeEvent); | |
| activeElement = null; | |
| activeElementInst = null; | |
| } | |
| function getTargetInstForChangeEvent(topLevelType, targetInst) { | |
| if (topLevelType === topLevelTypes.topChange) { | |
| return targetInst; | |
| } | |
| } | |
| function handleEventsForChangeEventIE8(topLevelType, target, targetInst) { | |
| if (topLevelType === topLevelTypes.topFocus) { | |
| // stopWatching() should be a noop here but we call it just in case we | |
| // missed a blur event somehow. | |
| stopWatchingForChangeEventIE8(); | |
| startWatchingForChangeEventIE8(target, targetInst); | |
| } else if (topLevelType === topLevelTypes.topBlur) { | |
| stopWatchingForChangeEventIE8(); | |
| } | |
| } | |
| /** | |
| * SECTION: handle `input` event | |
| */ | |
| var isInputEventSupported = false; | |
| if (ExecutionEnvironment.canUseDOM) { | |
| // IE9 claims to support the input event but fails to trigger it when | |
| // deleting text, so we ignore its input events. | |
| // IE10+ fire input events to often, such when a placeholder | |
| // changes or when an input with a placeholder is focused. | |
| isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 11); | |
| } | |
| /** | |
| * (For IE <=11) Replacement getter/setter for the `value` property that gets | |
| * set on the active element. | |
| */ | |
| var newValueProp = { | |
| get: function () { | |
| return activeElementValueProp.get.call(this); | |
| }, | |
| set: function (val) { | |
| // Cast to a string so we can do equality checks. | |
| activeElementValue = '' + val; | |
| activeElementValueProp.set.call(this, val); | |
| } | |
| }; | |
| /** | |
| * (For IE <=11) Starts tracking propertychange events on the passed-in element | |
| * and override the value property so that we can distinguish user events from | |
| * value changes in JS. | |
| */ | |
| function startWatchingForValueChange(target, targetInst) { | |
| activeElement = target; | |
| activeElementInst = targetInst; | |
| activeElementValue = target.value; | |
| activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value'); | |
| // Not guarded in a canDefineProperty check: IE8 supports defineProperty only | |
| // on DOM elements | |
| Object.defineProperty(activeElement, 'value', newValueProp); | |
| if (activeElement.attachEvent) { | |
| activeElement.attachEvent('onpropertychange', handlePropertyChange); | |
| } else { | |
| activeElement.addEventListener('propertychange', handlePropertyChange, false); | |
| } | |
| } | |
| /** | |
| * (For IE <=11) Removes the event listeners from the currently-tracked element, | |
| * if any exists. | |
| */ | |
| function stopWatchingForValueChange() { | |
| if (!activeElement) { | |
| return; | |
| } | |
| // delete restores the original property definition | |
| delete activeElement.value; | |
| if (activeElement.detachEvent) { | |
| activeElement.detachEvent('onpropertychange', handlePropertyChange); | |
| } else { | |
| activeElement.removeEventListener('propertychange', handlePropertyChange, false); | |
| } | |
| activeElement = null; | |
| activeElementInst = null; | |
| activeElementValue = null; | |
| activeElementValueProp = null; | |
| } | |
| /** | |
| * (For IE <=11) Handles a propertychange event, sending a `change` event if | |
| * the value of the active element has changed. | |
| */ | |
| function handlePropertyChange(nativeEvent) { | |
| if (nativeEvent.propertyName !== 'value') { | |
| return; | |
| } | |
| var value = nativeEvent.srcElement.value; | |
| if (value === activeElementValue) { | |
| return; | |
| } | |
| activeElementValue = value; | |
| manualDispatchChangeEvent(nativeEvent); | |
| } | |
| /** | |
| * If a `change` event should be fired, returns the target's ID. | |
| */ | |
| function getTargetInstForInputEvent(topLevelType, targetInst) { | |
| if (topLevelType === topLevelTypes.topInput) { | |
| // In modern browsers (i.e., not IE8 or IE9), the input event is exactly | |
| // what we want so fall through here and trigger an abstract event | |
| return targetInst; | |
| } | |
| } | |
| function handleEventsForInputEventIE(topLevelType, target, targetInst) { | |
| if (topLevelType === topLevelTypes.topFocus) { | |
| // In IE8, we can capture almost all .value changes by adding a | |
| // propertychange handler and looking for events with propertyName | |
| // equal to 'value' | |
| // In IE9-11, propertychange fires for most input events but is buggy and | |
| // doesn't fire when text is deleted, but conveniently, selectionchange | |
| // appears to fire in all of the remaining cases so we catch those and | |
| // forward the event if the value has changed | |
| // In either case, we don't want to call the event handler if the value | |
| // is changed from JS so we redefine a setter for `.value` that updates | |
| // our activeElementValue variable, allowing us to ignore those changes | |
| // | |
| // stopWatching() should be a noop here but we call it just in case we | |
| // missed a blur event somehow. | |
| stopWatchingForValueChange(); | |
| startWatchingForValueChange(target, targetInst); | |
| } else if (topLevelType === topLevelTypes.topBlur) { | |
| stopWatchingForValueChange(); | |
| } | |
| } | |
| // For IE8 and IE9. | |
| function getTargetInstForInputEventIE(topLevelType, targetInst) { | |
| if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) { | |
| // On the selectionchange event, the target is just document which isn't | |
| // helpful for us so just check activeElement instead. | |
| // | |
| // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire | |
| // propertychange on the first input event after setting `value` from a | |
| // script and fires only keydown, keypress, keyup. Catching keyup usually | |
| // gets it and catching keydown lets us fire an event for the first | |
| // keystroke if user does a key repeat (it'll be a little delayed: right | |
| // before the second keystroke). Other input methods (e.g., paste) seem to | |
| // fire selectionchange normally. | |
| if (activeElement && activeElement.value !== activeElementValue) { | |
| activeElementValue = activeElement.value; | |
| return activeElementInst; | |
| } | |
| } | |
| } | |
| /** | |
| * SECTION: handle `click` event | |
| */ | |
| function shouldUseClickEvent(elem) { | |
| // Use the `click` event to detect changes to checkbox and radio inputs. | |
| // This approach works across all browsers, whereas `change` does not fire | |
| // until `blur` in IE8. | |
| return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); | |
| } | |
| function getTargetInstForClickEvent(topLevelType, targetInst) { | |
| if (topLevelType === topLevelTypes.topClick) { | |
| return targetInst; | |
| } | |
| } | |
| /** | |
| * This plugin creates an `onChange` event that normalizes change events | |
| * across form elements. This event fires at a time when it's possible to | |
| * change the element's value without seeing a flicker. | |
| * | |
| * Supported elements are: | |
| * - input (see `isTextInputElement`) | |
| * - textarea | |
| * - select | |
| */ | |
| var ChangeEventPlugin = { | |
| eventTypes: eventTypes, | |
| extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { | |
| var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window; | |
| var getTargetInstFunc, handleEventFunc; | |
| if (shouldUseChangeEvent(targetNode)) { | |
| if (doesChangeEventBubble) { | |
| getTargetInstFunc = getTargetInstForChangeEvent; | |
| } else { | |
| handleEventFunc = handleEventsForChangeEventIE8; | |
| } | |
| } else if (isTextInputElement(targetNode)) { | |
| if (isInputEventSupported) { | |
| getTargetInstFunc = getTargetInstForInputEvent; | |
| } else { | |
| getTargetInstFunc = getTargetInstForInputEventIE; | |
| handleEventFunc = handleEventsForInputEventIE; | |
| } | |
| } else if (shouldUseClickEvent(targetNode)) { | |
| getTargetInstFunc = getTargetInstForClickEvent; | |
| } | |
| if (getTargetInstFunc) { | |
| var inst = getTargetInstFunc(topLevelType, targetInst); | |
| if (inst) { | |
| var event = SyntheticEvent.getPooled(eventTypes.change, inst, nativeEvent, nativeEventTarget); | |
| event.type = 'change'; | |
| EventPropagators.accumulateTwoPhaseDispatches(event); | |
| return event; | |
| } | |
| } | |
| if (handleEventFunc) { | |
| handleEventFunc(topLevelType, targetNode, targetInst); | |
| } | |
| } | |
| }; | |
| module.exports = ChangeEventPlugin; | |
| },{"./EventConstants":17,"./EventPluginHub":18,"./EventPropagators":21,"./ReactDOMComponentTree":42,"./ReactUpdates":89,"./SyntheticEvent":98,"./getEventTarget":122,"./isEventSupported":129,"./isTextInputElement":130,"fbjs/lib/ExecutionEnvironment":140,"fbjs/lib/keyOf":158}],8:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule DOMChildrenOperations | |
| */ | |
| 'use strict'; | |
| var DOMLazyTree = require('./DOMLazyTree'); | |
| var Danger = require('./Danger'); | |
| var ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes'); | |
| var ReactDOMComponentTree = require('./ReactDOMComponentTree'); | |
| var ReactInstrumentation = require('./ReactInstrumentation'); | |
| var createMicrosoftUnsafeLocalFunction = require('./createMicrosoftUnsafeLocalFunction'); | |
| var setInnerHTML = require('./setInnerHTML'); | |
| var setTextContent = require('./setTextContent'); | |
| function getNodeAfter(parentNode, node) { | |
| // Special case for text components, which return [open, close] comments | |
| // from getHostNode. | |
| if (Array.isArray(node)) { | |
| node = node[1]; | |
| } | |
| return node ? node.nextSibling : parentNode.firstChild; | |
| } | |
| /** | |
| * Inserts `childNode` as a child of `parentNode` at the `index`. | |
| * | |
| * @param {DOMElement} parentNode Parent node in which to insert. | |
| * @param {DOMElement} childNode Child node to insert. | |
| * @param {number} index Index at which to insert the child. | |
| * @internal | |
| */ | |
| var insertChildAt = createMicrosoftUnsafeLocalFunction(function (parentNode, childNode, referenceNode) { | |
| // We rely exclusively on `insertBefore(node, null)` instead of also using | |
| // `appendChild(node)`. (Using `undefined` is not allowed by all browsers so | |
| // we are careful to use `null`.) | |
| parentNode.insertBefore(childNode, referenceNode); | |
| }); | |
| function insertLazyTreeChildAt(parentNode, childTree, referenceNode) { | |
| DOMLazyTree.insertTreeBefore(parentNode, childTree, referenceNode); | |
| } | |
| function moveChild(parentNode, childNode, referenceNode) { | |
| if (Array.isArray(childNode)) { | |
| moveDelimitedText(parentNode, childNode[0], childNode[1], referenceNode); | |
| } else { | |
| insertChildAt(parentNode, childNode, referenceNode); | |
| } | |
| } | |
| function removeChild(parentNode, childNode) { | |
| if (Array.isArray(childNode)) { | |
| var closingComment = childNode[1]; | |
| childNode = childNode[0]; | |
| removeDelimitedText(parentNode, childNode, closingComment); | |
| parentNode.removeChild(closingComment); | |
| } | |
| parentNode.removeChild(childNode); | |
| } | |
| function moveDelimitedText(parentNode, openingComment, closingComment, referenceNode) { | |
| var node = openingComment; | |
| while (true) { | |
| var nextNode = node.nextSibling; | |
| insertChildAt(parentNode, node, referenceNode); | |
| if (node === closingComment) { | |
| break; | |
| } | |
| node = nextNode; | |
| } | |
| } | |
| function removeDelimitedText(parentNode, startNode, closingComment) { | |
| while (true) { | |
| var node = startNode.nextSibling; | |
| if (node === closingComment) { | |
| // The closing comment is removed by ReactMultiChild. | |
| break; | |
| } else { | |
| parentNode.removeChild(node); | |
| } | |
| } | |
| } | |
| function replaceDelimitedText(openingComment, closingComment, stringText) { | |
| var parentNode = openingComment.parentNode; | |
| var nodeAfterComment = openingComment.nextSibling; | |
| if (nodeAfterComment === closingComment) { | |
| // There are no text nodes between the opening and closing comments; insert | |
| // a new one if stringText isn't empty. | |
| if (stringText) { | |
| insertChildAt(parentNode, document.createTextNode(stringText), nodeAfterComment); | |
| } | |
| } else { | |
| if (stringText) { | |
| // Set the text content of the first node after the opening comment, and | |
| // remove all following nodes up until the closing comment. | |
| setTextContent(nodeAfterComment, stringText); | |
| removeDelimitedText(parentNode, nodeAfterComment, closingComment); | |
| } else { | |
| removeDelimitedText(parentNode, openingComment, closingComment); | |
| } | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(openingComment)._debugID, 'replace text', stringText); | |
| } | |
| } | |
| var dangerouslyReplaceNodeWithMarkup = Danger.dangerouslyReplaceNodeWithMarkup; | |
| if (process.env.NODE_ENV !== 'production') { | |
| dangerouslyReplaceNodeWithMarkup = function (oldChild, markup, prevInstance) { | |
| Danger.dangerouslyReplaceNodeWithMarkup(oldChild, markup); | |
| if (prevInstance._debugID !== 0) { | |
| ReactInstrumentation.debugTool.onHostOperation(prevInstance._debugID, 'replace with', markup.toString()); | |
| } else { | |
| var nextInstance = ReactDOMComponentTree.getInstanceFromNode(markup.node); | |
| if (nextInstance._debugID !== 0) { | |
| ReactInstrumentation.debugTool.onHostOperation(nextInstance._debugID, 'mount', markup.toString()); | |
| } | |
| } | |
| }; | |
| } | |
| /** | |
| * Operations for updating with DOM children. | |
| */ | |
| var DOMChildrenOperations = { | |
| dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup, | |
| replaceDelimitedText: replaceDelimitedText, | |
| /** | |
| * Updates a component's children by processing a series of updates. The | |
| * update configurations are each expected to have a `parentNode` property. | |
| * | |
| * @param {array<object>} updates List of update configurations. | |
| * @internal | |
| */ | |
| processUpdates: function (parentNode, updates) { | |
| if (process.env.NODE_ENV !== 'production') { | |
| var parentNodeDebugID = ReactDOMComponentTree.getInstanceFromNode(parentNode)._debugID; | |
| } | |
| for (var k = 0; k < updates.length; k++) { | |
| var update = updates[k]; | |
| switch (update.type) { | |
| case ReactMultiChildUpdateTypes.INSERT_MARKUP: | |
| insertLazyTreeChildAt(parentNode, update.content, getNodeAfter(parentNode, update.afterNode)); | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(parentNodeDebugID, 'insert child', { toIndex: update.toIndex, content: update.content.toString() }); | |
| } | |
| break; | |
| case ReactMultiChildUpdateTypes.MOVE_EXISTING: | |
| moveChild(parentNode, update.fromNode, getNodeAfter(parentNode, update.afterNode)); | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(parentNodeDebugID, 'move child', { fromIndex: update.fromIndex, toIndex: update.toIndex }); | |
| } | |
| break; | |
| case ReactMultiChildUpdateTypes.SET_MARKUP: | |
| setInnerHTML(parentNode, update.content); | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(parentNodeDebugID, 'replace children', update.content.toString()); | |
| } | |
| break; | |
| case ReactMultiChildUpdateTypes.TEXT_CONTENT: | |
| setTextContent(parentNode, update.content); | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(parentNodeDebugID, 'replace text', update.content.toString()); | |
| } | |
| break; | |
| case ReactMultiChildUpdateTypes.REMOVE_NODE: | |
| removeChild(parentNode, update.fromNode); | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(parentNodeDebugID, 'remove child', { fromIndex: update.fromIndex }); | |
| } | |
| break; | |
| } | |
| } | |
| } | |
| }; | |
| module.exports = DOMChildrenOperations; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgRE9NQ2hpbGRyZW5PcGVyYXRpb25zXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRGFuZ2VyID0gcmVxdWlyZSgnLi9EYW5nZXInKTtcbnZhciBSZWFjdE11bHRpQ2hpbGRVcGRhdGVUeXBlcyA9IHJlcXVpcmUoJy4vUmVhY3RNdWx0aUNoaWxkVXBkYXRlVHlwZXMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IHJlcXVpcmUoJy4vY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbicpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG52YXIgc2V0VGV4dENvbnRlbnQgPSByZXF1aXJlKCcuL3NldFRleHRDb250ZW50Jyk7XG5cbmZ1bmN0aW9uIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCBub2RlKSB7XG4gIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGV4dCBjb21wb25lbnRzLCB3aGljaCByZXR1cm4gW29wZW4sIGNsb3NlXSBjb21tZW50c1xuICAvLyBmcm9tIGdldEhvc3ROb2RlLlxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIG5vZGUgPSBub2RlWzFdO1xuICB9XG4gIHJldHVybiBub2RlID8gbm9kZS5uZXh0U2libGluZyA6IHBhcmVudE5vZGUuZmlyc3RDaGlsZDtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGBjaGlsZE5vZGVgIGFzIGEgY2hpbGQgb2YgYHBhcmVudE5vZGVgIGF0IHRoZSBgaW5kZXhgLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50Tm9kZSBQYXJlbnQgbm9kZSBpbiB3aGljaCB0byBpbnNlcnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNoaWxkTm9kZSBDaGlsZCBub2RlIHRvIGluc2VydC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGNoaWxkLlxuICogQGludGVybmFsXG4gKi9cbnZhciBpbnNlcnRDaGlsZEF0ID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIC8vIFdlIHJlbHkgZXhjbHVzaXZlbHkgb24gYGluc2VydEJlZm9yZShub2RlLCBudWxsKWAgaW5zdGVhZCBvZiBhbHNvIHVzaW5nXG4gIC8vIGBhcHBlbmRDaGlsZChub2RlKWAuIChVc2luZyBgdW5kZWZpbmVkYCBpcyBub3QgYWxsb3dlZCBieSBhbGwgYnJvd3NlcnMgc29cbiAgLy8gd2UgYXJlIGNhcmVmdWwgdG8gdXNlIGBudWxsYC4pXG4gIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59KTtcblxuZnVuY3Rpb24gaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsIGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSkge1xuICBET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVmb3JlKHBhcmVudE5vZGUsIGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5cbmZ1bmN0aW9uIG1vdmVDaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSkge1xuICAgIG1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIGNoaWxkTm9kZVswXSwgY2hpbGROb2RlWzFdLCByZWZlcmVuY2VOb2RlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkTm9kZSkpIHtcbiAgICB2YXIgY2xvc2luZ0NvbW1lbnQgPSBjaGlsZE5vZGVbMV07XG4gICAgY2hpbGROb2RlID0gY2hpbGROb2RlWzBdO1xuICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBjbG9zaW5nQ29tbWVudCk7XG4gICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9zaW5nQ29tbWVudCk7XG4gIH1cbiAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZE5vZGUpO1xufVxuXG5mdW5jdGlvbiBtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQsIHJlZmVyZW5jZU5vZGUpIHtcbiAgdmFyIG5vZGUgPSBvcGVuaW5nQ29tbWVudDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIGluc2VydENoaWxkQXQocGFyZW50Tm9kZSwgbm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gICAgaWYgKG5vZGUgPT09IGNsb3NpbmdDb21tZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgc3RhcnROb2RlLCBjbG9zaW5nQ29tbWVudCkge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBub2RlID0gc3RhcnROb2RlLm5leHRTaWJsaW5nO1xuICAgIGlmIChub2RlID09PSBjbG9zaW5nQ29tbWVudCkge1xuICAgICAgLy8gVGhlIGNsb3NpbmcgY29tbWVudCBpcyByZW1vdmVkIGJ5IFJlYWN0TXVsdGlDaGlsZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlRGVsaW1pdGVkVGV4dChvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQsIHN0cmluZ1RleHQpIHtcbiAgdmFyIHBhcmVudE5vZGUgPSBvcGVuaW5nQ29tbWVudC5wYXJlbnROb2RlO1xuICB2YXIgbm9kZUFmdGVyQ29tbWVudCA9IG9wZW5pbmdDb21tZW50Lm5leHRTaWJsaW5nO1xuICBpZiAobm9kZUFmdGVyQ29tbWVudCA9PT0gY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAvLyBUaGVyZSBhcmUgbm8gdGV4dCBub2RlcyBiZXR3ZWVuIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzOyBpbnNlcnRcbiAgICAvLyBhIG5ldyBvbmUgaWYgc3RyaW5nVGV4dCBpc24ndCBlbXB0eS5cbiAgICBpZiAoc3RyaW5nVGV4dCkge1xuICAgICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmdUZXh0KSwgbm9kZUFmdGVyQ29tbWVudCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzdHJpbmdUZXh0KSB7XG4gICAgICAvLyBTZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgb3BlbmluZyBjb21tZW50LCBhbmRcbiAgICAgIC8vIHJlbW92ZSBhbGwgZm9sbG93aW5nIG5vZGVzIHVwIHVudGlsIHRoZSBjbG9zaW5nIGNvbW1lbnQuXG4gICAgICBzZXRUZXh0Q29udGVudChub2RlQWZ0ZXJDb21tZW50LCBzdHJpbmdUZXh0KTtcbiAgICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgbm9kZUFmdGVyQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIG9wZW5pbmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG9wZW5pbmdDb21tZW50KS5fZGVidWdJRCwgJ3JlcGxhY2UgdGV4dCcsIHN0cmluZ1RleHQpO1xuICB9XG59XG5cbnZhciBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IERhbmdlci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwID0gZnVuY3Rpb24gKG9sZENoaWxkLCBtYXJrdXAsIHByZXZJbnN0YW5jZSkge1xuICAgIERhbmdlci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRDaGlsZCwgbWFya3VwKTtcbiAgICBpZiAocHJldkluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHByZXZJbnN0YW5jZS5fZGVidWdJRCwgJ3JlcGxhY2Ugd2l0aCcsIG1hcmt1cC50b1N0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5leHRJbnN0YW5jZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG1hcmt1cC5ub2RlKTtcbiAgICAgIGlmIChuZXh0SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbihuZXh0SW5zdGFuY2UuX2RlYnVnSUQsICdtb3VudCcsIG1hcmt1cC50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgdXBkYXRpbmcgd2l0aCBET00gY2hpbGRyZW4uXG4gKi9cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSB7XG5cbiAgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwLFxuXG4gIHJlcGxhY2VEZWxpbWl0ZWRUZXh0OiByZXBsYWNlRGVsaW1pdGVkVGV4dCxcblxuICAvKipcbiAgICogVXBkYXRlcyBhIGNvbXBvbmVudCdzIGNoaWxkcmVuIGJ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgdXBkYXRlcy4gVGhlXG4gICAqIHVwZGF0ZSBjb25maWd1cmF0aW9ucyBhcmUgZWFjaCBleHBlY3RlZCB0byBoYXZlIGEgYHBhcmVudE5vZGVgIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PG9iamVjdD59IHVwZGF0ZXMgTGlzdCBvZiB1cGRhdGUgY29uZmlndXJhdGlvbnMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvY2Vzc1VwZGF0ZXM6IGZ1bmN0aW9uIChwYXJlbnROb2RlLCB1cGRhdGVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXJlbnROb2RlRGVidWdJRCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHBhcmVudE5vZGUpLl9kZWJ1Z0lEO1xuICAgIH1cblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdXBkYXRlcy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIHVwZGF0ZSA9IHVwZGF0ZXNba107XG4gICAgICBzd2l0Y2ggKHVwZGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgUmVhY3RNdWx0aUNoaWxkVXBkYXRlVHlwZXMuSU5TRVJUX01BUktVUDpcbiAgICAgICAgICBpbnNlcnRMYXp5VHJlZUNoaWxkQXQocGFyZW50Tm9kZSwgdXBkYXRlLmNvbnRlbnQsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2RlKSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24ocGFyZW50Tm9kZURlYnVnSUQsICdpbnNlcnQgY2hpbGQnLCB7IHRvSW5kZXg6IHVwZGF0ZS50b0luZGV4LCBjb250ZW50OiB1cGRhdGUuY29udGVudC50b1N0cmluZygpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSZWFjdE11bHRpQ2hpbGRVcGRhdGVUeXBlcy5NT1ZFX0VYSVNUSU5HOlxuICAgICAgICAgIG1vdmVDaGlsZChwYXJlbnROb2RlLCB1cGRhdGUuZnJvbU5vZGUsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2RlKSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24ocGFyZW50Tm9kZURlYnVnSUQsICdtb3ZlIGNoaWxkJywgeyBmcm9tSW5kZXg6IHVwZGF0ZS5mcm9tSW5kZXgsIHRvSW5kZXg6IHVwZGF0ZS50b0luZGV4IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSZWFjdE11bHRpQ2hpbGRVcGRhdGVUeXBlcy5TRVRfTUFSS1VQOlxuICAgICAgICAgIHNldElubmVySFRNTChwYXJlbnROb2RlLCB1cGRhdGUuY29udGVudCk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24ocGFyZW50Tm9kZURlYnVnSUQsICdyZXBsYWNlIGNoaWxkcmVuJywgdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJlYWN0TXVsdGlDaGlsZFVwZGF0ZVR5cGVzLlRFWFRfQ09OVEVOVDpcbiAgICAgICAgICBzZXRUZXh0Q29udGVudChwYXJlbnROb2RlLCB1cGRhdGUuY29udGVudCk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24ocGFyZW50Tm9kZURlYnVnSUQsICdyZXBsYWNlIHRleHQnLCB1cGRhdGUuY29udGVudC50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUmVhY3RNdWx0aUNoaWxkVXBkYXRlVHlwZXMuUkVNT1ZFX05PREU6XG4gICAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdXBkYXRlLmZyb21Ob2RlKTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbihwYXJlbnROb2RlRGVidWdJRCwgJ3JlbW92ZSBjaGlsZCcsIHsgZnJvbUluZGV4OiB1cGRhdGUuZnJvbUluZGV4IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01DaGlsZHJlbk9wZXJhdGlvbnM7Il19 | |
| },{"./DOMLazyTree":9,"./Danger":13,"./ReactDOMComponentTree":42,"./ReactInstrumentation":70,"./ReactMultiChildUpdateTypes":75,"./createMicrosoftUnsafeLocalFunction":113,"./setInnerHTML":134,"./setTextContent":135,"_process":1}],9:[function(require,module,exports){ | |
| /** | |
| * Copyright 2015-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule DOMLazyTree | |
| */ | |
| 'use strict'; | |
| var DOMNamespaces = require('./DOMNamespaces'); | |
| var setInnerHTML = require('./setInnerHTML'); | |
| var createMicrosoftUnsafeLocalFunction = require('./createMicrosoftUnsafeLocalFunction'); | |
| var setTextContent = require('./setTextContent'); | |
| var ELEMENT_NODE_TYPE = 1; | |
| var DOCUMENT_FRAGMENT_NODE_TYPE = 11; | |
| /** | |
| * In IE (8-11) and Edge, appending nodes with no children is dramatically | |
| * faster than appending a full subtree, so we essentially queue up the | |
| * .appendChild calls here and apply them so each node is added to its parent | |
| * before any children are added. | |
| * | |
| * In other browsers, doing so is slower or neutral compared to the other order | |
| * (in Firefox, twice as slow) so we only do this inversion in IE. | |
| * | |
| * See https://github.com/spicyj/innerhtml-vs-createelement-vs-clonenode. | |
| */ | |
| var enableLazy = typeof document !== 'undefined' && typeof document.documentMode === 'number' || typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && /\bEdge\/\d/.test(navigator.userAgent); | |
| function insertTreeChildren(tree) { | |
| if (!enableLazy) { | |
| return; | |
| } | |
| var node = tree.node; | |
| var children = tree.children; | |
| if (children.length) { | |
| for (var i = 0; i < children.length; i++) { | |
| insertTreeBefore(node, children[i], null); | |
| } | |
| } else if (tree.html != null) { | |
| setInnerHTML(node, tree.html); | |
| } else if (tree.text != null) { | |
| setTextContent(node, tree.text); | |
| } | |
| } | |
| var insertTreeBefore = createMicrosoftUnsafeLocalFunction(function (parentNode, tree, referenceNode) { | |
| // DocumentFragments aren't actually part of the DOM after insertion so | |
| // appending children won't update the DOM. We need to ensure the fragment | |
| // is properly populated first, breaking out of our lazy approach for just | |
| // this level. Also, some <object> plugins (like Flash Player) will read | |
| // <param> nodes immediately upon insertion into the DOM, so <object> | |
| // must also be populated prior to insertion into the DOM. | |
| if (tree.node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE || tree.node.nodeType === ELEMENT_NODE_TYPE && tree.node.nodeName.toLowerCase() === 'object' && (tree.node.namespaceURI == null || tree.node.namespaceURI === DOMNamespaces.html)) { | |
| insertTreeChildren(tree); | |
| parentNode.insertBefore(tree.node, referenceNode); | |
| } else { | |
| parentNode.insertBefore(tree.node, referenceNode); | |
| insertTreeChildren(tree); | |
| } | |
| }); | |
| function replaceChildWithTree(oldNode, newTree) { | |
| oldNode.parentNode.replaceChild(newTree.node, oldNode); | |
| insertTreeChildren(newTree); | |
| } | |
| function queueChild(parentTree, childTree) { | |
| if (enableLazy) { | |
| parentTree.children.push(childTree); | |
| } else { | |
| parentTree.node.appendChild(childTree.node); | |
| } | |
| } | |
| function queueHTML(tree, html) { | |
| if (enableLazy) { | |
| tree.html = html; | |
| } else { | |
| setInnerHTML(tree.node, html); | |
| } | |
| } | |
| function queueText(tree, text) { | |
| if (enableLazy) { | |
| tree.text = text; | |
| } else { | |
| setTextContent(tree.node, text); | |
| } | |
| } | |
| function toString() { | |
| return this.node.nodeName; | |
| } | |
| function DOMLazyTree(node) { | |
| return { | |
| node: node, | |
| children: [], | |
| html: null, | |
| text: null, | |
| toString: toString | |
| }; | |
| } | |
| DOMLazyTree.insertTreeBefore = insertTreeBefore; | |
| DOMLazyTree.replaceChildWithTree = replaceChildWithTree; | |
| DOMLazyTree.queueChild = queueChild; | |
| DOMLazyTree.queueHTML = queueHTML; | |
| DOMLazyTree.queueText = queueText; | |
| module.exports = DOMLazyTree; | |
| },{"./DOMNamespaces":10,"./createMicrosoftUnsafeLocalFunction":113,"./setInnerHTML":134,"./setTextContent":135}],10:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule DOMNamespaces | |
| */ | |
| 'use strict'; | |
| var DOMNamespaces = { | |
| html: 'http://www.w3.org/1999/xhtml', | |
| mathml: 'http://www.w3.org/1998/Math/MathML', | |
| svg: 'http://www.w3.org/2000/svg' | |
| }; | |
| module.exports = DOMNamespaces; | |
| },{}],11:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule DOMProperty | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| function checkMask(value, bitmask) { | |
| return (value & bitmask) === bitmask; | |
| } | |
| var DOMPropertyInjection = { | |
| /** | |
| * Mapping from normalized, camelcased property names to a configuration that | |
| * specifies how the associated DOM property should be accessed or rendered. | |
| */ | |
| MUST_USE_PROPERTY: 0x1, | |
| HAS_BOOLEAN_VALUE: 0x4, | |
| HAS_NUMERIC_VALUE: 0x8, | |
| HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8, | |
| HAS_OVERLOADED_BOOLEAN_VALUE: 0x20, | |
| /** | |
| * Inject some specialized knowledge about the DOM. This takes a config object | |
| * with the following properties: | |
| * | |
| * isCustomAttribute: function that given an attribute name will return true | |
| * if it can be inserted into the DOM verbatim. Useful for data-* or aria-* | |
| * attributes where it's impossible to enumerate all of the possible | |
| * attribute names, | |
| * | |
| * Properties: object mapping DOM property name to one of the | |
| * DOMPropertyInjection constants or null. If your attribute isn't in here, | |
| * it won't get written to the DOM. | |
| * | |
| * DOMAttributeNames: object mapping React attribute name to the DOM | |
| * attribute name. Attribute names not specified use the **lowercase** | |
| * normalized name. | |
| * | |
| * DOMAttributeNamespaces: object mapping React attribute name to the DOM | |
| * attribute namespace URL. (Attribute names not specified use no namespace.) | |
| * | |
| * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties. | |
| * Property names not specified use the normalized name. | |
| * | |
| * DOMMutationMethods: Properties that require special mutation methods. If | |
| * `value` is undefined, the mutation method should unset the property. | |
| * | |
| * @param {object} domPropertyConfig the config as described above. | |
| */ | |
| injectDOMPropertyConfig: function (domPropertyConfig) { | |
| var Injection = DOMPropertyInjection; | |
| var Properties = domPropertyConfig.Properties || {}; | |
| var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {}; | |
| var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {}; | |
| var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {}; | |
| var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {}; | |
| if (domPropertyConfig.isCustomAttribute) { | |
| DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute); | |
| } | |
| for (var propName in Properties) { | |
| !!DOMProperty.properties.hasOwnProperty(propName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property \'%s\' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.', propName) : _prodInvariant('48', propName) : void 0; | |
| var lowerCased = propName.toLowerCase(); | |
| var propConfig = Properties[propName]; | |
| var propertyInfo = { | |
| attributeName: lowerCased, | |
| attributeNamespace: null, | |
| propertyName: propName, | |
| mutationMethod: null, | |
| mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY), | |
| hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE), | |
| hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE), | |
| hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE), | |
| hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE) | |
| }; | |
| !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s', propName) : _prodInvariant('50', propName) : void 0; | |
| if (process.env.NODE_ENV !== 'production') { | |
| DOMProperty.getPossibleStandardName[lowerCased] = propName; | |
| } | |
| if (DOMAttributeNames.hasOwnProperty(propName)) { | |
| var attributeName = DOMAttributeNames[propName]; | |
| propertyInfo.attributeName = attributeName; | |
| if (process.env.NODE_ENV !== 'production') { | |
| DOMProperty.getPossibleStandardName[attributeName] = propName; | |
| } | |
| } | |
| if (DOMAttributeNamespaces.hasOwnProperty(propName)) { | |
| propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName]; | |
| } | |
| if (DOMPropertyNames.hasOwnProperty(propName)) { | |
| propertyInfo.propertyName = DOMPropertyNames[propName]; | |
| } | |
| if (DOMMutationMethods.hasOwnProperty(propName)) { | |
| propertyInfo.mutationMethod = DOMMutationMethods[propName]; | |
| } | |
| DOMProperty.properties[propName] = propertyInfo; | |
| } | |
| } | |
| }; | |
| /* eslint-disable max-len */ | |
| var ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD'; | |
| /* eslint-enable max-len */ | |
| /** | |
| * DOMProperty exports lookup objects that can be used like functions: | |
| * | |
| * > DOMProperty.isValid['id'] | |
| * true | |
| * > DOMProperty.isValid['foobar'] | |
| * undefined | |
| * | |
| * Although this may be confusing, it performs better in general. | |
| * | |
| * @see http://jsperf.com/key-exists | |
| * @see http://jsperf.com/key-missing | |
| */ | |
| var DOMProperty = { | |
| ID_ATTRIBUTE_NAME: 'data-reactid', | |
| ROOT_ATTRIBUTE_NAME: 'data-reactroot', | |
| ATTRIBUTE_NAME_START_CHAR: ATTRIBUTE_NAME_START_CHAR, | |
| ATTRIBUTE_NAME_CHAR: ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040', | |
| /** | |
| * Map from property "standard name" to an object with info about how to set | |
| * the property in the DOM. Each object contains: | |
| * | |
| * attributeName: | |
| * Used when rendering markup or with `*Attribute()`. | |
| * attributeNamespace | |
| * propertyName: | |
| * Used on DOM node instances. (This includes properties that mutate due to | |
| * external factors.) | |
| * mutationMethod: | |
| * If non-null, used instead of the property or `setAttribute()` after | |
| * initial render. | |
| * mustUseProperty: | |
| * Whether the property must be accessed and mutated as an object property. | |
| * hasBooleanValue: | |
| * Whether the property should be removed when set to a falsey value. | |
| * hasNumericValue: | |
| * Whether the property must be numeric or parse as a numeric and should be | |
| * removed when set to a falsey value. | |
| * hasPositiveNumericValue: | |
| * Whether the property must be positive numeric or parse as a positive | |
| * numeric and should be removed when set to a falsey value. | |
| * hasOverloadedBooleanValue: | |
| * Whether the property can be used as a flag as well as with a value. | |
| * Removed when strictly equal to false; present without a value when | |
| * strictly equal to true; present with a value otherwise. | |
| */ | |
| properties: {}, | |
| /** | |
| * Mapping from lowercase property names to the properly cased version, used | |
| * to warn in the case of missing properties. Available only in __DEV__. | |
| * @type {Object} | |
| */ | |
| getPossibleStandardName: process.env.NODE_ENV !== 'production' ? {} : null, | |
| /** | |
| * All of the isCustomAttribute() functions that have been injected. | |
| */ | |
| _isCustomAttributeFunctions: [], | |
| /** | |
| * Checks whether a property name is a custom attribute. | |
| * @method | |
| */ | |
| isCustomAttribute: function (attributeName) { | |
| for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) { | |
| var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i]; | |
| if (isCustomAttributeFn(attributeName)) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| }, | |
| injection: DOMPropertyInjection | |
| }; | |
| module.exports = DOMProperty; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvRE9NUHJvcGVydHkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBET01Qcm9wZXJ0eVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG5mdW5jdGlvbiBjaGVja01hc2sodmFsdWUsIGJpdG1hc2spIHtcbiAgcmV0dXJuICh2YWx1ZSAmIGJpdG1hc2spID09PSBiaXRtYXNrO1xufVxuXG52YXIgRE9NUHJvcGVydHlJbmplY3Rpb24gPSB7XG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbm9ybWFsaXplZCwgY2FtZWxjYXNlZCBwcm9wZXJ0eSBuYW1lcyB0byBhIGNvbmZpZ3VyYXRpb24gdGhhdFxuICAgKiBzcGVjaWZpZXMgaG93IHRoZSBhc3NvY2lhdGVkIERPTSBwcm9wZXJ0eSBzaG91bGQgYmUgYWNjZXNzZWQgb3IgcmVuZGVyZWQuXG4gICAqL1xuICBNVVNUX1VTRV9QUk9QRVJUWTogMHgxLFxuICBIQVNfQk9PTEVBTl9WQUxVRTogMHg0LFxuICBIQVNfTlVNRVJJQ19WQUxVRTogMHg4LFxuICBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRTogMHgxMCB8IDB4OCxcbiAgSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTogMHgyMCxcblxuICAvKipcbiAgICogSW5qZWN0IHNvbWUgc3BlY2lhbGl6ZWQga25vd2xlZGdlIGFib3V0IHRoZSBET00uIFRoaXMgdGFrZXMgYSBjb25maWcgb2JqZWN0XG4gICAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiBpc0N1c3RvbUF0dHJpYnV0ZTogZnVuY3Rpb24gdGhhdCBnaXZlbiBhbiBhdHRyaWJ1dGUgbmFtZSB3aWxsIHJldHVybiB0cnVlXG4gICAqIGlmIGl0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00gdmVyYmF0aW0uIFVzZWZ1bCBmb3IgZGF0YS0qIG9yIGFyaWEtKlxuICAgKiBhdHRyaWJ1dGVzIHdoZXJlIGl0J3MgaW1wb3NzaWJsZSB0byBlbnVtZXJhdGUgYWxsIG9mIHRoZSBwb3NzaWJsZVxuICAgKiBhdHRyaWJ1dGUgbmFtZXMsXG4gICAqXG4gICAqIFByb3BlcnRpZXM6IG9iamVjdCBtYXBwaW5nIERPTSBwcm9wZXJ0eSBuYW1lIHRvIG9uZSBvZiB0aGVcbiAgICogRE9NUHJvcGVydHlJbmplY3Rpb24gY29uc3RhbnRzIG9yIG51bGwuIElmIHlvdXIgYXR0cmlidXRlIGlzbid0IGluIGhlcmUsXG4gICAqIGl0IHdvbid0IGdldCB3cml0dGVuIHRvIHRoZSBET00uXG4gICAqXG4gICAqIERPTUF0dHJpYnV0ZU5hbWVzOiBvYmplY3QgbWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NXG4gICAqIGF0dHJpYnV0ZSBuYW1lLiBBdHRyaWJ1dGUgbmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlICoqbG93ZXJjYXNlKipcbiAgICogbm9ybWFsaXplZCBuYW1lLlxuICAgKlxuICAgKiBET01BdHRyaWJ1dGVOYW1lc3BhY2VzOiBvYmplY3QgbWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NXG4gICAqIGF0dHJpYnV0ZSBuYW1lc3BhY2UgVVJMLiAoQXR0cmlidXRlIG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIG5vIG5hbWVzcGFjZS4pXG4gICAqXG4gICAqIERPTVByb3BlcnR5TmFtZXM6IHNpbWlsYXIgdG8gRE9NQXR0cmlidXRlTmFtZXMgYnV0IGZvciBET00gcHJvcGVydGllcy5cbiAgICogUHJvcGVydHkgbmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlIG5vcm1hbGl6ZWQgbmFtZS5cbiAgICpcbiAgICogRE9NTXV0YXRpb25NZXRob2RzOiBQcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIG11dGF0aW9uIG1ldGhvZHMuIElmXG4gICAqIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLCB0aGUgbXV0YXRpb24gbWV0aG9kIHNob3VsZCB1bnNldCB0aGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkb21Qcm9wZXJ0eUNvbmZpZyB0aGUgY29uZmlnIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgICovXG4gIGluamVjdERPTVByb3BlcnR5Q29uZmlnOiBmdW5jdGlvbiAoZG9tUHJvcGVydHlDb25maWcpIHtcbiAgICB2YXIgSW5qZWN0aW9uID0gRE9NUHJvcGVydHlJbmplY3Rpb247XG4gICAgdmFyIFByb3BlcnRpZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0aWVzIHx8IHt9O1xuICAgIHZhciBET01BdHRyaWJ1dGVOYW1lc3BhY2VzID0gZG9tUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXNwYWNlcyB8fCB7fTtcbiAgICB2YXIgRE9NQXR0cmlidXRlTmFtZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lcyB8fCB7fTtcbiAgICB2YXIgRE9NUHJvcGVydHlOYW1lcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTVByb3BlcnR5TmFtZXMgfHwge307XG4gICAgdmFyIERPTU11dGF0aW9uTWV0aG9kcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTU11dGF0aW9uTWV0aG9kcyB8fCB7fTtcblxuICAgIGlmIChkb21Qcm9wZXJ0eUNvbmZpZy5pc0N1c3RvbUF0dHJpYnV0ZSkge1xuICAgICAgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLnB1c2goZG9tUHJvcGVydHlDb25maWcuaXNDdXN0b21BdHRyaWJ1dGUpO1xuICAgIH1cblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIFByb3BlcnRpZXMpIHtcbiAgICAgICEhRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaW5qZWN0RE9NUHJvcGVydHlDb25maWcoLi4uKTogWW91XFwncmUgdHJ5aW5nIHRvIGluamVjdCBET00gcHJvcGVydHkgXFwnJXNcXCcgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBpbmplY3RlZC4gWW91IG1heSBiZSBhY2NpZGVudGFsbHkgaW5qZWN0aW5nIHRoZSBzYW1lIERPTSBwcm9wZXJ0eSBjb25maWcgdHdpY2UsIG9yIHlvdSBtYXkgYmUgaW5qZWN0aW5nIHR3byBjb25maWdzIHRoYXQgaGF2ZSBjb25mbGljdGluZyBwcm9wZXJ0eSBuYW1lcy4nLCBwcm9wTmFtZSkgOiBfcHJvZEludmFyaWFudCgnNDgnLCBwcm9wTmFtZSkgOiB2b2lkIDA7XG5cbiAgICAgIHZhciBsb3dlckNhc2VkID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBwcm9wQ29uZmlnID0gUHJvcGVydGllc1twcm9wTmFtZV07XG5cbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSB7XG4gICAgICAgIGF0dHJpYnV0ZU5hbWU6IGxvd2VyQ2FzZWQsXG4gICAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZTogbnVsbCxcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wTmFtZSxcbiAgICAgICAgbXV0YXRpb25NZXRob2Q6IG51bGwsXG5cbiAgICAgICAgbXVzdFVzZVByb3BlcnR5OiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZKSxcbiAgICAgICAgaGFzQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFKSxcbiAgICAgICAgaGFzTnVtZXJpY1ZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFKSxcbiAgICAgICAgaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLFxuICAgICAgICBoYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUpXG4gICAgICB9O1xuICAgICAgIShwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlICsgcHJvcGVydHlJbmZvLmhhc051bWVyaWNWYWx1ZSArIHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlIDw9IDEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0RPTVByb3BlcnR5OiBWYWx1ZSBjYW4gYmUgb25lIG9mIGJvb2xlYW4sIG92ZXJsb2FkZWQgYm9vbGVhbiwgb3IgbnVtZXJpYyB2YWx1ZSwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uOiAlcycsIHByb3BOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc1MCcsIHByb3BOYW1lKSA6IHZvaWQgMDtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZF0gPSBwcm9wTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IERPTUF0dHJpYnV0ZU5hbWVzW3Byb3BOYW1lXTtcbiAgICAgICAgcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2F0dHJpYnV0ZU5hbWVdID0gcHJvcE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBET01BdHRyaWJ1dGVOYW1lc3BhY2VzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTVByb3BlcnR5TmFtZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWUgPSBET01Qcm9wZXJ0eU5hbWVzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTU11dGF0aW9uTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kID0gRE9NTXV0YXRpb25NZXRob2RzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wTmFtZV0gPSBwcm9wZXJ0eUluZm87XG4gICAgfVxuICB9XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9ICc6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEJztcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG4vKipcbiAqIERPTVByb3BlcnR5IGV4cG9ydHMgbG9va3VwIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBsaWtlIGZ1bmN0aW9uczpcbiAqXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnaWQnXVxuICogICB0cnVlXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnZm9vYmFyJ11cbiAqICAgdW5kZWZpbmVkXG4gKlxuICogQWx0aG91Z2ggdGhpcyBtYXkgYmUgY29uZnVzaW5nLCBpdCBwZXJmb3JtcyBiZXR0ZXIgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2tleS1leGlzdHNcbiAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LW1pc3NpbmdcbiAqL1xudmFyIERPTVByb3BlcnR5ID0ge1xuXG4gIElEX0FUVFJJQlVURV9OQU1FOiAnZGF0YS1yZWFjdGlkJyxcbiAgUk9PVF9BVFRSSUJVVEVfTkFNRTogJ2RhdGEtcmVhY3Ryb290JyxcblxuICBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSOiBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSLFxuICBBVFRSSUJVVEVfTkFNRV9DSEFSOiBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ1xcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwJyxcblxuICAvKipcbiAgICogTWFwIGZyb20gcHJvcGVydHkgXCJzdGFuZGFyZCBuYW1lXCIgdG8gYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCBob3cgdG8gc2V0XG4gICAqIHRoZSBwcm9wZXJ0eSBpbiB0aGUgRE9NLiBFYWNoIG9iamVjdCBjb250YWluczpcbiAgICpcbiAgICogYXR0cmlidXRlTmFtZTpcbiAgICogICBVc2VkIHdoZW4gcmVuZGVyaW5nIG1hcmt1cCBvciB3aXRoIGAqQXR0cmlidXRlKClgLlxuICAgKiBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgICogcHJvcGVydHlOYW1lOlxuICAgKiAgIFVzZWQgb24gRE9NIG5vZGUgaW5zdGFuY2VzLiAoVGhpcyBpbmNsdWRlcyBwcm9wZXJ0aWVzIHRoYXQgbXV0YXRlIGR1ZSB0b1xuICAgKiAgIGV4dGVybmFsIGZhY3RvcnMuKVxuICAgKiBtdXRhdGlvbk1ldGhvZDpcbiAgICogICBJZiBub24tbnVsbCwgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwcm9wZXJ0eSBvciBgc2V0QXR0cmlidXRlKClgIGFmdGVyXG4gICAqICAgaW5pdGlhbCByZW5kZXIuXG4gICAqIG11c3RVc2VQcm9wZXJ0eTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFjY2Vzc2VkIGFuZCBtdXRhdGVkIGFzIGFuIG9iamVjdCBwcm9wZXJ0eS5cbiAgICogaGFzQm9vbGVhblZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSByZW1vdmVkIHdoZW4gc2V0IHRvIGEgZmFsc2V5IHZhbHVlLlxuICAgKiBoYXNOdW1lcmljVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVtZXJpYyBhbmQgc2hvdWxkIGJlXG4gICAqICAgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS5cbiAgICogaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmVcbiAgICogICBudW1lcmljIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS5cbiAgICogaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4gICAqICAgUmVtb3ZlZCB3aGVuIHN0cmljdGx5IGVxdWFsIHRvIGZhbHNlOyBwcmVzZW50IHdpdGhvdXQgYSB2YWx1ZSB3aGVuXG4gICAqICAgc3RyaWN0bHkgZXF1YWwgdG8gdHJ1ZTsgcHJlc2VudCB3aXRoIGEgdmFsdWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvcGVydGllczoge30sXG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcHJvcGVydHkgbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sIHVzZWRcbiAgICogdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIHByb3BlcnRpZXMuIEF2YWlsYWJsZSBvbmx5IGluIF9fREVWX18uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHt9IDogbnVsbCxcblxuICAvKipcbiAgICogQWxsIG9mIHRoZSBpc0N1c3RvbUF0dHJpYnV0ZSgpIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBpbmplY3RlZC5cbiAgICovXG4gIF9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uczogW10sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgcHJvcGVydHkgbmFtZSBpcyBhIGN1c3RvbSBhdHRyaWJ1dGUuXG4gICAqIEBtZXRob2RcbiAgICovXG4gIGlzQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXNDdXN0b21BdHRyaWJ1dGVGbiA9IERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1tpXTtcbiAgICAgIGlmIChpc0N1c3RvbUF0dHJpYnV0ZUZuKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiBET01Qcm9wZXJ0eUluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eTsiXX0= | |
| },{"./reactProdInvariant":132,"_process":1,"fbjs/lib/invariant":154}],12:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule DOMPropertyOperations | |
| */ | |
| 'use strict'; | |
| var DOMProperty = require('./DOMProperty'); | |
| var ReactDOMComponentTree = require('./ReactDOMComponentTree'); | |
| var ReactInstrumentation = require('./ReactInstrumentation'); | |
| var quoteAttributeValueForBrowser = require('./quoteAttributeValueForBrowser'); | |
| var warning = require('fbjs/lib/warning'); | |
| var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$'); | |
| var illegalAttributeNameCache = {}; | |
| var validatedAttributeNameCache = {}; | |
| function isAttributeNameSafe(attributeName) { | |
| if (validatedAttributeNameCache.hasOwnProperty(attributeName)) { | |
| return true; | |
| } | |
| if (illegalAttributeNameCache.hasOwnProperty(attributeName)) { | |
| return false; | |
| } | |
| if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { | |
| validatedAttributeNameCache[attributeName] = true; | |
| return true; | |
| } | |
| illegalAttributeNameCache[attributeName] = true; | |
| process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : void 0; | |
| return false; | |
| } | |
| function shouldIgnoreValue(propertyInfo, value) { | |
| return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false; | |
| } | |
| /** | |
| * Operations for dealing with DOM properties. | |
| */ | |
| var DOMPropertyOperations = { | |
| /** | |
| * Creates markup for the ID property. | |
| * | |
| * @param {string} id Unescaped ID. | |
| * @return {string} Markup string. | |
| */ | |
| createMarkupForID: function (id) { | |
| return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id); | |
| }, | |
| setAttributeForID: function (node, id) { | |
| node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id); | |
| }, | |
| createMarkupForRoot: function () { | |
| return DOMProperty.ROOT_ATTRIBUTE_NAME + '=""'; | |
| }, | |
| setAttributeForRoot: function (node) { | |
| node.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME, ''); | |
| }, | |
| /** | |
| * Creates markup for a property. | |
| * | |
| * @param {string} name | |
| * @param {*} value | |
| * @return {?string} Markup string, or null if the property was invalid. | |
| */ | |
| createMarkupForProperty: function (name, value) { | |
| var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; | |
| if (propertyInfo) { | |
| if (shouldIgnoreValue(propertyInfo, value)) { | |
| return ''; | |
| } | |
| var attributeName = propertyInfo.attributeName; | |
| if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { | |
| return attributeName + '=""'; | |
| } | |
| return attributeName + '=' + quoteAttributeValueForBrowser(value); | |
| } else if (DOMProperty.isCustomAttribute(name)) { | |
| if (value == null) { | |
| return ''; | |
| } | |
| return name + '=' + quoteAttributeValueForBrowser(value); | |
| } | |
| return null; | |
| }, | |
| /** | |
| * Creates markup for a custom property. | |
| * | |
| * @param {string} name | |
| * @param {*} value | |
| * @return {string} Markup string, or empty string if the property was invalid. | |
| */ | |
| createMarkupForCustomAttribute: function (name, value) { | |
| if (!isAttributeNameSafe(name) || value == null) { | |
| return ''; | |
| } | |
| return name + '=' + quoteAttributeValueForBrowser(value); | |
| }, | |
| /** | |
| * Sets the value for a property on a node. | |
| * | |
| * @param {DOMElement} node | |
| * @param {string} name | |
| * @param {*} value | |
| */ | |
| setValueForProperty: function (node, name, value) { | |
| var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; | |
| if (propertyInfo) { | |
| var mutationMethod = propertyInfo.mutationMethod; | |
| if (mutationMethod) { | |
| mutationMethod(node, value); | |
| } else if (shouldIgnoreValue(propertyInfo, value)) { | |
| this.deleteValueForProperty(node, name); | |
| return; | |
| } else if (propertyInfo.mustUseProperty) { | |
| // Contrary to `setAttribute`, object properties are properly | |
| // `toString`ed by IE8/9. | |
| node[propertyInfo.propertyName] = value; | |
| } else { | |
| var attributeName = propertyInfo.attributeName; | |
| var namespace = propertyInfo.attributeNamespace; | |
| // `setAttribute` with objects becomes only `[object]` in IE8/9, | |
| // ('' + value) makes it output the correct toString()-value. | |
| if (namespace) { | |
| node.setAttributeNS(namespace, attributeName, '' + value); | |
| } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { | |
| node.setAttribute(attributeName, ''); | |
| } else { | |
| node.setAttribute(attributeName, '' + value); | |
| } | |
| } | |
| } else if (DOMProperty.isCustomAttribute(name)) { | |
| DOMPropertyOperations.setValueForAttribute(node, name, value); | |
| return; | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| var payload = {}; | |
| payload[name] = value; | |
| ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(node)._debugID, 'update attribute', payload); | |
| } | |
| }, | |
| setValueForAttribute: function (node, name, value) { | |
| if (!isAttributeNameSafe(name)) { | |
| return; | |
| } | |
| if (value == null) { | |
| node.removeAttribute(name); | |
| } else { | |
| node.setAttribute(name, '' + value); | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| var payload = {}; | |
| payload[name] = value; | |
| ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(node)._debugID, 'update attribute', payload); | |
| } | |
| }, | |
| /** | |
| * Deletes an attributes from a node. | |
| * | |
| * @param {DOMElement} node | |
| * @param {string} name | |
| */ | |
| deleteValueForAttribute: function (node, name) { | |
| node.removeAttribute(name); | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(node)._debugID, 'remove attribute', name); | |
| } | |
| }, | |
| /** | |
| * Deletes the value for a property on a node. | |
| * | |
| * @param {DOMElement} node | |
| * @param {string} name | |
| */ | |
| deleteValueForProperty: function (node, name) { | |
| var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; | |
| if (propertyInfo) { | |
| var mutationMethod = propertyInfo.mutationMethod; | |
| if (mutationMethod) { | |
| mutationMethod(node, undefined); | |
| } else if (propertyInfo.mustUseProperty) { | |
| var propName = propertyInfo.propertyName; | |
| if (propertyInfo.hasBooleanValue) { | |
| node[propName] = false; | |
| } else { | |
| node[propName] = ''; | |
| } | |
| } else { | |
| node.removeAttribute(propertyInfo.attributeName); | |
| } | |
| } else if (DOMProperty.isCustomAttribute(name)) { | |
| node.removeAttribute(name); | |
| } | |
| if (process.env.NODE_ENV !== 'production') { | |
| ReactInstrumentation.debugTool.onHostOperation(ReactDOMComponentTree.getInstanceFromNode(node)._debugID, 'remove attribute', name); | |
| } | |
| } | |
| }; | |
| module.exports = DOMPropertyOperations; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvRE9NUHJvcGVydHlPcGVyYXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgRE9NUHJvcGVydHlPcGVyYXRpb25zXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3NlcicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ15bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5cbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgJiYgIXZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNOdW1lcmljVmFsdWUgJiYgaXNOYU4odmFsdWUpIHx8IHByb3BlcnR5SW5mby5oYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZSAmJiB2YWx1ZSA8IDEgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IGZhbHNlO1xufVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBET00gcHJvcGVydGllcy5cbiAqL1xudmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBJRCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFVuZXNjYXBlZCBJRC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9ySUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKGlkKTtcbiAgfSxcblxuICBzZXRBdHRyaWJ1dGVGb3JJRDogZnVuY3Rpb24gKG5vZGUsIGlkKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUUsIGlkKTtcbiAgfSxcblxuICBjcmVhdGVNYXJrdXBGb3JSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUUgKyAnPVwiXCInO1xuICB9LFxuXG4gIHNldEF0dHJpYnV0ZUZvclJvb3Q6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSwgJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC5cbiAgICovXG4gIGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eUluZm8pIHtcbiAgICAgIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPVwiXCInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBjdXN0b20gcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3BlcnR5IHdhcyBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgc2V0VmFsdWVGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbiAgICBpZiAocHJvcGVydHlJbmZvKSB7XG4gICAgICB2YXIgbXV0YXRpb25NZXRob2QgPSBwcm9wZXJ0eUluZm8ubXV0YXRpb25NZXRob2Q7XG4gICAgICBpZiAobXV0YXRpb25NZXRob2QpIHtcbiAgICAgICAgbXV0YXRpb25NZXRob2Qobm9kZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgICAgbm9kZVtwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG4gICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVgIHdpdGggb2JqZWN0cyBiZWNvbWVzIG9ubHkgYFtvYmplY3RdYCBpbiBJRTgvOSxcbiAgICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsICcnICsgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcGF5bG9hZCA9IHt9O1xuICAgICAgcGF5bG9hZFtuYW1lXSA9IHZhbHVlO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbihSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCwgJ3VwZGF0ZSBhdHRyaWJ1dGUnLCBwYXlsb2FkKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0VmFsdWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lLCB2YWx1ZSkge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnICsgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcGF5bG9hZCA9IHt9O1xuICAgICAgcGF5bG9hZFtuYW1lXSA9IHZhbHVlO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbihSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCwgJ3VwZGF0ZSBhdHRyaWJ1dGUnLCBwYXlsb2FkKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gYXR0cmlidXRlcyBmcm9tIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBkZWxldGVWYWx1ZUZvckF0dHJpYnV0ZTogZnVuY3Rpb24gKG5vZGUsIG5hbWUpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbihSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCwgJ3JlbW92ZSBhdHRyaWJ1dGUnLCBuYW1lKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBkZWxldGVWYWx1ZUZvclByb3BlcnR5OiBmdW5jdGlvbiAobm9kZSwgbmFtZSkge1xuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG4gICAgaWYgKHByb3BlcnR5SW5mbykge1xuICAgICAgdmFyIG11dGF0aW9uTWV0aG9kID0gcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kO1xuICAgICAgaWYgKG11dGF0aW9uTWV0aG9kKSB7XG4gICAgICAgIG11dGF0aW9uTWV0aG9kKG5vZGUsIHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUpIHtcbiAgICAgICAgICBub2RlW3Byb3BOYW1lXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbihSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCwgJ3JlbW92ZSBhdHRyaWJ1dGUnLCBuYW1lKTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eU9wZXJhdGlvbnM7Il19 | |
| },{"./DOMProperty":11,"./ReactDOMComponentTree":42,"./ReactInstrumentation":70,"./quoteAttributeValueForBrowser":131,"_process":1,"fbjs/lib/warning":163}],13:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule Danger | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var DOMLazyTree = require('./DOMLazyTree'); | |
| var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment'); | |
| var createNodesFromMarkup = require('fbjs/lib/createNodesFromMarkup'); | |
| var emptyFunction = require('fbjs/lib/emptyFunction'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| var Danger = { | |
| /** | |
| * Replaces a node with a string of markup at its current position within its | |
| * parent. The markup must render into a single root node. | |
| * | |
| * @param {DOMElement} oldChild Child node to replace. | |
| * @param {string} markup Markup to render in place of the child node. | |
| * @internal | |
| */ | |
| dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) { | |
| !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString() for server rendering.') : _prodInvariant('56') : void 0; | |
| !markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : _prodInvariant('57') : void 0; | |
| !(oldChild.nodeName !== 'HTML') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the <html> node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString().') : _prodInvariant('58') : void 0; | |
| if (typeof markup === 'string') { | |
| var newChild = createNodesFromMarkup(markup, emptyFunction)[0]; | |
| oldChild.parentNode.replaceChild(newChild, oldChild); | |
| } else { | |
| DOMLazyTree.replaceChildWithTree(oldChild, markup); | |
| } | |
| } | |
| }; | |
| module.exports = Danger; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvRGFuZ2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBEYW5nZXJcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAgPSByZXF1aXJlKCdmYmpzL2xpYi9jcmVhdGVOb2Rlc0Zyb21NYXJrdXAnKTtcbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgRGFuZ2VyID0ge1xuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIG5vZGUgd2l0aCBhIHN0cmluZyBvZiBtYXJrdXAgYXQgaXRzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGl0c1xuICAgKiBwYXJlbnQuIFRoZSBtYXJrdXAgbXVzdCByZW5kZXIgaW50byBhIHNpbmdsZSByb290IG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb2xkQ2hpbGQgQ2hpbGQgbm9kZSB0byByZXBsYWNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIE1hcmt1cCB0byByZW5kZXIgaW4gcGxhY2Ugb2YgdGhlIGNoaWxkIG5vZGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwKSB7XG4gICAgIUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBDYW5ub3QgcmVuZGVyIG1hcmt1cCBpbiBhIHdvcmtlciB0aHJlYWQuIE1ha2Ugc3VyZSBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBhcmUgYXZhaWxhYmxlIGdsb2JhbGx5IGJlZm9yZSByZXF1aXJpbmcgUmVhY3Qgd2hlbiB1bml0IHRlc3Rpbmcgb3IgdXNlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkgZm9yIHNlcnZlciByZW5kZXJpbmcuJykgOiBfcHJvZEludmFyaWFudCgnNTYnKSA6IHZvaWQgMDtcbiAgICAhbWFya3VwID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IE1pc3NpbmcgbWFya3VwLicpIDogX3Byb2RJbnZhcmlhbnQoJzU3JykgOiB2b2lkIDA7XG4gICAgIShvbGRDaGlsZC5ub2RlTmFtZSAhPT0gJ0hUTUwnKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBDYW5ub3QgcmVwbGFjZSBtYXJrdXAgb2YgdGhlIDxodG1sPiBub2RlLiBUaGlzIGlzIGJlY2F1c2UgYnJvd3NlciBxdWlya3MgbWFrZSB0aGlzIHVucmVsaWFibGUgYW5kL29yIHNsb3cuIElmIHlvdSB3YW50IHRvIHJlbmRlciB0byB0aGUgcm9vdCB5b3UgbXVzdCB1c2Ugc2VydmVyIHJlbmRlcmluZy4gU2VlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkuJykgOiBfcHJvZEludmFyaWFudCgnNTgnKSA6IHZvaWQgMDtcblxuICAgIGlmICh0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG5ld0NoaWxkID0gY3JlYXRlTm9kZXNGcm9tTWFya3VwKG1hcmt1cCwgZW1wdHlGdW5jdGlvbilbMF07XG4gICAgICBvbGRDaGlsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZShvbGRDaGlsZCwgbWFya3VwKTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYW5nZXI7Il19 | |
| },{"./DOMLazyTree":9,"./reactProdInvariant":132,"_process":1,"fbjs/lib/ExecutionEnvironment":140,"fbjs/lib/createNodesFromMarkup":145,"fbjs/lib/emptyFunction":146,"fbjs/lib/invariant":154}],14:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule DefaultEventPluginOrder | |
| */ | |
| 'use strict'; | |
| var keyOf = require('fbjs/lib/keyOf'); | |
| /** | |
| * Module that is injectable into `EventPluginHub`, that specifies a | |
| * deterministic ordering of `EventPlugin`s. A convenient way to reason about | |
| * plugins, without having to package every one of them. This is better than | |
| * having plugins be ordered in the same order that they are injected because | |
| * that ordering would be influenced by the packaging order. | |
| * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that | |
| * preventing default on events is convenient in `SimpleEventPlugin` handlers. | |
| */ | |
| var DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null })]; | |
| module.exports = DefaultEventPluginOrder; | |
| },{"fbjs/lib/keyOf":158}],15:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule DisabledInputUtils | |
| */ | |
| 'use strict'; | |
| var disableableMouseListenerNames = { | |
| onClick: true, | |
| onDoubleClick: true, | |
| onMouseDown: true, | |
| onMouseMove: true, | |
| onMouseUp: true, | |
| onClickCapture: true, | |
| onDoubleClickCapture: true, | |
| onMouseDownCapture: true, | |
| onMouseMoveCapture: true, | |
| onMouseUpCapture: true | |
| }; | |
| /** | |
| * Implements a host component that does not receive mouse events | |
| * when `disabled` is set. | |
| */ | |
| var DisabledInputUtils = { | |
| getHostProps: function (inst, props) { | |
| if (!props.disabled) { | |
| return props; | |
| } | |
| // Copy the props, except the mouse listeners | |
| var hostProps = {}; | |
| for (var key in props) { | |
| if (!disableableMouseListenerNames[key] && props.hasOwnProperty(key)) { | |
| hostProps[key] = props[key]; | |
| } | |
| } | |
| return hostProps; | |
| } | |
| }; | |
| module.exports = DisabledInputUtils; | |
| },{}],16:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule EnterLeaveEventPlugin | |
| */ | |
| 'use strict'; | |
| var EventConstants = require('./EventConstants'); | |
| var EventPropagators = require('./EventPropagators'); | |
| var ReactDOMComponentTree = require('./ReactDOMComponentTree'); | |
| var SyntheticMouseEvent = require('./SyntheticMouseEvent'); | |
| var keyOf = require('fbjs/lib/keyOf'); | |
| var topLevelTypes = EventConstants.topLevelTypes; | |
| var eventTypes = { | |
| mouseEnter: { | |
| registrationName: keyOf({ onMouseEnter: null }), | |
| dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] | |
| }, | |
| mouseLeave: { | |
| registrationName: keyOf({ onMouseLeave: null }), | |
| dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] | |
| } | |
| }; | |
| var EnterLeaveEventPlugin = { | |
| eventTypes: eventTypes, | |
| /** | |
| * For almost every interaction we care about, there will be both a top-level | |
| * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that | |
| * we do not extract duplicate events. However, moving the mouse into the | |
| * browser from outside will not fire a `mouseout` event. In this case, we use | |
| * the `mouseover` top-level event. | |
| */ | |
| extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { | |
| if (topLevelType === topLevelTypes.topMouseOver && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { | |
| return null; | |
| } | |
| if (topLevelType !== topLevelTypes.topMouseOut && topLevelType !== topLevelTypes.topMouseOver) { | |
| // Must not be a mouse in or mouse out - ignoring. | |
| return null; | |
| } | |
| var win; | |
| if (nativeEventTarget.window === nativeEventTarget) { | |
| // `nativeEventTarget` is probably a window object. | |
| win = nativeEventTarget; | |
| } else { | |
| // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. | |
| var doc = nativeEventTarget.ownerDocument; | |
| if (doc) { | |
| win = doc.defaultView || doc.parentWindow; | |
| } else { | |
| win = window; | |
| } | |
| } | |
| var from; | |
| var to; | |
| if (topLevelType === topLevelTypes.topMouseOut) { | |
| from = targetInst; | |
| var related = nativeEvent.relatedTarget || nativeEvent.toElement; | |
| to = related ? ReactDOMComponentTree.getClosestInstanceFromNode(related) : null; | |
| } else { | |
| // Moving to a node from outside the window. | |
| from = null; | |
| to = targetInst; | |
| } | |
| if (from === to) { | |
| // Nothing pertains to our managed components. | |
| return null; | |
| } | |
| var fromNode = from == null ? win : ReactDOMComponentTree.getNodeFromInstance(from); | |
| var toNode = to == null ? win : ReactDOMComponentTree.getNodeFromInstance(to); | |
| var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, from, nativeEvent, nativeEventTarget); | |
| leave.type = 'mouseleave'; | |
| leave.target = fromNode; | |
| leave.relatedTarget = toNode; | |
| var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, to, nativeEvent, nativeEventTarget); | |
| enter.type = 'mouseenter'; | |
| enter.target = toNode; | |
| enter.relatedTarget = fromNode; | |
| EventPropagators.accumulateEnterLeaveDispatches(leave, enter, from, to); | |
| return [leave, enter]; | |
| } | |
| }; | |
| module.exports = EnterLeaveEventPlugin; | |
| },{"./EventConstants":17,"./EventPropagators":21,"./ReactDOMComponentTree":42,"./SyntheticMouseEvent":102,"fbjs/lib/keyOf":158}],17:[function(require,module,exports){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule EventConstants | |
| */ | |
| 'use strict'; | |
| var keyMirror = require('fbjs/lib/keyMirror'); | |
| var PropagationPhases = keyMirror({ bubbled: null, captured: null }); | |
| /** | |
| * Types of raw signals from the browser caught at the top level. | |
| */ | |
| var topLevelTypes = keyMirror({ | |
| topAbort: null, | |
| topAnimationEnd: null, | |
| topAnimationIteration: null, | |
| topAnimationStart: null, | |
| topBlur: null, | |
| topCanPlay: null, | |
| topCanPlayThrough: null, | |
| topChange: null, | |
| topClick: null, | |
| topCompositionEnd: null, | |
| topCompositionStart: null, | |
| topCompositionUpdate: null, | |
| topContextMenu: null, | |
| topCopy: null, | |
| topCut: null, | |
| topDoubleClick: null, | |
| topDrag: null, | |
| topDragEnd: null, | |
| topDragEnter: null, | |
| topDragExit: null, | |
| topDragLeave: null, | |
| topDragOver: null, | |
| topDragStart: null, | |
| topDrop: null, | |
| topDurationChange: null, | |
| topEmptied: null, | |
| topEncrypted: null, | |
| topEnded: null, | |
| topError: null, | |
| topFocus: null, | |
| topInput: null, | |
| topInvalid: null, | |
| topKeyDown: null, | |
| topKeyPress: null, | |
| topKeyUp: null, | |
| topLoad: null, | |
| topLoadedData: null, | |
| topLoadedMetadata: null, | |
| topLoadStart: null, | |
| topMouseDown: null, | |
| topMouseMove: null, | |
| topMouseOut: null, | |
| topMouseOver: null, | |
| topMouseUp: null, | |
| topPaste: null, | |
| topPause: null, | |
| topPlay: null, | |
| topPlaying: null, | |
| topProgress: null, | |
| topRateChange: null, | |
| topReset: null, | |
| topScroll: null, | |
| topSeeked: null, | |
| topSeeking: null, | |
| topSelectionChange: null, | |
| topStalled: null, | |
| topSubmit: null, | |
| topSuspend: null, | |
| topTextInput: null, | |
| topTimeUpdate: null, | |
| topTouchCancel: null, | |
| topTouchEnd: null, | |
| topTouchMove: null, | |
| topTouchStart: null, | |
| topTransitionEnd: null, | |
| topVolumeChange: null, | |
| topWaiting: null, | |
| topWheel: null | |
| }); | |
| var EventConstants = { | |
| topLevelTypes: topLevelTypes, | |
| PropagationPhases: PropagationPhases | |
| }; | |
| module.exports = EventConstants; | |
| },{"fbjs/lib/keyMirror":157}],18:[function(require,module,exports){ | |
| (function (process){ | |
| /** | |
| * Copyright 2013-present, Facebook, Inc. | |
| * All rights reserved. | |
| * | |
| * This source code is licensed under the BSD-style license found in the | |
| * LICENSE file in the root directory of this source tree. An additional grant | |
| * of patent rights can be found in the PATENTS file in the same directory. | |
| * | |
| * @providesModule EventPluginHub | |
| */ | |
| 'use strict'; | |
| var _prodInvariant = require('./reactProdInvariant'); | |
| var EventPluginRegistry = require('./EventPluginRegistry'); | |
| var EventPluginUtils = require('./EventPluginUtils'); | |
| var ReactErrorUtils = require('./ReactErrorUtils'); | |
| var accumulateInto = require('./accumulateInto'); | |
| var forEachAccumulated = require('./forEachAccumulated'); | |
| var invariant = require('fbjs/lib/invariant'); | |
| /** | |
| * Internal store for event listeners | |
| */ | |
| var listenerBank = {}; | |
| /** | |
| * Internal queue of events that have accumulated their dispatches and are | |
| * waiting to have their dispatches executed. | |
| */ | |
| var eventQueue = null; | |
| /** | |
| * Dispatches an event and releases it back into the pool, unless persistent. | |
| * | |
| * @param {?object} event Synthetic event to be dispatched. | |
| * @param {boolean} simulated If the event is simulated (changes exn behavior) | |
| * @private | |
| */ | |
| var executeDispatchesAndRelease = function (event, simulated) { | |
| if (event) { | |
| EventPluginUtils.executeDispatchesInOrder(event, simulated); | |
| if (!event.isPersistent()) { | |
| event.constructor.release(event); | |
| } | |
| } | |
| }; | |
| var executeDispatchesAndReleaseSimulated = function (e) { | |
| return executeDispatchesAndRelease(e, true); | |
| }; | |
| var executeDispatchesAndReleaseTopLevel = function (e) { | |
| return executeDispatchesAndRelease(e, false); | |
| }; | |
| var getDictionaryKey = function (inst) { | |
| // Prevents V8 performance issue: | |
| // https://github.com/facebook/react/pull/7232 | |
| return '.' + inst._rootNodeID; | |
| }; | |
| /** | |
| * This is a unified interface for event plugins to be installed and configured. | |
| * | |
| * Event plugins can implement the following properties: | |
| * | |
| * `extractEvents` {function(string, DOMEventTarget, string, object): *} | |
| * Required. When a top-level event is fired, this method is expected to | |
| * extract synthetic events that will in turn be queued and dispatched. | |
| * | |
| * `eventTypes` {object} | |
| * Optional, plugins that fire events must publish a mapping of registration | |
| * names that are used to register listeners. Values of this mapping must | |
| * be objects that contain `registrationName` or `phasedRegistrationNames`. | |
| * | |
| * `executeDispatch` {function(object, function, string)} | |
| * Optional, allows plugins to override how an event gets dispatched. By | |
| * default, the listener is simply invoked. | |
| * | |
| * Each plugin that is injected into `EventsPluginHub` is immediately operable. | |
| * | |
| * @public | |
| */ | |
| var EventPluginHub = { | |
| /** | |
| * Methods for injecting dependencies. | |
| */ | |
| injection: { | |
| /** | |
| * @param {array} InjectedEventPluginOrder | |
| * @public | |
| */ | |
| injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder, | |
| /** | |
| * @param {object} injectedNamesToPlugins Map from names to plugin modules. | |
| */ | |
| injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName | |
| }, | |
| /** | |
| * Stores `listener` at `listenerBank[registrationName][key]`. Is idempotent. | |
| * | |
| * @param {object} inst The instance, which is the source of events. | |
| * @param {string} registrationName Name of listener (e.g. `onClick`). | |
| * @param {function} listener The callback to store. | |
| */ | |
| putListener: function (inst, registrationName, listener) { | |
| !(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : _prodInvariant('94', registrationName, typeof listener) : void 0; | |
| var key = getDictionaryKey(inst); | |
| var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {}); | |
| bankForRegistrationName[key] = listener; | |
| var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; | |
| if (PluginModule && PluginModule.didPutListener) { | |
| PluginModule.didPutListener(inst, registrationName, listener); | |
| } | |
| }, | |
| /** | |
| * @param {object} inst The instance, which is the source of events. | |
| * @param {string} registrationName Name of listener (e.g. `onClick`). | |
| * @return {?function} The stored callback. | |
| */ | |
| getListener: function (inst, registrationName) { | |
| var bankForRegistrationName = listenerBank[registrationName]; | |
| var key = getDictionaryKey(inst); | |
| return bankForRegistrationName && bankForRegistrationName[key]; | |
| }, | |
| /** | |
| * Deletes a listener from the registration bank. | |
| * | |
| * @param {object} inst The instance, which is the source of events. | |
| * @param {string} registrationName Name of listener (e.g. `onClick`). | |
| */ | |
| deleteListener: function (inst, registrationName) { | |
| var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; | |
| if (PluginModule && PluginModule.willDeleteListener) { | |
| PluginModule.willDeleteListener(inst, registrationName); | |
| } | |
| var bankForRegistrationName = listenerBank[registrationName]; | |
| // TODO: This should never be null -- when is it? | |
| if (bankForRegistrationName) { | |
| var key = getDictionaryKey(inst); | |
| delete bankForRegistrationName[key]; | |
| } | |
| }, | |
| /** | |
| * Deletes all listeners for the DOM element with the supplied ID. | |
| * | |
| * @param {object} inst The instance, which is the source of events. | |
| */ | |
| deleteAllListeners: function (inst) { | |
| var key = getDictionaryKey(inst); | |
| for (var registrationName in listenerBank) { | |
| if (!listenerBank.hasOwnProperty(registrationName)) { | |
| continue; | |
| } | |
| if (!listenerBank[registrationName][key]) { | |
| continue; | |
| } | |
| var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; | |
| if (PluginModule && PluginModule.willDeleteListener) { | |
| PluginModule.willDeleteListener(inst, registrationName); | |
| } | |
| delete listenerBank[registrationName][key]; | |
| } | |
| }, | |
| /** | |
| * Allows registered plugins an opportunity to extract events from top-level | |
| * native browser events. | |
| * | |
| * @return {*} An accumulation of synthetic events. | |
| * @internal | |
| */ | |
| extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { | |
| var events; | |
| var plugins = EventPluginRegistry.plugins; | |
| for (var i = 0; i < plugins.length; i++) { | |
| // Not every plugin in the ordering may be loaded at runtime. | |
| var possiblePlugin = plugins[i]; | |
| if (possiblePlugin) { | |
| var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget); | |
| if (extractedEvents) { | |
| events = accumulateInto(events, extractedEvents); | |
| } | |
| } | |
| } | |
| return events; | |
| }, | |
| /** | |
| * Enqueues a synthetic event that should be dispatched when | |
| * `processEventQueue` is invoked. | |
| * | |
| * @param {*} events An accumulation of synthetic events. | |
| * @internal | |
| */ | |
| enqueueEvents: function (events) { | |
| if (events) { | |
| eventQueue = accumulateInto(eventQueue, events); | |
| } | |
| }, | |
| /** | |
| * Dispatches all synthetic events on the event queue. | |
| * | |
| * @internal | |
| */ | |
| processEventQueue: function (simulated) { | |
| // Set `eventQueue` to null before processing it so that we can tell if more | |
| // events get enqueued while processing. | |
| var processingEventQueue = eventQueue; | |
| eventQueue = null; | |
| if (simulated) { | |
| forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated); | |
| } else { | |
| forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel); | |
| } | |
| !!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : _prodInvariant('95') : void 0; | |
| // This would be a good time to rethrow if any of the event handlers threw. | |
| ReactErrorUtils.rethrowCaughtError(); | |
| }, | |
| /** | |
| * These are needed for tests only. Do not use! | |
| */ | |
| __purge: function () { | |
| listenerBank = {}; | |
| }, | |
| __getListenerBank: function () { | |
| return listenerBank; | |
| } | |
| }; | |
| module.exports = EventPluginHub; | |
| }).call(this,require('_process')) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvRXZlbnRQbHVnaW5IdWIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBFdmVudFBsdWdpbkh1YlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIEV2ZW50UGx1Z2luUmVnaXN0cnkgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luUmVnaXN0cnknKTtcbnZhciBFdmVudFBsdWdpblV0aWxzID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblV0aWxzJyk7XG52YXIgUmVhY3RFcnJvclV0aWxzID0gcmVxdWlyZSgnLi9SZWFjdEVycm9yVXRpbHMnKTtcblxudmFyIGFjY3VtdWxhdGVJbnRvID0gcmVxdWlyZSgnLi9hY2N1bXVsYXRlSW50bycpO1xudmFyIGZvckVhY2hBY2N1bXVsYXRlZCA9IHJlcXVpcmUoJy4vZm9yRWFjaEFjY3VtdWxhdGVkJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogSW50ZXJuYWwgc3RvcmUgZm9yIGV2ZW50IGxpc3RlbmVyc1xuICovXG52YXIgbGlzdGVuZXJCYW5rID0ge307XG5cbi8qKlxuICogSW50ZXJuYWwgcXVldWUgb2YgZXZlbnRzIHRoYXQgaGF2ZSBhY2N1bXVsYXRlZCB0aGVpciBkaXNwYXRjaGVzIGFuZCBhcmVcbiAqIHdhaXRpbmcgdG8gaGF2ZSB0aGVpciBkaXNwYXRjaGVzIGV4ZWN1dGVkLlxuICovXG52YXIgZXZlbnRRdWV1ZSA9IG51bGw7XG5cbi8qKlxuICogRGlzcGF0Y2hlcyBhbiBldmVudCBhbmQgcmVsZWFzZXMgaXQgYmFjayBpbnRvIHRoZSBwb29sLCB1bmxlc3MgcGVyc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGV2ZW50IFN5bnRoZXRpYyBldmVudCB0byBiZSBkaXNwYXRjaGVkLlxuICogQHBhcmFtIHtib29sZWFufSBzaW11bGF0ZWQgSWYgdGhlIGV2ZW50IGlzIHNpbXVsYXRlZCAoY2hhbmdlcyBleG4gYmVoYXZpb3IpXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlID0gZnVuY3Rpb24gKGV2ZW50LCBzaW11bGF0ZWQpIHtcbiAgaWYgKGV2ZW50KSB7XG4gICAgRXZlbnRQbHVnaW5VdGlscy5leGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIoZXZlbnQsIHNpbXVsYXRlZCk7XG5cbiAgICBpZiAoIWV2ZW50LmlzUGVyc2lzdGVudCgpKSB7XG4gICAgICBldmVudC5jb25zdHJ1Y3Rvci5yZWxlYXNlKGV2ZW50KTtcbiAgICB9XG4gIH1cbn07XG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlU2ltdWxhdGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZShlLCB0cnVlKTtcbn07XG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwgPSBmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUsIGZhbHNlKTtcbn07XG5cbnZhciBnZXREaWN0aW9uYXJ5S2V5ID0gZnVuY3Rpb24gKGluc3QpIHtcbiAgLy8gUHJldmVudHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbiAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3ROb2RlSUQ7XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgZXZlbnQgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQuXG4gKlxuICogRXZlbnQgcGx1Z2lucyBjYW4gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIGBleHRyYWN0RXZlbnRzYCB7ZnVuY3Rpb24oc3RyaW5nLCBET01FdmVudFRhcmdldCwgc3RyaW5nLCBvYmplY3QpOiAqfVxuICogICAgIFJlcXVpcmVkLiBXaGVuIGEgdG9wLWxldmVsIGV2ZW50IGlzIGZpcmVkLCB0aGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0b1xuICogICAgIGV4dHJhY3Qgc3ludGhldGljIGV2ZW50cyB0aGF0IHdpbGwgaW4gdHVybiBiZSBxdWV1ZWQgYW5kIGRpc3BhdGNoZWQuXG4gKlxuICogICBgZXZlbnRUeXBlc2Age29iamVjdH1cbiAqICAgICBPcHRpb25hbCwgcGx1Z2lucyB0aGF0IGZpcmUgZXZlbnRzIG11c3QgcHVibGlzaCBhIG1hcHBpbmcgb2YgcmVnaXN0cmF0aW9uXG4gKiAgICAgbmFtZXMgdGhhdCBhcmUgdXNlZCB0byByZWdpc3RlciBsaXN0ZW5lcnMuIFZhbHVlcyBvZiB0aGlzIG1hcHBpbmcgbXVzdFxuICogICAgIGJlIG9iamVjdHMgdGhhdCBjb250YWluIGByZWdpc3RyYXRpb25OYW1lYCBvciBgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNgLlxuICpcbiAqICAgYGV4ZWN1dGVEaXNwYXRjaGAge2Z1bmN0aW9uKG9iamVjdCwgZnVuY3Rpb24sIHN0cmluZyl9XG4gKiAgICAgT3B0aW9uYWwsIGFsbG93cyBwbHVnaW5zIHRvIG92ZXJyaWRlIGhvdyBhbiBldmVudCBnZXRzIGRpc3BhdGNoZWQuIEJ5XG4gKiAgICAgZGVmYXVsdCwgdGhlIGxpc3RlbmVyIGlzIHNpbXBseSBpbnZva2VkLlxuICpcbiAqIEVhY2ggcGx1Z2luIHRoYXQgaXMgaW5qZWN0ZWQgaW50byBgRXZlbnRzUGx1Z2luSHViYCBpcyBpbW1lZGlhdGVseSBvcGVyYWJsZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnZhciBFdmVudFBsdWdpbkh1YiA9IHtcblxuICAvKipcbiAgICogTWV0aG9kcyBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIGluamVjdGlvbjoge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcixcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTogRXZlbnRQbHVnaW5SZWdpc3RyeS5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWVcblxuICB9LFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYGxpc3RlbmVyYCBhdCBgbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV1gLiBJcyBpZGVtcG90ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzdG9yZS5cbiAgICovXG4gIHB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICAhKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgJXMgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgdHlwZSAlcycsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikgOiBfcHJvZEludmFyaWFudCgnOTQnLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpIDogdm9pZCAwO1xuXG4gICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgdmFyIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lID0gbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdIHx8IChsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV0gPSB7fSk7XG4gICAgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XSA9IGxpc3RlbmVyO1xuXG4gICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgaWYgKFBsdWdpbk1vZHVsZSAmJiBQbHVnaW5Nb2R1bGUuZGlkUHV0TGlzdGVuZXIpIHtcbiAgICAgIFBsdWdpbk1vZHVsZS5kaWRQdXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAgICovXG4gIGdldExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICByZXR1cm4gYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgJiYgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XTtcbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyBhIGxpc3RlbmVyIGZyb20gdGhlIHJlZ2lzdHJhdGlvbiBiYW5rLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqL1xuICBkZWxldGVMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIpIHtcbiAgICAgIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lID0gbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIG5ldmVyIGJlIG51bGwgLS0gd2hlbiBpcyBpdD9cbiAgICBpZiAoYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgICAgZGVsZXRlIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBsaXN0ZW5l |
View raw
(Sorry about that, but we can’t show files that are this big right now.)
View raw
(Sorry about that, but we can’t show files that are this big right now.)
View raw
(Sorry about that, but we can’t show files that are this big right now.)
View raw
(Sorry about that, but we can’t show files that are this big right now.)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment