snabberb 0.2.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1082dc274d342e91534fc2c0615235c80585c37bf2195669ef3c6b25ea3bfdde
4
- data.tar.gz: 7c71fe58f14f207fe650850bf4e662d3f4aabf5768d1e2162ee4451ecd3b2b14
3
+ metadata.gz: cedc3e54bfcb4b628750f8a7779975624cb72226c46ca0c2e7ea787d5b31e9f2
4
+ data.tar.gz: e0d593a26c2058022d6e6c3df9dc200c235aedf2524a9c774ebcabbfa8df7d3a
5
5
  SHA512:
6
- metadata.gz: 231d5adb9776e8eeb9528cd657d9f638e283c41e491c1f821e43c0a8643cd7ae605fcb206d8affc35b080dee3a867391477d4b770caa98c771426f1661b1c365
7
- data.tar.gz: 8a374e5338ff8a8099a78ae470833ae2ea41284d47a97060bc6b49f2a95f19f225258e88ae0ac97e8766db1a53e710a3d66aa186959b436e39657b88b9b806a1
6
+ metadata.gz: c0d1c3b840a0f0475204cdcdf8a603441bbbcc5f7fb1b3653081e4b8e25690663116ba639775b4ae8f7c045f904207225fa6d7bee27931a778c441c76e8385d9
7
+ data.tar.gz: f32c2619a9c422fe33cf7fdeddd97b968c7a68002865619f1077c63349e66caa24c820aad00fa66bf60de623d5e8e7f46f7a16ba374f9836cd9ce653badffddc
data/.gitignore CHANGED
@@ -8,6 +8,8 @@
8
8
  /tmp/
9
9
  /examples/roda/public
10
10
  /examples/roda/build
11
+ /node_modules/
12
+ package-lock.json
11
13
 
12
14
  .DS_STORE
13
15
  *.swp
@@ -6,6 +6,13 @@ Metrics/AbcSize:
6
6
 
7
7
  Metrics/BlockLength:
8
8
  Enabled: False
9
+
10
+ Metrics/CyclomaticComplexity:
11
+ Enabled: False
12
+
13
+ Metrics/PerceivedComplexity:
14
+ Enabled: False
15
+
9
16
  Metrics/LineLength:
10
17
  Max: 120
11
18
 
data/README.md CHANGED
@@ -105,7 +105,7 @@ class NestedExample < Snabberb::Component
105
105
  h(:div, { style: { width: '100px' } }, [
106
106
  h(:div, 'hello'),
107
107
  ])
108
- ](
108
+ ])
109
109
  end
110
110
  end
111
111
  ```
@@ -150,6 +150,14 @@ Snabberb.prerender_script('LayoutClass', 'ApplicationClass', 'application_id', j
150
150
 
151
151
  A detailed example can be found [in the Roda example](examples/roda).
152
152
 
153
+ ### Generating HTML from a File
154
+
155
+ You can generate HTML from a component with a file.
156
+
157
+ Snabberb.html\_script('path/to/my\_component.rb', **needs)
158
+
159
+ This reads in the ruby file at the path and generates javascript that calls html on the CamelCased version of the file name.
160
+
153
161
  ## Installation
154
162
 
155
163
  Add this line to your application's Gemfile:
@@ -0,0 +1,20 @@
1
+ // browserify deps.js -p esmify -s snabbdom > opal/vendor/snabbdom.js
2
+ import { init } from './node_modules/snabbdom/build/package/init'
3
+ import { h } from './node_modules/snabbdom/build/package/h'
4
+ import { toVNode } from './node_modules/snabbdom/build/package/tovnode'
5
+
6
+ import { attributesModule } from './node_modules/snabbdom/build/package/modules/attributes'
7
+ import { classModule } from './node_modules/snabbdom/build/package/modules/class'
8
+ import { eventListenersModule } from './node_modules/snabbdom/build/package/modules/eventlisteners'
9
+ import { propsModule } from './node_modules/snabbdom/build/package/modules/props'
10
+ import { styleModule } from './node_modules/snabbdom/build/package/modules/style'
11
+
12
+ module.exports.init = init
13
+ module.exports.h = h
14
+ module.exports.toVNode = toVNode
15
+
16
+ module.exports.attributesModule = attributesModule
17
+ module.exports.classModule = classModule
18
+ module.exports.eventListenersModule = eventListenersModule
19
+ module.exports.propsModule = propsModule
20
+ module.exports.styleModule = styleModule
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- snabberb (0.2.3)
4
+ snabberb (0.4.2)
5
5
  opal (~> 1.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.4.0)
10
+ ast (2.4.1)
11
11
  c_lexer (2.6.4.1.1)
12
12
  ast (~> 2.4.0)
13
13
  parser (= 2.6.4.1)
@@ -16,7 +16,7 @@ GEM
16
16
  parser (~> 2.6)
17
17
  parser (2.6.4.1)
18
18
  ast (~> 2.4.0)
19
- rack (2.2.2)
19
+ rack (2.2.3)
20
20
 
21
21
  PLATFORMS
22
22
  ruby
@@ -28,4 +28,4 @@ DEPENDENCIES
28
28
  snabberb!
29
29
 
30
30
  BUNDLED WITH
31
- 2.1.2
31
+ 2.1.4
@@ -1,32 +1,32 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- snabberb (0.2.3)
4
+ snabberb (0.4.2)
5
5
  opal (~> 1.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.4.0)
10
+ ast (2.4.1)
11
11
  c_lexer (2.6.4.1.1)
12
12
  ast (~> 2.4.0)
13
13
  parser (= 2.6.4.1)
14
- concurrent-ruby (1.1.6)
14
+ concurrent-ruby (1.1.7)
15
15
  execjs (2.7.0)
16
- libv8 (7.3.492.27.1)
17
- mini_racer (0.2.9)
18
- libv8 (>= 6.9.411)
16
+ libv8 (8.4.255.0)
17
+ mini_racer (0.3.1)
18
+ libv8 (~> 8.4.255)
19
19
  opal (1.0.3)
20
20
  ast (>= 2.3.0)
21
21
  parser (~> 2.6)
22
- opal-sprockets (0.4.8.1.0.3.7)
22
+ opal-sprockets (0.4.9.1.0.3.7)
23
23
  opal (~> 1.0.0)
24
24
  sprockets (~> 3.7)
25
25
  tilt (>= 1.4)
26
26
  parser (2.6.4.1)
27
27
  ast (~> 2.4.0)
28
- rack (2.2.2)
29
- roda (3.30.0)
28
+ rack (2.2.3)
29
+ roda (3.36.0)
30
30
  rack
31
31
  sprockets (3.7.2)
32
32
  concurrent-ruby (~> 1.0)
@@ -46,4 +46,4 @@ DEPENDENCIES
46
46
  snabberb!
47
47
 
48
48
  BUNDLED WITH
49
- 2.1.2
49
+ 2.1.4
@@ -13,12 +13,12 @@ module Snabberb
13
13
  wrap_h(obj)
14
14
  when Array
15
15
  wrap_a(obj)
16
- when Numeric
16
+ when Numeric, TrueClass, FalseClass
17
17
  obj
18
18
  when nil
19
19
  'Opal.nil'
20
20
  else
21
- wrap_s(obj)
21
+ wrap_s(obj.to_s)
22
22
  end
23
23
  end
24
24
 
@@ -38,6 +38,21 @@ module Snabberb
38
38
  "Opal.hash(#{args})"
39
39
  end
40
40
 
41
+ # takes in a file and needs
42
+ # calls html on the CamelCased version of the file with the needs
43
+ def self.html_script(file, **needs)
44
+ klass = file.split('/').last
45
+ .split('.').first
46
+ .split('_').map(&:capitalize).join
47
+
48
+ script = <<~RUBY
49
+ #{File.read(file)}
50
+ #{klass}.html(`#{wrap(needs)}`)
51
+ RUBY
52
+
53
+ Opal.compile(script).strip.chomp(';')
54
+ end
55
+
41
56
  def self.prerender_script(layout, application, application_id, javascript_include_tags: '', **needs)
42
57
  needs = wrap(needs)
43
58
  attach_func = wrap_s("Opal.$$.#{application}.$attach(\"#{application_id}\", #{needs})")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Snabberb
4
- VERSION = '0.2.5'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -3,13 +3,7 @@
3
3
  require 'native'
4
4
 
5
5
  require 'vendor/snabbdom'
6
- require 'vendor/snabbdom-attributes'
7
- require 'vendor/snabbdom-class'
8
- require 'vendor/snabbdom-eventlisteners'
9
- require 'vendor/snabbdom-props'
10
- require 'vendor/snabbdom-style'
11
6
  require 'vendor/snabbdom-to-html'
12
- require 'vendor/tovnode'
13
7
 
14
8
  require 'snabberb/component'
15
9
 
@@ -96,11 +96,11 @@ module Snabberb
96
96
  return unless request_ids.empty?
97
97
 
98
98
  @@patcher ||= %x{snabbdom.init([
99
- snabbdom_attributes.default,
100
- snabbdom_class.default,
101
- snabbdom_eventlisteners.default,
102
- snabbdom_props.default,
103
- snabbdom_style.default,
99
+ snabbdom.attributesModule,
100
+ snabbdom.classModule,
101
+ snabbdom.eventListenersModule,
102
+ snabbdom.propsModule,
103
+ snabbdom.styleModule,
104
104
  ])}
105
105
  node = @root.render
106
106
  @@patcher.call(@root.node, node)
@@ -139,7 +139,7 @@ module Snabberb
139
139
  def init_needs(needs)
140
140
  class_needs.each do |key, opts|
