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