141
141
  ivar = "@#{key}"
142
- if @store.key?(key)
142
+ if @store.key?(key) && opts[:store]
143
143
  instance_variable_set(ivar, @store[key])
144
144
  elsif needs.key?(key)
145
145
  @store[key] = needs[key] if opts[:store] && !@store.key?(key)
@@ -1,506 +1,1020 @@
1
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!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){
1
+ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
2
  "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- var vnode_1 = require("./vnode");
5
- var is = require("./is");
3
+
4
+ var _init = require("./node_modules/snabbdom/build/package/init");
5
+
6
+ var _h = require("./node_modules/snabbdom/build/package/h");
7
+
8
+ var _tovnode = require("./node_modules/snabbdom/build/package/tovnode");
9
+
10
+ var _attributes = require("./node_modules/snabbdom/build/package/modules/attributes");
11
+
12
+ var _class = require("./node_modules/snabbdom/build/package/modules/class");
13
+
14
+ var _eventlisteners = require("./node_modules/snabbdom/build/package/modules/eventlisteners");
15
+
16
+ var _props = require("./node_modules/snabbdom/build/package/modules/props");
17
+
18
+ var _style = require("./node_modules/snabbdom/build/package/modules/style");
19
+
20
+ module.exports.init = _init.init;
21
+ module.exports.h = _h.h;
22
+ module.exports.toVNode = _tovnode.toVNode;
23
+ module.exports.attributesModule = _attributes.attributesModule;
24
+ module.exports.classModule = _class.classModule;
25
+ module.exports.eventListenersModule = _eventlisteners.eventListenersModule;
26
+ module.exports.propsModule = _props.propsModule;
27
+ module.exports.styleModule = _style.styleModule;
28
+
29
+ },{"./node_modules/snabbdom/build/package/h":2,"./node_modules/snabbdom/build/package/init":4,"./node_modules/snabbdom/build/package/modules/attributes":6,"./node_modules/snabbdom/build/package/modules/class":7,"./node_modules/snabbdom/build/package/modules/eventlisteners":8,"./node_modules/snabbdom/build/package/modules/props":9,"./node_modules/snabbdom/build/package/modules/style":10,"./node_modules/snabbdom/build/package/tovnode":11}],2:[function(require,module,exports){
30
+ "use strict";
31
+
32
+ Object.defineProperty(exports, "__esModule", {
33
+ value: true
34
+ });
35
+ exports.h = h;
36
+
37
+ var _vnode = require("./vnode.js");
38
+
39
+ var is = _interopRequireWildcard(require("./is.js"));
40
+
41
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
42
+
43
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
44
+
6
45
  function addNS(data, children, sel) {
7
- data.ns = 'http://www.w3.org/2000/svg';
8
- if (sel !== 'foreignObject' && children !== undefined) {
9
- for (var i = 0; i < children.length; ++i) {
10
- var childData = children[i].data;
11
- if (childData !== undefined) {
12
- addNS(childData, children[i].children, children[i].sel);
13
- }
14
- }
46
+ data.ns = 'http://www.w3.org/2000/svg';
47
+
48
+ if (sel !== 'foreignObject' && children !== undefined) {
49
+ for (let i = 0; i < children.length; ++i) {
50
+ const childData = children[i].data;
51
+
52
+ if (childData !== undefined) {
53
+ addNS(childData, children[i].children, children[i].sel);
54
+ }
15
55
  }
56
+ }
16
57
  }
58
+
17
59
  function h(sel, b, c) {
18
- var data = {}, children, text, i;
19
- if (c !== undefined) {
20
- data = b;
21
- if (is.array(c)) {
22
- children = c;
23
- }
24
- else if (is.primitive(c)) {
25
- text = c;
26
- }
27
- else if (c && c.sel) {
28
- children = [c];
29
- }
60
+ var data = {};
61
+ var children;
62
+ var text;
63
+ var i;
64
+
65
+ if (c !== undefined) {
66
+ if (b !== null) {
67
+ data = b;
30
68
  }
31
- else if (b !== undefined) {
32
- if (is.array(b)) {
33
- children = b;
34
- }
35
- else if (is.primitive(b)) {
36
- text = b;
37
- }
38
- else if (b && b.sel) {
39
- children = [b];
40
- }
41
- else {
42
- data = b;
43
- }
69
+
70
+ if (is.array(c)) {
71
+ children = c;
72
+ } else if (is.primitive(c)) {
73
+ text = c;
74
+ } else if (c && c.sel) {
75
+ children = [c];
44
76
  }
45
- if (is.array(children)) {
46
- for (i = 0; i < children.length; ++i) {
47
- if (is.primitive(children[i]))
48
- children[i] = vnode_1.vnode(undefined, undefined, undefined, children[i]);
49
- }
77
+ } else if (b !== undefined && b !== null) {
78
+ if (is.array(b)) {
79
+ children = b;
80
+ } else if (is.primitive(b)) {
81
+ text = b;
82
+ } else if (b && b.sel) {
83
+ children = [b];
84
+ } else {
85
+ data = b;
50
86
  }
51
- if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&
52
- (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
53
- addNS(data, children, sel);
87
+ }
88
+
89
+ if (children !== undefined) {
90
+ for (i = 0; i < children.length; ++i) {
91
+ if (is.primitive(children[i])) children[i] = (0, _vnode.vnode)(undefined, undefined, undefined, children[i], undefined);
54
92
  }
55
- return vnode_1.vnode(sel, data, children, text, undefined);
93
+ }
94
+
95
+ if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' && (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
96
+ addNS(data, children, sel);
97
+ }
98
+
99
+ return (0, _vnode.vnode)(sel, data, children, text, undefined);
56
100
  }
57
- exports.h = h;
101
+
58
102
  ;
59
- exports.default = h;
60
103
 
61
- },{"./is":3,"./vnode":6}],2:[function(require,module,exports){
104
+ },{"./is.js":5,"./vnode.js":12}],3:[function(require,module,exports){
62
105
  "use strict";
63
- Object.defineProperty(exports, "__esModule", { value: true });
106
+
107
+ Object.defineProperty(exports, "__esModule", {
108
+ value: true
109
+ });
110
+ exports.htmlDomApi = void 0;
111
+
64
112
  function createElement(tagName) {
65
- return document.createElement(tagName);
113
+ return document.createElement(tagName);
66
114
  }
115
+
67
116
  function createElementNS(namespaceURI, qualifiedName) {
68
- return document.createElementNS(namespaceURI, qualifiedName);
117
+ return document.createElementNS(namespaceURI, qualifiedName);
69
118
  }
119
+
70
120
  function createTextNode(text) {
71
- return document.createTextNode(text);
121
+ return document.createTextNode(text);
72
122
  }
123
+
73
124
  function createComment(text) {
74
- return document.createComment(text);
125
+ return document.createComment(text);
75
126
  }
127
+
76
128
  function insertBefore(parentNode, newNode, referenceNode) {
77
- parentNode.insertBefore(newNode, referenceNode);
129
+ parentNode.insertBefore(newNode, referenceNode);
78
130
  }
131
+
79
132
  function removeChild(node, child) {
80
- node.removeChild(child);
133
+ node.removeChild(child);
81
134
  }
135
+
82
136
  function appendChild(node, child) {
83
- node.appendChild(child);
137
+ node.appendChild(child);
84
138
  }
139
+
85
140
  function parentNode(node) {
86
- return node.parentNode;
141
+ return node.parentNode;
87
142
  }
143
+
88
144
  function nextSibling(node) {
89
- return node.nextSibling;
145
+ return node.nextSibling;
90
146
  }
147
+
91
148
  function tagName(elm) {
92
- return elm.tagName;
149
+ return elm.tagName;
93
150
  }
151
+
94
152
  function setTextContent(node, text) {
95
- node.textContent = text;
153
+ node.textContent = text;
96
154
  }
155
+
97
156
  function getTextContent(node) {
98
- return node.textContent;
157
+ return node.textContent;
99
158
  }
159
+
100
160
  function isElement(node) {
101
- return node.nodeType === 1;
161
+ return node.nodeType === 1;
102
162
  }
163
+
103
164
  function isText(node) {
104
- return node.nodeType === 3;
165
+ return node.nodeType === 3;
105
166
  }
167
+
106
168
  function isComment(node) {
107
- return node.nodeType === 8;
108
- }
109
- exports.htmlDomApi = {
110
- createElement: createElement,
111
- createElementNS: createElementNS,
112
- createTextNode: createTextNode,
113
- createComment: createComment,
114
- insertBefore: insertBefore,
115
- removeChild: removeChild,
116
- appendChild: appendChild,
117
- parentNode: parentNode,
118
- nextSibling: nextSibling,
119
- tagName: tagName,
120
- setTextContent: setTextContent,
121
- getTextContent: getTextContent,
122
- isElement: isElement,
123
- isText: isText,
124
- isComment: isComment,
169
+ return node.nodeType === 8;
170
+ }
171
+
172
+ const htmlDomApi = {
173
+ createElement,
174
+ createElementNS,
175
+ createTextNode,
176
+ createComment,
177
+ insertBefore,
178
+ removeChild,
179
+ appendChild,
180
+ parentNode,
181
+ nextSibling,
182
+ tagName,
183
+ setTextContent,
184
+ getTextContent,
185
+ isElement,
186
+ isText,
187
+ isComment
125
188
  };
126
- exports.default = exports.htmlDomApi;
189
+ exports.htmlDomApi = htmlDomApi;
127
190
 
128
- },{}],3:[function(require,module,exports){
191
+ },{}],4:[function(require,module,exports){
129
192
  "use strict";
130
- Object.defineProperty(exports, "__esModule", { value: true });
131
- exports.array = Array.isArray;
132
- function primitive(s) {
133
- return typeof s === 'string' || typeof s === 'number';
193
+
194
+ Object.defineProperty(exports, "__esModule", {
195
+ value: true
196
+ });
197
+ exports.init = init;
198
+
199
+ var _vnode = require("./vnode.js");
200
+
201
+ var is = _interopRequireWildcard(require("./is.js"));
202
+
203
+ var _htmldomapi = require("./htmldomapi.js");
204
+
205
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
206
+
207
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
208
+
209
+ function isUndef(s) {
210
+ return s === undefined;
134
211
  }
135
- exports.primitive = primitive;
136
212
 
137
- },{}],4:[function(require,module,exports){
138
- "use strict";
139
- Object.defineProperty(exports, "__esModule", { value: true });
140
- var vnode_1 = require("./vnode");
141
- var is = require("./is");
142
- var htmldomapi_1 = require("./htmldomapi");
143
- function isUndef(s) { return s === undefined; }
144
- function isDef(s) { return s !== undefined; }
145
- var emptyNode = vnode_1.default('', {}, [], undefined, undefined);
213
+ function isDef(s) {
214
+ return s !== undefined;
215
+ }
216
+
217
+ const emptyNode = (0, _vnode.vnode)('', {}, [], undefined, undefined);
218
+
146
219
  function sameVnode(vnode1, vnode2) {
147
- return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
220
+ return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
148
221
  }
222
+
149
223
  function isVnode(vnode) {
150
- return vnode.sel !== undefined;
224
+ return vnode.sel !== undefined;
151
225
  }
226
+
152
227
  function createKeyToOldIdx(children, beginIdx, endIdx) {
153
- var i, map = {}, key, ch;
154
- for (i = beginIdx; i <= endIdx; ++i) {
155
- ch = children[i];
156
- if (ch != null) {
157
- key = ch.key;
158
- if (key !== undefined)
159
- map[key] = i;
160
- }
228
+ var _a;
229
+
230
+ const map = {};
231
+
232
+ for (let i = beginIdx; i <= endIdx; ++i) {
233
+ const key = (_a = children[i]) === null || _a === void 0 ? void 0 : _a.key;
234
+
235
+ if (key !== undefined) {
236
+ map[key] = i;
161
237
  }
162
- return map;
238
+ }
239
+
240
+ return map;
163
241
  }
164
- var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
165
- var h_1 = require("./h");
166
- exports.h = h_1.h;
167
- var thunk_1 = require("./thunk");
168
- exports.thunk = thunk_1.thunk;
242
+
243
+ const hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
244
+
169
245
  function init(modules, domApi) {
170
- var i, j, cbs = {};
171
- var api = domApi !== undefined ? domApi : htmldomapi_1.default;
172
- for (i = 0; i < hooks.length; ++i) {
173
- cbs[hooks[i]] = [];
174
- for (j = 0; j < modules.length; ++j) {
175
- var hook = modules[j][hooks[i]];
176
- if (hook !== undefined) {
177
- cbs[hooks[i]].push(hook);
178
- }
179
- }
180
- }
181
- function emptyNodeAt(elm) {
182
- var id = elm.id ? '#' + elm.id : '';
183
- var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
184
- return vnode_1.default(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
246
+ let i;
247
+ let j;
248
+ const cbs = {
249
+ create: [],
250
+ update: [],
251
+ remove: [],
252
+ destroy: [],
253
+ pre: [],
254
+ post: []
255
+ };
256
+ const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
257
+
258
+ for (i = 0; i < hooks.length; ++i) {
259
+ cbs[hooks[i]] = [];
260
+
261
+ for (j = 0; j < modules.length; ++j) {
262
+ const hook = modules[j][hooks[i]];
263
+
264
+ if (hook !== undefined) {
265
+ cbs[hooks[i]].push(hook);
266
+ }
185
267
  }
186
- function createRmCb(childElm, listeners) {
187
- return function rmCb() {
188
- if (--listeners === 0) {
189
- var parent_1 = api.parentNode(childElm);
190
- api.removeChild(parent_1, childElm);
191
- }
192
- };
268
+ }
269
+
270
+ function emptyNodeAt(elm) {
271
+ const id = elm.id ? '#' + elm.id : '';
272
+ const c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
273
+ return (0, _vnode.vnode)(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
274
+ }
275
+
276
+ function createRmCb(childElm, listeners) {
277
+ return function rmCb() {
278
+ if (--listeners === 0) {
279
+ const parent = api.parentNode(childElm);
280
+ api.removeChild(parent, childElm);
281
+ }
282
+ };
283
+ }
284
+
285
+ function createElm(vnode, insertedVnodeQueue) {
286
+ var _a, _b;
287
+
288
+ let i;
289
+ let data = vnode.data;
290
+
291
+ if (data !== undefined) {
292
+ const init = (_a = data.hook) === null || _a === void 0 ? void 0 : _a.init;
293
+
294
+ if (isDef(init)) {
295
+ init(vnode);
296
+ data = vnode.data;
297
+ }
193
298
  }
194
- function createElm(vnode, insertedVnodeQueue) {
195
- var i, data = vnode.data;
196
- if (data !== undefined) {
197
- if (isDef(i = data.hook) && isDef(i = i.init)) {
198
- i(vnode);
199
- data = vnode.data;
200
- }
201
- }
202
- var children = vnode.children, sel = vnode.sel;
203
- if (sel === '!') {
204
- if (isUndef(vnode.text)) {
205
- vnode.text = '';
206
- }
207
- vnode.elm = api.createComment(vnode.text);
208
- }
209
- else if (sel !== undefined) {
210
- // Parse selector
211
- var hashIdx = sel.indexOf('#');
212
- var dotIdx = sel.indexOf('.', hashIdx);
213
- var hash = hashIdx > 0 ? hashIdx : sel.length;
214
- var dot = dotIdx > 0 ? dotIdx : sel.length;
215
- var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
216
- var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
217
- : api.createElement(tag);
218
- if (hash < dot)
219
- elm.setAttribute('id', sel.slice(hash + 1, dot));
220
- if (dotIdx > 0)
221
- elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
222
- for (i = 0; i < cbs.create.length; ++i)
223
- cbs.create[i](emptyNode, vnode);
224
- if (is.array(children)) {
225
- for (i = 0; i < children.length; ++i) {
226
- var ch = children[i];
227
- if (ch != null) {
228
- api.appendChild(elm, createElm(ch, insertedVnodeQueue));
229
- }
230
- }
231
- }
232
- else if (is.primitive(vnode.text)) {
233
- api.appendChild(elm, api.createTextNode(vnode.text));
234
- }
235
- i = vnode.data.hook; // Reuse variable
236
- if (isDef(i)) {
237
- if (i.create)
238
- i.create(emptyNode, vnode);
239
- if (i.insert)
240
- insertedVnodeQueue.push(vnode);
241
- }
299
+
300
+ const children = vnode.children;
301
+ const sel = vnode.sel;
302
+
303
+ if (sel === '!') {
304
+ if (isUndef(vnode.text)) {
305
+ vnode.text = '';
306
+ }
307
+
308
+ vnode.elm = api.createComment(vnode.text);
309
+ } else if (sel !== undefined) {
310
+ // Parse selector
311
+ const hashIdx = sel.indexOf('#');
312
+ const dotIdx = sel.indexOf('.', hashIdx);
313
+ const hash = hashIdx > 0 ? hashIdx : sel.length;
314
+ const dot = dotIdx > 0 ? dotIdx : sel.length;
315
+ const tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
316
+ const elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag) : api.createElement(tag);
317
+ if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot));
318
+ if (dotIdx > 0) elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
319
+
320
+ for (i = 0; i < cbs.create.length; ++i) cbs.create[i](emptyNode, vnode);
321
+
322
+ if (is.array(children)) {
323
+ for (i = 0; i < children.length; ++i) {
324
+ const ch = children[i];
325
+
326
+ if (ch != null) {
327
+ api.appendChild(elm, createElm(ch, insertedVnodeQueue));
328
+ }
242
329
  }
243
- else {
244
- vnode.elm = api.createTextNode(vnode.text);
330
+ } else if (is.primitive(vnode.text)) {
331
+ api.appendChild(elm, api.createTextNode(vnode.text));
332
+ }
333
+
334
+ const hook = vnode.data.hook;
335
+
336
+ if (isDef(hook)) {
337
+ (_b = hook.create) === null || _b === void 0 ? void 0 : _b.call(hook, emptyNode, vnode);
338
+
339
+ if (hook.insert) {
340
+ insertedVnodeQueue.push(vnode);
245
341
  }
246
- return vnode.elm;
342
+ }
343
+ } else {
344
+ vnode.elm = api.createTextNode(vnode.text);
247
345
  }
248
- function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
249
- for (; startIdx <= endIdx; ++startIdx) {
250
- var ch = vnodes[startIdx];
251
- if (ch != null) {
252
- api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
253
- }
254
- }
346
+
347
+ return vnode.elm;
348
+ }
349
+
350
+ function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
351
+ for (; startIdx <= endIdx; ++startIdx) {
352
+ const ch = vnodes[startIdx];
353
+
354
+ if (ch != null) {
355
+ api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
356
+ }
255
357
  }
256
- function invokeDestroyHook(vnode) {
257
- var i, j, data = vnode.data;
258
- if (data !== undefined) {
259
- if (isDef(i = data.hook) && isDef(i = i.destroy))
260
- i(vnode);
261
- for (i = 0; i < cbs.destroy.length; ++i)
262
- cbs.destroy[i](vnode);
263
- if (vnode.children !== undefined) {
264
- for (j = 0; j < vnode.children.length; ++j) {
265
- i = vnode.children[j];
266
- if (i != null && typeof i !== "string") {
267
- invokeDestroyHook(i);
268
- }
269
- }
270
- }
358
+ }
359
+
360
+ function invokeDestroyHook(vnode) {
361
+ var _a, _b;
362
+
363
+ const data = vnode.data;
364
+
365
+ if (data !== undefined) {
366
+ (_b = (_a = data === null || data === void 0 ? void 0 : data.hook) === null || _a === void 0 ? void 0 : _a.destroy) === null || _b === void 0 ? void 0 : _b.call(_a, vnode);
367
+
368
+ for (let i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode);
369
+
370
+ if (vnode.children !== undefined) {
371
+ for (let j = 0; j < vnode.children.length; ++j) {
372
+ const child = vnode.children[j];
373
+
374
+ if (child != null && typeof child !== 'string') {
375
+ invokeDestroyHook(child);
376
+ }
271
377
  }
378
+ }
272
379
  }
273
- function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
274
- for (; startIdx <= endIdx; ++startIdx) {
275
- var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];
276
- if (ch != null) {
277
- if (isDef(ch.sel)) {
278
- invokeDestroyHook(ch);
279
- listeners = cbs.remove.length + 1;
280
- rm = createRmCb(ch.elm, listeners);
281
- for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)
282
- cbs.remove[i_1](ch, rm);
283
- if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
284
- i_1(ch, rm);
285
- }
286
- else {
287
- rm();
288
- }
289
- }
290
- else {
291
- api.removeChild(parentElm, ch.elm);
292
- }
293
- }
380
+ }
381
+
382
+ function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
383
+ var _a, _b;
384
+
385
+ for (; startIdx <= endIdx; ++startIdx) {
386
+ let listeners;
387
+ let rm;
388
+ const ch = vnodes[startIdx];
389
+
390
+ if (ch != null) {
391
+ if (isDef(ch.sel)) {
392
+ invokeDestroyHook(ch);
393
+ listeners = cbs.remove.length + 1;
394
+ rm = createRmCb(ch.elm, listeners);
395
+
396
+ for (let i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm);
397
+
398
+ const removeHook = (_b = (_a = ch === null || ch === void 0 ? void 0 : ch.data) === null || _a === void 0 ? void 0 : _a.hook) === null || _b === void 0 ? void 0 : _b.remove;
399
+
400
+ if (isDef(removeHook)) {
401
+ removeHook(ch, rm);
402
+ } else {
403
+ rm();
404
+ }
405
+ } else {
406
+ // Text node
407
+ api.removeChild(parentElm, ch.elm);
294
408
  }
409
+ }
295
410
  }
296
- function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
297
- var oldStartIdx = 0, newStartIdx = 0;
298
- var oldEndIdx = oldCh.length - 1;
299
- var oldStartVnode = oldCh[0];
300
- var oldEndVnode = oldCh[oldEndIdx];
301
- var newEndIdx = newCh.length - 1;
302
- var newStartVnode = newCh[0];
303
- var newEndVnode = newCh[newEndIdx];
304
- var oldKeyToIdx;
305
- var idxInOld;
306
- var elmToMove;
307
- var before;
308
- while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
309
- if (oldStartVnode == null) {
310
- oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
311
- }
312
- else if (oldEndVnode == null) {
313
- oldEndVnode = oldCh[--oldEndIdx];
314
- }
315
- else if (newStartVnode == null) {
316
- newStartVnode = newCh[++newStartIdx];
317
- }
318
- else if (newEndVnode == null) {
319
- newEndVnode = newCh[--newEndIdx];
320
- }
321
- else if (sameVnode(oldStartVnode, newStartVnode)) {
322
- patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
323
- oldStartVnode = oldCh[++oldStartIdx];
324
- newStartVnode = newCh[++newStartIdx];
325
- }
326
- else if (sameVnode(oldEndVnode, newEndVnode)) {
327
- patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
328
- oldEndVnode = oldCh[--oldEndIdx];
329
- newEndVnode = newCh[--newEndIdx];
330
- }
331
- else if (sameVnode(oldStartVnode, newEndVnode)) {
332
- patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
333
- api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
334
- oldStartVnode = oldCh[++oldStartIdx];
335
- newEndVnode = newCh[--newEndIdx];
336
- }
337
- else if (sameVnode(oldEndVnode, newStartVnode)) {
338
- patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
339
- api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
340
- oldEndVnode = oldCh[--oldEndIdx];
341
- newStartVnode = newCh[++newStartIdx];
342
- }
343
- else {
344
- if (oldKeyToIdx === undefined) {
345
- oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
346
- }
347
- idxInOld = oldKeyToIdx[newStartVnode.key];
348
- if (isUndef(idxInOld)) {
349
- api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
350
- newStartVnode = newCh[++newStartIdx];
351
- }
352
- else {
353
- elmToMove = oldCh[idxInOld];
354
- if (elmToMove.sel !== newStartVnode.sel) {
355
- api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
356
- }
357
- else {
358
- patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
359
- oldCh[idxInOld] = undefined;
360
- api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
361
- }
362
- newStartVnode = newCh[++newStartIdx];
363
- }
364
- }
365
- }
366
- if (oldStartIdx > oldEndIdx) {
367
- before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
368
- addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
411
+ }
412
+
413
+ function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
414
+ let oldStartIdx = 0;
415
+ let newStartIdx = 0;
416
+ let oldEndIdx = oldCh.length - 1;
417
+ let oldStartVnode = oldCh[0];
418
+ let oldEndVnode = oldCh[oldEndIdx];
419
+ let newEndIdx = newCh.length - 1;
420
+ let newStartVnode = newCh[0];
421
+ let newEndVnode = newCh[newEndIdx];
422
+ let oldKeyToIdx;
423
+ let idxInOld;
424
+ let elmToMove;
425
+ let before;
426
+
427
+ while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
428
+ if (oldStartVnode == null) {
429
+ oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
430
+ } else if (oldEndVnode == null) {
431
+ oldEndVnode = oldCh[--oldEndIdx];
432
+ } else if (newStartVnode == null) {
433
+ newStartVnode = newCh[++newStartIdx];
434
+ } else if (newEndVnode == null) {
435
+ newEndVnode = newCh[--newEndIdx];
436
+ } else if (sameVnode(oldStartVnode, newStartVnode)) {
437
+ patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
438
+ oldStartVnode = oldCh[++oldStartIdx];
439
+ newStartVnode = newCh[++newStartIdx];
440
+ } else if (sameVnode(oldEndVnode, newEndVnode)) {
441
+ patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
442
+ oldEndVnode = oldCh[--oldEndIdx];
443
+ newEndVnode = newCh[--newEndIdx];
444
+ } else if (sameVnode(oldStartVnode, newEndVnode)) {
445
+ // Vnode moved right
446
+ patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
447
+ api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
448
+ oldStartVnode = oldCh[++oldStartIdx];
449
+ newEndVnode = newCh[--newEndIdx];
450
+ } else if (sameVnode(oldEndVnode, newStartVnode)) {
451
+ // Vnode moved left
452
+ patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
453
+ api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
454
+ oldEndVnode = oldCh[--oldEndIdx];
455
+ newStartVnode = newCh[++newStartIdx];
456
+ } else {
457
+ if (oldKeyToIdx === undefined) {
458
+ oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
369
459
  }
370
- else if (newStartIdx > newEndIdx) {
371
- removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
460
+
461
+ idxInOld = oldKeyToIdx[newStartVnode.key];
462
+
463
+ if (isUndef(idxInOld)) {
464
+ // New element
465
+ api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
466
+ } else {
467
+ elmToMove = oldCh[idxInOld];
468
+
469
+ if (elmToMove.sel !== newStartVnode.sel) {
470
+ api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
471
+ } else {
472
+ patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
473
+ oldCh[idxInOld] = undefined;
474
+ api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
475
+ }
372
476
  }
477
+
478
+ newStartVnode = newCh[++newStartIdx];
479
+ }
373
480
  }
374
- function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
375
- var i, hook;
376
- if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
377
- i(oldVnode, vnode);
378
- }
379
- var elm = vnode.elm = oldVnode.elm;
380
- var oldCh = oldVnode.children;
381
- var ch = vnode.children;
382
- if (oldVnode === vnode)
383
- return;
384
- if (vnode.data !== undefined) {
385
- for (i = 0; i < cbs.update.length; ++i)
386
- cbs.update[i](oldVnode, vnode);
387
- i = vnode.data.hook;
388
- if (isDef(i) && isDef(i = i.update))
389
- i(oldVnode, vnode);
390
- }
391
- if (isUndef(vnode.text)) {
392
- if (isDef(oldCh) && isDef(ch)) {
393
- if (oldCh !== ch)
394
- updateChildren(elm, oldCh, ch, insertedVnodeQueue);
395
- }
396
- else if (isDef(ch)) {
397
- if (isDef(oldVnode.text))
398
- api.setTextContent(elm, '');
399
- addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
400
- }
401
- else if (isDef(oldCh)) {
402
- removeVnodes(elm, oldCh, 0, oldCh.length - 1);
403
- }
404
- else if (isDef(oldVnode.text)) {
405
- api.setTextContent(elm, '');
406
- }
407
- }
408
- else if (oldVnode.text !== vnode.text) {
409
- api.setTextContent(elm, vnode.text);
410
- }
411
- if (isDef(hook) && isDef(i = hook.postpatch)) {
412
- i(oldVnode, vnode);
413
- }
481
+
482
+ if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
483
+ if (oldStartIdx > oldEndIdx) {
484
+ before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
485
+ addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
486
+ } else {
487
+ removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
488
+ }
414
489
  }
415
- return function patch(oldVnode, vnode) {
416
- var i, elm, parent;
417
- var insertedVnodeQueue = [];
418
- for (i = 0; i < cbs.pre.length; ++i)
419
- cbs.pre[i]();
420
- if (!isVnode(oldVnode)) {
421
- oldVnode = emptyNodeAt(oldVnode);
422
- }
423
- if (sameVnode(oldVnode, vnode)) {
424
- patchVnode(oldVnode, vnode, insertedVnodeQueue);
490
+ }
491
+
492
+ function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
493
+ var _a, _b, _c, _d, _e;
494
+
495
+ const hook = (_a = vnode.data) === null || _a === void 0 ? void 0 : _a.hook;
496
+ (_b = hook === null || hook === void 0 ? void 0 : hook.prepatch) === null || _b === void 0 ? void 0 : _b.call(hook, oldVnode, vnode);
497
+ const elm = vnode.elm = oldVnode.elm;
498
+ const oldCh = oldVnode.children;
499
+ const ch = vnode.children;
500
+ if (oldVnode === vnode) return;
501
+
502
+ if (vnode.data !== undefined) {
503
+ for (let i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);
504
+
505
+ (_d = (_c = vnode.data.hook) === null || _c === void 0 ? void 0 : _c.update) === null || _d === void 0 ? void 0 : _d.call(_c, oldVnode, vnode);
506
+ }
507
+
508
+ if (isUndef(vnode.text)) {
509
+ if (isDef(oldCh) && isDef(ch)) {
510
+ if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);
511
+ } else if (isDef(ch)) {
512
+ if (isDef(oldVnode.text)) api.setTextContent(elm, '');
513
+ addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
514
+ } else if (isDef(oldCh)) {
515
+ removeVnodes(elm, oldCh, 0, oldCh.length - 1);
516
+ } else if (isDef(oldVnode.text)) {
517
+ api.setTextContent(elm, '');
518
+ }
519
+ } else if (oldVnode.text !== vnode.text) {
520
+ if (isDef(oldCh)) {
521
+ removeVnodes(elm, oldCh, 0, oldCh.length - 1);
522
+ }
523
+
524
+ api.setTextContent(elm, vnode.text);
525
+ }
526
+
527
+ (_e = hook === null || hook === void 0 ? void 0 : hook.postpatch) === null || _e === void 0 ? void 0 : _e.call(hook, oldVnode, vnode);
528
+ }
529
+
530
+ return function patch(oldVnode, vnode) {
531
+ let i, elm, parent;
532
+ const insertedVnodeQueue = [];
533
+
534
+ for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i]();
535
+
536
+ if (!isVnode(oldVnode)) {
537
+ oldVnode = emptyNodeAt(oldVnode);
538
+ }
539
+
540
+ if (sameVnode(oldVnode, vnode)) {
541
+ patchVnode(oldVnode, vnode, insertedVnodeQueue);
542
+ } else {
543
+ elm = oldVnode.elm;
544
+ parent = api.parentNode(elm);
545
+ createElm(vnode, insertedVnodeQueue);
546
+
547
+ if (parent !== null) {
548
+ api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
549
+ removeVnodes(parent, [oldVnode], 0, 0);
550
+ }
551
+ }
552
+
553
+ for (i = 0; i < insertedVnodeQueue.length; ++i) {
554
+ insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
555
+ }
556
+
557
+ for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();
558
+
559
+ return vnode;
560
+ };
561
+ }
562
+
563
+ },{"./htmldomapi.js":3,"./is.js":5,"./vnode.js":12}],5:[function(require,module,exports){
564
+ "use strict";
565
+
566
+ Object.defineProperty(exports, "__esModule", {
567
+ value: true
568
+ });
569
+ exports.primitive = primitive;
570
+ exports.array = void 0;
571
+ const array = Array.isArray;
572
+ exports.array = array;
573
+
574
+ function primitive(s) {
575
+ return typeof s === 'string' || typeof s === 'number';
576
+ }
577
+
578
+ },{}],6:[function(require,module,exports){
579
+ "use strict";
580
+
581
+ Object.defineProperty(exports, "__esModule", {
582
+ value: true
583
+ });
584
+ exports.attributesModule = void 0;
585
+ const xlinkNS = 'http://www.w3.org/1999/xlink';
586
+ const xmlNS = 'http://www.w3.org/XML/1998/namespace';
587
+ const colonChar = 58;
588
+ const xChar = 120;
589
+
590
+ function updateAttrs(oldVnode, vnode) {
591
+ var key;
592
+ var elm = vnode.elm;
593
+ var oldAttrs = oldVnode.data.attrs;
594
+ var attrs = vnode.data.attrs;
595
+ if (!oldAttrs && !attrs) return;
596
+ if (oldAttrs === attrs) return;
597
+ oldAttrs = oldAttrs || {};
598
+ attrs = attrs || {}; // update modified attributes, add new attributes
599
+
600
+ for (key in attrs) {
601
+ const cur = attrs[key];
602
+ const old = oldAttrs[key];
603
+
604
+ if (old !== cur) {
605
+ if (cur === true) {
606
+ elm.setAttribute(key, '');
607
+ } else if (cur === false) {
608
+ elm.removeAttribute(key);
609
+ } else {
610
+ if (key.charCodeAt(0) !== xChar) {
611
+ elm.setAttribute(key, cur);
612
+ } else if (key.charCodeAt(3) === colonChar) {
613
+ // Assume xml namespace
614
+ elm.setAttributeNS(xmlNS, key, cur);
615
+ } else if (key.charCodeAt(5) === colonChar) {
616
+ // Assume xlink namespace
617
+ elm.setAttributeNS(xlinkNS, key, cur);
618
+ } else {
619
+ elm.setAttribute(key, cur);
425
620
  }
426
- else {
427
- elm = oldVnode.elm;
428
- parent = api.parentNode(elm);
429
- createElm(vnode, insertedVnodeQueue);
430
- if (parent !== null) {
431
- api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
432
- removeVnodes(parent, [oldVnode], 0, 0);
433
- }
621
+ }
622
+ }
623
+ } // remove removed attributes
624
+ // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
625
+ // the other option is to remove all attributes with value == undefined
626
+
627
+
628
+ for (key in oldAttrs) {
629
+ if (!(key in attrs)) {
630
+ elm.removeAttribute(key);
631
+ }
632
+ }
633
+ }
634
+
635
+ const attributesModule = {
636
+ create: updateAttrs,
637
+ update: updateAttrs
638
+ };
639
+ exports.attributesModule = attributesModule;
640
+
641
+ },{}],7:[function(require,module,exports){
642
+ "use strict";
643
+
644
+ Object.defineProperty(exports, "__esModule", {
645
+ value: true
646
+ });
647
+ exports.classModule = void 0;
648
+
649
+ function updateClass(oldVnode, vnode) {
650
+ var cur;
651
+ var name;
652
+ var elm = vnode.elm;
653
+ var oldClass = oldVnode.data.class;
654
+ var klass = vnode.data.class;
655
+ if (!oldClass && !klass) return;
656
+ if (oldClass === klass) return;
657
+ oldClass = oldClass || {};
658
+ klass = klass || {};
659
+
660
+ for (name in oldClass) {
661
+ if (oldClass[name] && !Object.prototype.hasOwnProperty.call(klass, name)) {
662
+ // was `true` and now not provided
663
+ elm.classList.remove(name);
664
+ }
665
+ }
666
+
667
+ for (name in klass) {
668
+ cur = klass[name];
669
+
670
+ if (cur !== oldClass[name]) {
671
+ elm.classList[cur ? 'add' : 'remove'](name);
672
+ }
673
+ }
674
+ }
675
+
676
+ const classModule = {
677
+ create: updateClass,
678
+ update: updateClass
679
+ };
680
+ exports.classModule = classModule;
681
+
682
+ },{}],8:[function(require,module,exports){
683
+ "use strict";
684
+
685
+ Object.defineProperty(exports, "__esModule", {
686
+ value: true
687
+ });
688
+ exports.eventListenersModule = void 0;
689
+
690
+ function invokeHandler(handler, vnode, event) {
691
+ if (typeof handler === 'function') {
692
+ // call function handler
693
+ handler.call(vnode, event, vnode);
694
+ } else if (typeof handler === 'object') {
695
+ // call multiple handlers
696
+ for (var i = 0; i < handler.length; i++) {
697
+ invokeHandler(handler[i], vnode, event);
698
+ }
699
+ }
700
+ }
701
+
702
+ function handleEvent(event, vnode) {
703
+ var name = event.type;
704
+ var on = vnode.data.on; // call event handler(s) if exists
705
+
706
+ if (on && on[name]) {
707
+ invokeHandler(on[name], vnode, event);
708
+ }
709
+ }
710
+
711
+ function createListener() {
712
+ return function handler(event) {
713
+ handleEvent(event, handler.vnode);
714
+ };
715
+ }
716
+
717
+ function updateEventListeners(oldVnode, vnode) {
718
+ var oldOn = oldVnode.data.on;
719
+ var oldListener = oldVnode.listener;
720
+ var oldElm = oldVnode.elm;
721
+ var on = vnode && vnode.data.on;
722
+ var elm = vnode && vnode.elm;
723
+ var name; // optimization for reused immutable handlers
724
+
725
+ if (oldOn === on) {
726
+ return;
727
+ } // remove existing listeners which no longer used
728
+
729
+
730
+ if (oldOn && oldListener) {
731
+ // if element changed or deleted we remove all existing listeners unconditionally
732
+ if (!on) {
733
+ for (name in oldOn) {
734
+ // remove listener if element was changed or existing listeners removed
735
+ oldElm.removeEventListener(name, oldListener, false);
736
+ }
737
+ } else {
738
+ for (name in oldOn) {
739
+ // remove listener if existing listener removed
740
+ if (!on[name]) {
741
+ oldElm.removeEventListener(name, oldListener, false);
434
742
  }
435
- for (i = 0; i < insertedVnodeQueue.length; ++i) {
436
- insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
743
+ }
744
+ }
745
+ } // add new listeners which has not already attached
746
+
747
+
748
+ if (on) {
749
+ // reuse existing listener or create new
750
+ var listener = vnode.listener = oldVnode.listener || createListener(); // update vnode for listener
751
+
752
+ listener.vnode = vnode; // if element changed or added we add all needed listeners unconditionally
753
+
754
+ if (!oldOn) {
755
+ for (name in on) {
756
+ // add listener if element was changed or new listeners added
757
+ elm.addEventListener(name, listener, false);
758
+ }
759
+ } else {
760
+ for (name in on) {
761
+ // add listener if new listener added
762
+ if (!oldOn[name]) {
763
+ elm.addEventListener(name, listener, false);
437
764
  }
438
- for (i = 0; i < cbs.post.length; ++i)
439
- cbs.post[i]();
440
- return vnode;
441
- };
765
+ }
766
+ }
767
+ }
442
768
  }
443
- exports.init = init;
444
769
 
445
- },{"./h":1,"./htmldomapi":2,"./is":3,"./thunk":5,"./vnode":6}],5:[function(require,module,exports){
770
+ const eventListenersModule = {
771
+ create: updateEventListeners,
772
+ update: updateEventListeners,
773
+ destroy: updateEventListeners
774
+ };
775
+ exports.eventListenersModule = eventListenersModule;
776
+
777
+ },{}],9:[function(require,module,exports){
446
778
  "use strict";
447
- Object.defineProperty(exports, "__esModule", { value: true });
448
- var h_1 = require("./h");
449
- function copyToThunk(vnode, thunk) {
450
- thunk.elm = vnode.elm;
451
- vnode.data.fn = thunk.data.fn;
452
- vnode.data.args = thunk.data.args;
453
- thunk.data = vnode.data;
454
- thunk.children = vnode.children;
455
- thunk.text = vnode.text;
456
- thunk.elm = vnode.elm;
457
- }
458
- function init(thunk) {
459
- var cur = thunk.data;
460
- var vnode = cur.fn.apply(undefined, cur.args);
461
- copyToThunk(vnode, thunk);
462
- }
463
- function prepatch(oldVnode, thunk) {
464
- var i, old = oldVnode.data, cur = thunk.data;
465
- var oldArgs = old.args, args = cur.args;
466
- if (old.fn !== cur.fn || oldArgs.length !== args.length) {
467
- copyToThunk(cur.fn.apply(undefined, args), thunk);
468
- return;
779
+
780
+ Object.defineProperty(exports, "__esModule", {
781
+ value: true
782
+ });
783
+ exports.propsModule = void 0;
784
+
785
+ function updateProps(oldVnode, vnode) {
786
+ var key;
787
+ var cur;
788
+ var old;
789
+ var elm = vnode.elm;
790
+ var oldProps = oldVnode.data.props;
791
+ var props = vnode.data.props;
792
+ if (!oldProps && !props) return;
793
+ if (oldProps === props) return;
794
+ oldProps = oldProps || {};
795
+ props = props || {};
796
+
797
+ for (key in props) {
798
+ cur = props[key];
799
+ old = oldProps[key];
800
+
801
+ if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
802
+ elm[key] = cur;
469
803
  }
470
- for (i = 0; i < args.length; ++i) {
471
- if (oldArgs[i] !== args[i]) {
472
- copyToThunk(cur.fn.apply(undefined, args), thunk);
473
- return;
804
+ }
805
+ }
806
+
807
+ const propsModule = {
808
+ create: updateProps,
809
+ update: updateProps
810
+ };
811
+ exports.propsModule = propsModule;
812
+
813
+ },{}],10:[function(require,module,exports){
814
+ "use strict";
815
+
816
+ Object.defineProperty(exports, "__esModule", {
817
+ value: true
818
+ });
819
+ exports.styleModule = void 0;
820
+ // Bindig `requestAnimationFrame` like this fixes a bug in IE/Edge. See #360 and #409.
821
+ var raf = typeof window !== 'undefined' && window.requestAnimationFrame.bind(window) || setTimeout;
822
+
823
+ var nextFrame = function (fn) {
824
+ raf(function () {
825
+ raf(fn);
826
+ });
827
+ };
828
+
829
+ var reflowForced = false;
830
+
831
+ function setNextFrame(obj, prop, val) {
832
+ nextFrame(function () {
833
+ obj[prop] = val;
834
+ });
835
+ }
836
+
837
+ function updateStyle(oldVnode, vnode) {
838
+ var cur;
839
+ var name;
840
+ var elm = vnode.elm;
841
+ var oldStyle = oldVnode.data.style;
842
+ var style = vnode.data.style;
843
+ if (!oldStyle && !style) return;
844
+ if (oldStyle === style) return;
845
+ oldStyle = oldStyle || {};
846
+ style = style || {};
847
+ var oldHasDel = ('delayed' in oldStyle);
848
+
849
+ for (name in oldStyle) {
850
+ if (!style[name]) {
851
+ if (name[0] === '-' && name[1] === '-') {
852
+ elm.style.removeProperty(name);
853
+ } else {
854
+ elm.style[name] = '';
855
+ }
856
+ }
857
+ }
858
+
859
+ for (name in style) {
860
+ cur = style[name];
861
+
862
+ if (name === 'delayed' && style.delayed) {
863
+ for (const name2 in style.delayed) {
864
+ cur = style.delayed[name2];
865
+
866
+ if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
867
+ setNextFrame(elm.style, name2, cur);
474
868
  }
869
+ }
870
+ } else if (name !== 'remove' && cur !== oldStyle[name]) {
871
+ if (name[0] === '-' && name[1] === '-') {
872
+ elm.style.setProperty(name, cur);
873
+ } else {
874
+ elm.style[name] = cur;
875
+ }
475
876
  }
476
- copyToThunk(oldVnode, thunk);
877
+ }
477
878
  }
478
- exports.thunk = function thunk(sel, key, fn, args) {
479
- if (args === undefined) {
480
- args = fn;
481
- fn = key;
482
- key = undefined;
483
- }
484
- return h_1.h(sel, {
485
- key: key,
486
- hook: { init: init, prepatch: prepatch },
487
- fn: fn,
488
- args: args
489
- });
879
+
880
+ function applyDestroyStyle(vnode) {
881
+ var style;
882
+ var name;
883
+ var elm = vnode.elm;
884
+ var s = vnode.data.style;
885
+ if (!s || !(style = s.destroy)) return;
886
+
887
+ for (name in style) {
888
+ elm.style[name] = style[name];
889
+ }
890
+ }
891
+
892
+ function applyRemoveStyle(vnode, rm) {
893
+ var s = vnode.data.style;
894
+
895
+ if (!s || !s.remove) {
896
+ rm();
897
+ return;
898
+ }
899
+
900
+ if (!reflowForced) {
901
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
902
+ vnode.elm.offsetLeft;
903
+ reflowForced = true;
904
+ }
905
+
906
+ var name;
907
+ var elm = vnode.elm;
908
+ var i = 0;
909
+ var compStyle;
910
+ var style = s.remove;
911
+ var amount = 0;
912
+ var applied = [];
913
+
914
+ for (name in style) {
915
+ applied.push(name);
916
+ elm.style[name] = style[name];
917
+ }
918
+
919
+ compStyle = getComputedStyle(elm);
920
+ var props = compStyle['transition-property'].split(', ');
921
+
922
+ for (; i < props.length; ++i) {
923
+ if (applied.indexOf(props[i]) !== -1) amount++;
924
+ }
925
+
926
+ elm.addEventListener('transitionend', function (ev) {
927
+ if (ev.target === elm) --amount;
928
+ if (amount === 0) rm();
929
+ });
930
+ }
931
+
932
+ function forceReflow() {
933
+ reflowForced = false;
934
+ }
935
+
936
+ const styleModule = {
937
+ pre: forceReflow,
938
+ create: updateStyle,
939
+ update: updateStyle,
940
+ destroy: applyDestroyStyle,
941
+ remove: applyRemoveStyle
490
942
  };
491
- exports.default = exports.thunk;
943
+ exports.styleModule = styleModule;
492
944
 
493
- },{"./h":1}],6:[function(require,module,exports){
945
+ },{}],11:[function(require,module,exports){
494
946
  "use strict";
495
- Object.defineProperty(exports, "__esModule", { value: true });
496
- function vnode(sel, data, children, text, elm) {
497
- var key = data === undefined ? undefined : data.key;
498
- return { sel: sel, data: data, children: children,
499
- text: text, elm: elm, key: key };
947
+
948
+ Object.defineProperty(exports, "__esModule", {
949
+ value: true
950
+ });
951
+ exports.toVNode = toVNode;
952
+
953
+ var _vnode = require("./vnode.js");
954
+
955
+ var _htmldomapi = require("./htmldomapi.js");
956
+
957
+ function toVNode(node, domApi) {
958
+ const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
959
+ let text;
960
+
961
+ if (api.isElement(node)) {
962
+ const id = node.id ? '#' + node.id : '';
963
+ const cn = node.getAttribute('class');
964
+ const c = cn ? '.' + cn.split(' ').join('.') : '';
965
+ const sel = api.tagName(node).toLowerCase() + id + c;
966
+ const attrs = {};
967
+ const children = [];
968
+ let name;
969
+ let i, n;
970
+ const elmAttrs = node.attributes;
971
+ const elmChildren = node.childNodes;
972
+
973
+ for (i = 0, n = elmAttrs.length; i < n; i++) {
974
+ name = elmAttrs[i].nodeName;
975
+
976
+ if (name !== 'id' && name !== 'class') {
977
+ attrs[name] = elmAttrs[i].nodeValue;
978
+ }
979
+ }
980
+
981
+ for (i = 0, n = elmChildren.length; i < n; i++) {
982
+ children.push(toVNode(elmChildren[i], domApi));
983
+ }
984
+
985
+ return (0, _vnode.vnode)(sel, {
986
+ attrs
987
+ }, children, undefined, node);
988
+ } else if (api.isText(node)) {
989
+ text = api.getTextContent(node);
990
+ return (0, _vnode.vnode)(undefined, undefined, undefined, text, node);
991
+ } else if (api.isComment(node)) {
992
+ text = api.getTextContent(node);
993
+ return (0, _vnode.vnode)('!', {}, [], text, node);
994
+ } else {
995
+ return (0, _vnode.vnode)('', {}, [], undefined, node);
996
+ }
500
997
  }
998
+
999
+ },{"./htmldomapi.js":3,"./vnode.js":12}],12:[function(require,module,exports){
1000
+ "use strict";
1001
+
1002
+ Object.defineProperty(exports, "__esModule", {
1003
+ value: true
1004
+ });
501
1005
  exports.vnode = vnode;
502
- exports.default = vnode;
503
1006
 
504
- },{}]},{},[4])(4)
1007
+ function vnode(sel, data, children, text, elm) {
1008
+ const key = data === undefined ? undefined : data.key;
1009
+ return {
1010
+ sel,
1011
+ data,
1012
+ children,
1013
+ text,
1014
+ elm,
1015
+ key
1016
+ };
1017
+ }
1018
+
1019
+ },{}]},{},[1])(1)
505
1020
  });
506
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy8ucmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXItcGFjay82LjAuMi9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiaC5qcyIsImh0bWxkb21hcGkuanMiLCJpcy5qcyIsInNuYWJiZG9tLmpzIiwidGh1bmsuanMiLCJ2bm9kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdm5vZGVfMSA9IHJlcXVpcmUoXCIuL3Zub2RlXCIpO1xudmFyIGlzID0gcmVxdWlyZShcIi4vaXNcIik7XG5mdW5jdGlvbiBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKSB7XG4gICAgZGF0YS5ucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gICAgaWYgKHNlbCAhPT0gJ2ZvcmVpZ25PYmplY3QnICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkRGF0YSA9IGNoaWxkcmVuW2ldLmRhdGE7XG4gICAgICAgICAgICBpZiAoY2hpbGREYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhZGROUyhjaGlsZERhdGEsIGNoaWxkcmVuW2ldLmNoaWxkcmVuLCBjaGlsZHJlbltpXS5zZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaChzZWwsIGIsIGMpIHtcbiAgICB2YXIgZGF0YSA9IHt9LCBjaGlsZHJlbiwgdGV4dCwgaTtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRhdGEgPSBiO1xuICAgICAgICBpZiAoaXMuYXJyYXkoYykpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYykpIHtcbiAgICAgICAgICAgIHRleHQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgJiYgYy5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2NdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXMuYXJyYXkoYikpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYikpIHtcbiAgICAgICAgICAgIHRleHQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgJiYgYi5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2JdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChpcy5wcmltaXRpdmUoY2hpbGRyZW5baV0pKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdm5vZGVfMS52bm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjaGlsZHJlbltpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbFswXSA9PT0gJ3MnICYmIHNlbFsxXSA9PT0gJ3YnICYmIHNlbFsyXSA9PT0gJ2cnICYmXG4gICAgICAgIChzZWwubGVuZ3RoID09PSAzIHx8IHNlbFszXSA9PT0gJy4nIHx8IHNlbFszXSA9PT0gJyMnKSkge1xuICAgICAgICBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlXzEudm5vZGUoc2VsLCBkYXRhLCBjaGlsZHJlbiwgdGV4dCwgdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMuaCA9IGg7XG47XG5leHBvcnRzLmRlZmF1bHQgPSBoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21tZW50KHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KTtcbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZChub2RlLCBjaGlsZCkge1xuICAgIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgY2hpbGQpIHtcbiAgICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHBhcmVudE5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnBhcmVudE5vZGU7XG59XG5mdW5jdGlvbiBuZXh0U2libGluZyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG59XG5mdW5jdGlvbiB0YWdOYW1lKGVsbSkge1xuICAgIHJldHVybiBlbG0udGFnTmFtZTtcbn1cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50KG5vZGUsIHRleHQpIHtcbiAgICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHRDb250ZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50ZXh0Q29udGVudDtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDE7XG59XG5mdW5jdGlvbiBpc1RleHQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAzO1xufVxuZnVuY3Rpb24gaXNDb21tZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gODtcbn1cbmV4cG9ydHMuaHRtbERvbUFwaSA9IHtcbiAgICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuICAgIGNyZWF0ZVRleHROb2RlOiBjcmVhdGVUZXh0Tm9kZSxcbiAgICBjcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LFxuICAgIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZUNoaWxkOiByZW1vdmVDaGlsZCxcbiAgICBhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsXG4gICAgcGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgICBuZXh0U2libGluZzogbmV4dFNpYmxpbmcsXG4gICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gICAgZ2V0VGV4dENvbnRlbnQ6IGdldFRleHRDb250ZW50LFxuICAgIGlzRWxlbWVudDogaXNFbGVtZW50LFxuICAgIGlzVGV4dDogaXNUZXh0LFxuICAgIGlzQ29tbWVudDogaXNDb21tZW50LFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuaHRtbERvbUFwaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0bWxkb21hcGkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFycmF5ID0gQXJyYXkuaXNBcnJheTtcbmZ1bmN0aW9uIHByaW1pdGl2ZShzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLnByaW1pdGl2ZSA9IHByaW1pdGl2ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHZub2RlXzEgPSByZXF1aXJlKFwiLi92bm9kZVwiKTtcbnZhciBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xudmFyIGh0bWxkb21hcGlfMSA9IHJlcXVpcmUoXCIuL2h0bWxkb21hcGlcIik7XG5mdW5jdGlvbiBpc1VuZGVmKHMpIHsgcmV0dXJuIHMgPT09IHVuZGVmaW5lZDsgfVxuZnVuY3Rpb24gaXNEZWYocykgeyByZXR1cm4gcyAhPT0gdW5kZWZpbmVkOyB9XG52YXIgZW1wdHlOb2RlID0gdm5vZGVfMS5kZWZhdWx0KCcnLCB7fSwgW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbmZ1bmN0aW9uIHNhbWVWbm9kZSh2bm9kZTEsIHZub2RlMikge1xuICAgIHJldHVybiB2bm9kZTEua2V5ID09PSB2bm9kZTIua2V5ICYmIHZub2RlMS5zZWwgPT09IHZub2RlMi5zZWw7XG59XG5mdW5jdGlvbiBpc1Zub2RlKHZub2RlKSB7XG4gICAgcmV0dXJuIHZub2RlLnNlbCAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHgoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHtcbiAgICB2YXIgaSwgbWFwID0ge30sIGtleSwgY2g7XG4gICAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHtcbiAgICAgICAgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleSA9IGNoLmtleTtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBtYXBba2V5XSA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveScsICdwcmUnLCAncG9zdCddO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5leHBvcnRzLmggPSBoXzEuaDtcbnZhciB0aHVua18xID0gcmVxdWlyZShcIi4vdGh1bmtcIik7XG5leHBvcnRzLnRodW5rID0gdGh1bmtfMS50aHVuaztcbmZ1bmN0aW9uIGluaXQobW9kdWxlcywgZG9tQXBpKSB7XG4gICAgdmFyIGksIGosIGNicyA9IHt9O1xuICAgIHZhciBhcGkgPSBkb21BcGkgIT09IHVuZGVmaW5lZCA/IGRvbUFwaSA6IGh0bWxkb21hcGlfMS5kZWZhdWx0O1xuICAgIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBtb2R1bGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIgaG9vayA9IG1vZHVsZXNbal1baG9va3NbaV1dO1xuICAgICAgICAgICAgaWYgKGhvb2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNic1tob29rc1tpXV0ucHVzaChob29rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBlbXB0eU5vZGVBdChlbG0pIHtcbiAgICAgICAgdmFyIGlkID0gZWxtLmlkID8gJyMnICsgZWxtLmlkIDogJyc7XG4gICAgICAgIHZhciBjID0gZWxtLmNsYXNzTmFtZSA/ICcuJyArIGVsbS5jbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCcuJykgOiAnJztcbiAgICAgICAgcmV0dXJuIHZub2RlXzEuZGVmYXVsdChhcGkudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCkgKyBpZCArIGMsIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVSbUNiKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJtQ2IoKSB7XG4gICAgICAgICAgICBpZiAoLS1saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBhcGkucGFyZW50Tm9kZShjaGlsZEVsbSk7XG4gICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudF8xLCBjaGlsZEVsbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsbSh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgICAgIHZhciBpLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmluaXQpKSB7XG4gICAgICAgICAgICAgICAgaSh2bm9kZSk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4sIHNlbCA9IHZub2RlLnNlbDtcbiAgICAgICAgaWYgKHNlbCA9PT0gJyEnKSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgICAgICAgICAgIHZub2RlLnRleHQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZub2RlLmVsbSA9IGFwaS5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBzZWxlY3RvclxuICAgICAgICAgICAgdmFyIGhhc2hJZHggPSBzZWwuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgdmFyIGRvdElkeCA9IHNlbC5pbmRleE9mKCcuJywgaGFzaElkeCk7XG4gICAgICAgICAgICB2YXIgaGFzaCA9IGhhc2hJZHggPiAwID8gaGFzaElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgZG90ID0gZG90SWR4ID4gMCA/IGRvdElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgdGFnID0gaGFzaElkeCAhPT0gLTEgfHwgZG90SWR4ICE9PSAtMSA/IHNlbC5zbGljZSgwLCBNYXRoLm1pbihoYXNoLCBkb3QpKSA6IHNlbDtcbiAgICAgICAgICAgIHZhciBlbG0gPSB2bm9kZS5lbG0gPSBpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ucykgPyBhcGkuY3JlYXRlRWxlbWVudE5TKGksIHRhZylcbiAgICAgICAgICAgICAgICA6IGFwaS5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgICAgICAgICBpZiAoaGFzaCA8IGRvdClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdpZCcsIHNlbC5zbGljZShoYXNoICsgMSwgZG90KSk7XG4gICAgICAgICAgICBpZiAoZG90SWR4ID4gMClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdjbGFzcycsIHNlbC5zbGljZShkb3QgKyAxKS5yZXBsYWNlKC9cXC4vZywgJyAnKSk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBjYnMuY3JlYXRlW2ldKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5hcHBlbmRDaGlsZChlbG0sIGNyZWF0ZUVsbShjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgICAgICBhcGkuYXBwZW5kQ2hpbGQoZWxtLCBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgICAgICAgICAgIGlmIChpLmNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkuaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2bm9kZS5lbG0gPSBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZub2RlLmVsbTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVm5vZGVzKHBhcmVudEVsbSwgYmVmb3JlLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKGNoLCBpbnNlcnRlZFZub2RlUXVldWUpLCBiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rKHZub2RlKSB7XG4gICAgICAgIHZhciBpLCBqLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKVxuICAgICAgICAgICAgICAgIGkodm5vZGUpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy5kZXN0cm95W2ldKHZub2RlKTtcbiAgICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB2bm9kZS5jaGlsZHJlbltqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiB0eXBlb2YgaSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgICAgICAgIHZhciBpXzEgPSB2b2lkIDAsIGxpc3RlbmVycyA9IHZvaWQgMCwgcm0gPSB2b2lkIDAsIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgICAgICAgIGlmIChjaCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVmKGNoLnNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soY2gpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBjYnMucmVtb3ZlLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHJtID0gY3JlYXRlUm1DYihjaC5lbG0sIGxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaV8xID0gMDsgaV8xIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraV8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2JzLnJlbW92ZVtpXzFdKGNoLCBybSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZihpXzEgPSBjaC5kYXRhKSAmJiBpc0RlZihpXzEgPSBpXzEuaG9vaykgJiYgaXNEZWYoaV8xID0gaV8xLnJlbW92ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlfMShjaCwgcm0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudEVsbSwgY2guZWxtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4ocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgb2xkU3RhcnRJZHggPSAwLCBuZXdTdGFydElkeCA9IDA7XG4gICAgICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgb2xkU3RhcnRWbm9kZSA9IG9sZENoWzBdO1xuICAgICAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgICAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFswXTtcbiAgICAgICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICAgICAgdmFyIG9sZEtleVRvSWR4O1xuICAgICAgICB2YXIgaWR4SW5PbGQ7XG4gICAgICAgIHZhciBlbG1Ub01vdmU7XG4gICAgICAgIHZhciBiZWZvcmU7XG4gICAgICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICBpZiAob2xkU3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBtaWdodCBoYXZlIGJlZW4gbW92ZWQgbGVmdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob2xkRW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3U3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3RW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBhcGkubmV4dFNpYmxpbmcob2xkRW5kVm5vZGUuZWxtKSk7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvbGRLZXlUb0lkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZHhJbk9sZCA9IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZihpZHhJbk9sZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsbVRvTW92ZS5zZWwgIT09IG5ld1N0YXJ0Vm5vZGUuc2VsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSksIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUoZWxtVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2hbaWR4SW5PbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGVsbVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgICAgICAgYmVmb3JlID0gbmV3Q2hbbmV3RW5kSWR4ICsgMV0gPT0gbnVsbCA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICAgICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgaSwgaG9vaztcbiAgICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhKSAmJiBpc0RlZihob29rID0gaS5ob29rKSAmJiBpc0RlZihpID0gaG9vay5wcmVwYXRjaCkpIHtcbiAgICAgICAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtO1xuICAgICAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2bm9kZS5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7XG4gICAgICAgICAgICBpZiAoaXNEZWYoaSkgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSlcbiAgICAgICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5kZWYodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZENoICE9PSBjaClcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZWYob2xkVm5vZGUudGV4dCkpXG4gICAgICAgICAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sICcnKTtcbiAgICAgICAgICAgICAgICBhZGRWbm9kZXMoZWxtLCBudWxsLCBjaCwgMCwgY2gubGVuZ3RoIC0gMSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZVZub2RlcyhlbG0sIG9sZENoLCAwLCBvbGRDaC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgYXBpLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFZub2RlLnRleHQgIT09IHZub2RlLnRleHQpIHtcbiAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlZihob29rKSAmJiBpc0RlZihpID0gaG9vay5wb3N0cGF0Y2gpKSB7XG4gICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBhdGNoKG9sZFZub2RlLCB2bm9kZSkge1xuICAgICAgICB2YXIgaSwgZWxtLCBwYXJlbnQ7XG4gICAgICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5wcmUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBjYnMucHJlW2ldKCk7XG4gICAgICAgIGlmICghaXNWbm9kZShvbGRWbm9kZSkpIHtcbiAgICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICAgICAgICBwYXJlbnQgPSBhcGkucGFyZW50Tm9kZShlbG0pO1xuICAgICAgICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50LCB2bm9kZS5lbG0sIGFwaS5uZXh0U2libGluZyhlbG0pKTtcbiAgICAgICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50LCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWVbaV0uZGF0YS5ob29rLmluc2VydChpbnNlcnRlZFZub2RlUXVldWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMucG9zdC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGNicy5wb3N0W2ldKCk7XG4gICAgICAgIHJldHVybiB2bm9kZTtcbiAgICB9O1xufVxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNuYWJiZG9tLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5mdW5jdGlvbiBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspIHtcbiAgICB0aHVuay5lbG0gPSB2bm9kZS5lbG07XG4gICAgdm5vZGUuZGF0YS5mbiA9IHRodW5rLmRhdGEuZm47XG4gICAgdm5vZGUuZGF0YS5hcmdzID0gdGh1bmsuZGF0YS5hcmdzO1xuICAgIHRodW5rLmRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHRodW5rLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgdGh1bmsudGV4dCA9IHZub2RlLnRleHQ7XG4gICAgdGh1bmsuZWxtID0gdm5vZGUuZWxtO1xufVxuZnVuY3Rpb24gaW5pdCh0aHVuaykge1xuICAgIHZhciBjdXIgPSB0aHVuay5kYXRhO1xuICAgIHZhciB2bm9kZSA9IGN1ci5mbi5hcHBseSh1bmRlZmluZWQsIGN1ci5hcmdzKTtcbiAgICBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspO1xufVxuZnVuY3Rpb24gcHJlcGF0Y2gob2xkVm5vZGUsIHRodW5rKSB7XG4gICAgdmFyIGksIG9sZCA9IG9sZFZub2RlLmRhdGEsIGN1ciA9IHRodW5rLmRhdGE7XG4gICAgdmFyIG9sZEFyZ3MgPSBvbGQuYXJncywgYXJncyA9IGN1ci5hcmdzO1xuICAgIGlmIChvbGQuZm4gIT09IGN1ci5mbiB8fCBvbGRBcmdzLmxlbmd0aCAhPT0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAob2xkQXJnc1tpXSAhPT0gYXJnc1tpXSkge1xuICAgICAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5VG9UaHVuayhvbGRWbm9kZSwgdGh1bmspO1xufVxuZXhwb3J0cy50aHVuayA9IGZ1bmN0aW9uIHRodW5rKHNlbCwga2V5LCBmbiwgYXJncykge1xuICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncyA9IGZuO1xuICAgICAgICBmbiA9IGtleTtcbiAgICAgICAga2V5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaF8xLmgoc2VsLCB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBob29rOiB7IGluaXQ6IGluaXQsIHByZXBhdGNoOiBwcmVwYXRjaCB9LFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLnRodW5rO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGh1bmsuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiB2bm9kZShzZWwsIGRhdGEsIGNoaWxkcmVuLCB0ZXh0LCBlbG0pIHtcbiAgICB2YXIga2V5ID0gZGF0YSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGF0YS5rZXk7XG4gICAgcmV0dXJuIHsgc2VsOiBzZWwsIGRhdGE6IGRhdGEsIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgdGV4dDogdGV4dCwgZWxtOiBlbG0sIGtleToga2V5IH07XG59XG5leHBvcnRzLnZub2RlID0gdm5vZGU7XG5leHBvcnRzLmRlZmF1bHQgPSB2bm9kZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZub2RlLmpzLm1hcCJdfQ==