lissio 0.1.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,332 @@
1
+ require 'base64'
2
+
3
+ module Lissio; class Component
4
+
5
+ class Markdown < Component
6
+ def self.render(string, options = {}, &block)
7
+ `marked(#{@string.to_n}, #{@options.to_n}, #{@block.to_n})`
8
+ end
9
+
10
+ def initialize(string, options = {}, &block)
11
+ @string = string
12
+ @options = options
13
+ @block = block
14
+ end
15
+
16
+ def render
17
+ element.inner_html = Markdown.render(@string, @options, @block)
18
+
19
+ super
20
+ end
21
+ end
22
+
23
+ end; end
24
+
25
+ # load https://github.com/chjj/marked
26
+ `eval(#{Base64.decode64(DATA.read)})`
27
+
28
+ __END__
29
+
30
+ KGZ1bmN0aW9uKCl7dmFyIGJsb2NrPXtuZXdsaW5lOi9eXG4rLyxjb2RlOi9eKCB7NH1bXlxuXStc
31
+ biopKy8sZmVuY2VzOm5vb3AsaHI6L14oICpbLSpfXSl7Myx9ICooPzpcbit8JCkvLGhlYWRpbmc6
32
+ L14gKigjezEsNn0pICooW15cbl0rPykgKiMqICooPzpcbit8JCkvLG5wdGFibGU6bm9vcCxsaGVh
33
+ ZGluZzovXihbXlxuXSspXG4gKig9fC0pezIsfSAqKD86XG4rfCQpLyxibG9ja3F1b3RlOi9eKCAq
34
+ PlteXG5dKyhcblteXG5dKykqXG4qKSsvLGxpc3Q6L14oICopKGJ1bGwpIFtcc1xTXSs/KD86aHJ8
35
+ XG57Mix9KD8hICkoPyFcMWJ1bGwgKVxuKnxccyokKS8saHRtbDovXiAqKD86Y29tbWVudHxjbG9z
36
+ ZWR8Y2xvc2luZykgKig/OlxuezIsfXxccyokKS8sZGVmOi9eICpcWyhbXlxdXSspXF06ICo8Pyhb
37
+ XlxzPl0rKT4/KD86ICtbIihdKFteXG5dKylbIildKT8gKig/OlxuK3wkKS8sdGFibGU6bm9vcCxw
38
+ YXJhZ3JhcGg6L14oKD86W15cbl0rXG4/KD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3Rl
39
+ fHRhZ3xkZWYpKSspXG4qLyx0ZXh0Oi9eW15cbl0rL307YmxvY2suYnVsbGV0PS8oPzpbKistXXxc
40
+ ZCtcLikvO2Jsb2NrLml0ZW09L14oICopKGJ1bGwpIFteXG5dKig/OlxuKD8hXDFidWxsIClbXlxu
41
+ XSopKi87YmxvY2suaXRlbT1yZXBsYWNlKGJsb2NrLml0ZW0sImdtIikoL2J1bGwvZyxibG9jay5i
42
+ dWxsZXQpKCk7YmxvY2subGlzdD1yZXBsYWNlKGJsb2NrLmxpc3QpKC9idWxsL2csYmxvY2suYnVs
43
+ bGV0KSgiaHIiLC9cbisoPz0oPzogKlstKl9dKXszLH0gKig/OlxuK3wkKSkvKSgpO2Jsb2NrLl90
44
+ YWc9Iig/ISg/OiIrImF8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGlt
45
+ ZXxjb2RlIisifHZhcnxzYW1wfGtiZHxzdWJ8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8
46
+ YmRvIisifHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKVxcYilcXHcrKD8hOi98QClcXGIiO2Jsb2Nr
47
+ Lmh0bWw9cmVwbGFjZShibG9jay5odG1sKSgiY29tbWVudCIsLzwhLS1bXHNcU10qPy0tPi8pKCJj
48
+ bG9zZWQiLC88KHRhZylbXHNcU10rPzxcL1wxPi8pKCJjbG9zaW5nIiwvPHRhZyg/OiJbXiJdKiJ8
49
+ J1teJ10qJ3xbXiciPl0pKj8+LykoL3RhZy9nLGJsb2NrLl90YWcpKCk7YmxvY2sucGFyYWdyYXBo
50
+ PXJlcGxhY2UoYmxvY2sucGFyYWdyYXBoKSgiaHIiLGJsb2NrLmhyKSgiaGVhZGluZyIsYmxvY2su
51
+ aGVhZGluZykoImxoZWFkaW5nIixibG9jay5saGVhZGluZykoImJsb2NrcXVvdGUiLGJsb2NrLmJs
52
+ b2NrcXVvdGUpKCJ0YWciLCI8IitibG9jay5fdGFnKSgiZGVmIixibG9jay5kZWYpKCk7YmxvY2su
53
+ bm9ybWFsPW1lcmdlKHt9LGJsb2NrKTtibG9jay5nZm09bWVyZ2Uoe30sYmxvY2subm9ybWFsLHtm
54
+ ZW5jZXM6L14gKihgezMsfXx+ezMsfSkgKihcUyspPyAqXG4oW1xzXFNdKz8pXHMqXDEgKig/Olxu
55
+ K3wkKS8scGFyYWdyYXBoOi9eL30pO2Jsb2NrLmdmbS5wYXJhZ3JhcGg9cmVwbGFjZShibG9jay5w
56
+ YXJhZ3JhcGgpKCIoPyEiLCIoPyEiK2Jsb2NrLmdmbS5mZW5jZXMuc291cmNlLnJlcGxhY2UoIlxc
57
+ MSIsIlxcMiIpKyJ8IitibG9jay5saXN0LnNvdXJjZS5yZXBsYWNlKCJcXDEiLCJcXDMiKSsifCIp
58
+ KCk7YmxvY2sudGFibGVzPW1lcmdlKHt9LGJsb2NrLmdmbSx7bnB0YWJsZTovXiAqKFxTLipcfC4q
59
+ KVxuICooWy06XSsgKlx8Wy18IDpdKilcbigoPzouKlx8LiooPzpcbnwkKSkqKVxuKi8sdGFibGU6
60
+ L14gKlx8KC4rKVxuICpcfCggKlstOl0rWy18IDpdKilcbigoPzogKlx8LiooPzpcbnwkKSkqKVxu
61
+ Ki99KTtmdW5jdGlvbiBMZXhlcihvcHRpb25zKXt0aGlzLnRva2Vucz1bXTt0aGlzLnRva2Vucy5s
62
+ aW5rcz17fTt0aGlzLm9wdGlvbnM9b3B0aW9uc3x8bWFya2VkLmRlZmF1bHRzO3RoaXMucnVsZXM9
63
+ YmxvY2subm9ybWFsO2lmKHRoaXMub3B0aW9ucy5nZm0pe2lmKHRoaXMub3B0aW9ucy50YWJsZXMp
64
+ e3RoaXMucnVsZXM9YmxvY2sudGFibGVzfWVsc2V7dGhpcy5ydWxlcz1ibG9jay5nZm19fX1MZXhl
65
+ ci5ydWxlcz1ibG9jaztMZXhlci5sZXg9ZnVuY3Rpb24oc3JjLG9wdGlvbnMpe3ZhciBsZXhlcj1u
66
+ ZXcgTGV4ZXIob3B0aW9ucyk7cmV0dXJuIGxleGVyLmxleChzcmMpfTtMZXhlci5wcm90b3R5cGUu
67
+ bGV4PWZ1bmN0aW9uKHNyYyl7c3JjPXNyYy5yZXBsYWNlKC9cclxufFxyL2csIlxuIikucmVwbGFj
68
+ ZSgvXHQvZywiICAgICIpLnJlcGxhY2UoL1x1MDBhMC9nLCIgIikucmVwbGFjZSgvXHUyNDI0L2cs
69
+ IlxuIik7cmV0dXJuIHRoaXMudG9rZW4oc3JjLHRydWUpfTtMZXhlci5wcm90b3R5cGUudG9rZW49
70
+ ZnVuY3Rpb24oc3JjLHRvcCl7dmFyIHNyYz1zcmMucmVwbGFjZSgvXiArJC9nbSwiIiksbmV4dCxs
71
+ b29zZSxjYXAsYnVsbCxiLGl0ZW0sc3BhY2UsaSxsO3doaWxlKHNyYyl7aWYoY2FwPXRoaXMucnVs
72
+ ZXMubmV3bGluZS5leGVjKHNyYykpe3NyYz1zcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpO2lm
73
+ KGNhcFswXS5sZW5ndGg+MSl7dGhpcy50b2tlbnMucHVzaCh7dHlwZToic3BhY2UifSl9fWlmKGNh
74
+ cD10aGlzLnJ1bGVzLmNvZGUuZXhlYyhzcmMpKXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVu
75
+ Z3RoKTtjYXA9Y2FwWzBdLnJlcGxhY2UoL14gezR9L2dtLCIiKTt0aGlzLnRva2Vucy5wdXNoKHt0
76
+ eXBlOiJjb2RlIix0ZXh0OiF0aGlzLm9wdGlvbnMucGVkYW50aWM/Y2FwLnJlcGxhY2UoL1xuKyQv
77
+ LCIiKTpjYXB9KTtjb250aW51ZX1pZihjYXA9dGhpcy5ydWxlcy5mZW5jZXMuZXhlYyhzcmMpKXtz
78
+ cmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTt0aGlzLnRva2Vucy5wdXNoKHt0eXBlOiJj
79
+ b2RlIixsYW5nOmNhcFsyXSx0ZXh0OmNhcFszXX0pO2NvbnRpbnVlfWlmKGNhcD10aGlzLnJ1bGVz
80
+ LmhlYWRpbmcuZXhlYyhzcmMpKXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTt0aGlz
81
+ LnRva2Vucy5wdXNoKHt0eXBlOiJoZWFkaW5nIixkZXB0aDpjYXBbMV0ubGVuZ3RoLHRleHQ6Y2Fw
82
+ WzJdfSk7Y29udGludWV9aWYodG9wJiYoY2FwPXRoaXMucnVsZXMubnB0YWJsZS5leGVjKHNyYykp
83
+ KXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTtpdGVtPXt0eXBlOiJ0YWJsZSIsaGVh
84
+ ZGVyOmNhcFsxXS5yZXBsYWNlKC9eICp8ICpcfCAqJC9nLCIiKS5zcGxpdCgvICpcfCAqLyksYWxp
85
+ Z246Y2FwWzJdLnJlcGxhY2UoL14gKnxcfCAqJC9nLCIiKS5zcGxpdCgvICpcfCAqLyksY2VsbHM6
86
+ Y2FwWzNdLnJlcGxhY2UoL1xuJC8sIiIpLnNwbGl0KCJcbiIpfTtmb3IoaT0wO2k8aXRlbS5hbGln
87
+ bi5sZW5ndGg7aSsrKXtpZigvXiAqLSs6ICokLy50ZXN0KGl0ZW0uYWxpZ25baV0pKXtpdGVtLmFs
88
+ aWduW2ldPSJyaWdodCJ9ZWxzZSBpZigvXiAqOi0rOiAqJC8udGVzdChpdGVtLmFsaWduW2ldKSl7
89
+ aXRlbS5hbGlnbltpXT0iY2VudGVyIn1lbHNlIGlmKC9eICo6LSsgKiQvLnRlc3QoaXRlbS5hbGln
90
+ bltpXSkpe2l0ZW0uYWxpZ25baV09ImxlZnQifWVsc2V7aXRlbS5hbGlnbltpXT1udWxsfX1mb3Io
91
+ aT0wO2k8aXRlbS5jZWxscy5sZW5ndGg7aSsrKXtpdGVtLmNlbGxzW2ldPWl0ZW0uY2VsbHNbaV0u
92
+ c3BsaXQoLyAqXHwgKi8pfXRoaXMudG9rZW5zLnB1c2goaXRlbSk7Y29udGludWV9aWYoY2FwPXRo
93
+ aXMucnVsZXMubGhlYWRpbmcuZXhlYyhzcmMpKXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVu
94
+ Z3RoKTt0aGlzLnRva2Vucy5wdXNoKHt0eXBlOiJoZWFkaW5nIixkZXB0aDpjYXBbMl09PT0iPSI/
95
+ MToyLHRleHQ6Y2FwWzFdfSk7Y29udGludWV9aWYoY2FwPXRoaXMucnVsZXMuaHIuZXhlYyhzcmMp
96
+ KXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTt0aGlzLnRva2Vucy5wdXNoKHt0eXBl
97
+ OiJociJ9KTtjb250aW51ZX1pZihjYXA9dGhpcy5ydWxlcy5ibG9ja3F1b3RlLmV4ZWMoc3JjKSl7
98
+ c3JjPXNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7dGhpcy50b2tlbnMucHVzaCh7dHlwZToi
99
+ YmxvY2txdW90ZV9zdGFydCJ9KTtjYXA9Y2FwWzBdLnJlcGxhY2UoL14gKj4gPy9nbSwiIik7dGhp
100
+ cy50b2tlbihjYXAsdG9wKTt0aGlzLnRva2Vucy5wdXNoKHt0eXBlOiJibG9ja3F1b3RlX2VuZCJ9
101
+ KTtjb250aW51ZX1pZihjYXA9dGhpcy5ydWxlcy5saXN0LmV4ZWMoc3JjKSl7c3JjPXNyYy5zdWJz
102
+ dHJpbmcoY2FwWzBdLmxlbmd0aCk7YnVsbD1jYXBbMl07dGhpcy50b2tlbnMucHVzaCh7dHlwZToi
103
+ bGlzdF9zdGFydCIsb3JkZXJlZDpidWxsLmxlbmd0aD4xfSk7Y2FwPWNhcFswXS5tYXRjaCh0aGlz
104
+ LnJ1bGVzLml0ZW0pO25leHQ9ZmFsc2U7bD1jYXAubGVuZ3RoO2k9MDtmb3IoO2k8bDtpKyspe2l0
105
+ ZW09Y2FwW2ldO3NwYWNlPWl0ZW0ubGVuZ3RoO2l0ZW09aXRlbS5yZXBsYWNlKC9eICooWyorLV18
106
+ XGQrXC4pICsvLCIiKTtpZih+aXRlbS5pbmRleE9mKCJcbiAiKSl7c3BhY2UtPWl0ZW0ubGVuZ3Ro
107
+ O2l0ZW09IXRoaXMub3B0aW9ucy5wZWRhbnRpYz9pdGVtLnJlcGxhY2UobmV3IFJlZ0V4cCgiXiB7
108
+ MSwiK3NwYWNlKyJ9IiwiZ20iKSwiIik6aXRlbS5yZXBsYWNlKC9eIHsxLDR9L2dtLCIiKX1pZih0
109
+ aGlzLm9wdGlvbnMuc21hcnRMaXN0cyYmaSE9PWwtMSl7Yj1ibG9jay5idWxsZXQuZXhlYyhjYXBb
110
+ aSsxXSlbMF07aWYoYnVsbCE9PWImJiEoYnVsbC5sZW5ndGg+MSYmYi5sZW5ndGg+MSkpe3NyYz1j
111
+ YXAuc2xpY2UoaSsxKS5qb2luKCJcbiIpK3NyYztpPWwtMX19bG9vc2U9bmV4dHx8L1xuXG4oPyFc
112
+ cyokKS8udGVzdChpdGVtKTtpZihpIT09bC0xKXtuZXh0PWl0ZW0uY2hhckF0KGl0ZW0ubGVuZ3Ro
113
+ LTEpPT09IlxuIjtpZighbG9vc2UpbG9vc2U9bmV4dH10aGlzLnRva2Vucy5wdXNoKHt0eXBlOmxv
114
+ b3NlPyJsb29zZV9pdGVtX3N0YXJ0IjoibGlzdF9pdGVtX3N0YXJ0In0pO3RoaXMudG9rZW4oaXRl
115
+ bSxmYWxzZSk7dGhpcy50b2tlbnMucHVzaCh7dHlwZToibGlzdF9pdGVtX2VuZCJ9KX10aGlzLnRv
116
+ a2Vucy5wdXNoKHt0eXBlOiJsaXN0X2VuZCJ9KTtjb250aW51ZX1pZihjYXA9dGhpcy5ydWxlcy5o
117
+ dG1sLmV4ZWMoc3JjKSl7c3JjPXNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7dGhpcy50b2tl
118
+ bnMucHVzaCh7dHlwZTp0aGlzLm9wdGlvbnMuc2FuaXRpemU/InBhcmFncmFwaCI6Imh0bWwiLHBy
119
+ ZTpjYXBbMV09PT0icHJlInx8Y2FwWzFdPT09InNjcmlwdCJ8fGNhcFsxXT09PSJzdHlsZSIsdGV4
120
+ dDpjYXBbMF19KTtjb250aW51ZX1pZih0b3AmJihjYXA9dGhpcy5ydWxlcy5kZWYuZXhlYyhzcmMp
121
+ KSl7c3JjPXNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7dGhpcy50b2tlbnMubGlua3NbY2Fw
122
+ WzFdLnRvTG93ZXJDYXNlKCldPXtocmVmOmNhcFsyXSx0aXRsZTpjYXBbM119O2NvbnRpbnVlfWlm
123
+ KHRvcCYmKGNhcD10aGlzLnJ1bGVzLnRhYmxlLmV4ZWMoc3JjKSkpe3NyYz1zcmMuc3Vic3RyaW5n
124
+ KGNhcFswXS5sZW5ndGgpO2l0ZW09e3R5cGU6InRhYmxlIixoZWFkZXI6Y2FwWzFdLnJlcGxhY2Uo
125
+ L14gKnwgKlx8ICokL2csIiIpLnNwbGl0KC8gKlx8ICovKSxhbGlnbjpjYXBbMl0ucmVwbGFjZSgv
126
+ XiAqfFx8ICokL2csIiIpLnNwbGl0KC8gKlx8ICovKSxjZWxsczpjYXBbM10ucmVwbGFjZSgvKD86
127
+ ICpcfCAqKT9cbiQvLCIiKS5zcGxpdCgiXG4iKX07Zm9yKGk9MDtpPGl0ZW0uYWxpZ24ubGVuZ3Ro
128
+ O2krKyl7aWYoL14gKi0rOiAqJC8udGVzdChpdGVtLmFsaWduW2ldKSl7aXRlbS5hbGlnbltpXT0i
129
+ cmlnaHQifWVsc2UgaWYoL14gKjotKzogKiQvLnRlc3QoaXRlbS5hbGlnbltpXSkpe2l0ZW0uYWxp
130
+ Z25baV09ImNlbnRlciJ9ZWxzZSBpZigvXiAqOi0rICokLy50ZXN0KGl0ZW0uYWxpZ25baV0pKXtp
131
+ dGVtLmFsaWduW2ldPSJsZWZ0In1lbHNle2l0ZW0uYWxpZ25baV09bnVsbH19Zm9yKGk9MDtpPGl0
132
+ ZW0uY2VsbHMubGVuZ3RoO2krKyl7aXRlbS5jZWxsc1tpXT1pdGVtLmNlbGxzW2ldLnJlcGxhY2Uo
133
+ L14gKlx8ICp8ICpcfCAqJC9nLCIiKS5zcGxpdCgvICpcfCAqLyl9dGhpcy50b2tlbnMucHVzaChp
134
+ dGVtKTtjb250aW51ZX1pZih0b3AmJihjYXA9dGhpcy5ydWxlcy5wYXJhZ3JhcGguZXhlYyhzcmMp
135
+ KSl7c3JjPXNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7dGhpcy50b2tlbnMucHVzaCh7dHlw
136
+ ZToicGFyYWdyYXBoIix0ZXh0OmNhcFsxXS5jaGFyQXQoY2FwWzFdLmxlbmd0aC0xKT09PSJcbiI/
137
+ Y2FwWzFdLnNsaWNlKDAsLTEpOmNhcFsxXX0pO2NvbnRpbnVlfWlmKGNhcD10aGlzLnJ1bGVzLnRl
138
+ eHQuZXhlYyhzcmMpKXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTt0aGlzLnRva2Vu
139
+ cy5wdXNoKHt0eXBlOiJ0ZXh0Iix0ZXh0OmNhcFswXX0pO2NvbnRpbnVlfWlmKHNyYyl7dGhyb3cg
140
+ bmV3IEVycm9yKCJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrc3JjLmNoYXJDb2RlQXQoMCkpfX1y
141
+ ZXR1cm4gdGhpcy50b2tlbnN9O3ZhciBpbmxpbmU9e2VzY2FwZTovXlxcKFtcXGAqe31cW1xdKCkj
142
+ K1wtLiFfPl0pLyxhdXRvbGluazovXjwoW14gPl0rKEB8OlwvKVteID5dKyk+Lyx1cmw6bm9vcCx0
143
+ YWc6L148IS0tW1xzXFNdKj8tLT58XjxcLz9cdysoPzoiW14iXSoifCdbXiddKid8W14nIj5dKSo/
144
+ Pi8sbGluazovXiE/XFsoaW5zaWRlKVxdXChocmVmXCkvLHJlZmxpbms6L14hP1xbKGluc2lkZSlc
145
+ XVxzKlxbKFteXF1dKilcXS8sbm9saW5rOi9eIT9cWygoPzpcW1teXF1dKlxdfFteXFtcXV0pKilc
146
+ XS8sc3Ryb25nOi9eX18oW1xzXFNdKz8pX18oPyFfKXxeXCpcKihbXHNcU10rPylcKlwqKD8hXCop
147
+ LyxlbTovXlxiXygoPzpfX3xbXHNcU10pKz8pX1xifF5cKigoPzpcKlwqfFtcc1xTXSkrPylcKig/
148
+ IVwqKS8sY29kZTovXihgKylccyooW1xzXFNdKj9bXmBdKVxzKlwxKD8hYCkvLGJyOi9eIHsyLH1c
149
+ big/IVxzKiQpLyxkZWw6bm9vcCx0ZXh0Oi9eW1xzXFNdKz8oPz1bXFw8IVxbXypgXXwgezIsfVxu
150
+ fCQpL307aW5saW5lLl9pbnNpZGU9Lyg/OlxbW15cXV0qXF18W15cW1xdXXxcXSg/PVteXFtdKlxd
151
+ KSkqLztpbmxpbmUuX2hyZWY9L1xzKjw/KFtcc1xTXSo/KT4/KD86XHMrWyciXShbXHNcU10qPylb
152
+ JyJdKT9ccyovO2lubGluZS5saW5rPXJlcGxhY2UoaW5saW5lLmxpbmspKCJpbnNpZGUiLGlubGlu
153
+ ZS5faW5zaWRlKSgiaHJlZiIsaW5saW5lLl9ocmVmKSgpO2lubGluZS5yZWZsaW5rPXJlcGxhY2Uo
154
+ aW5saW5lLnJlZmxpbmspKCJpbnNpZGUiLGlubGluZS5faW5zaWRlKSgpO2lubGluZS5ub3JtYWw9
155
+ bWVyZ2Uoe30saW5saW5lKTtpbmxpbmUucGVkYW50aWM9bWVyZ2Uoe30saW5saW5lLm5vcm1hbCx7
156
+ c3Ryb25nOi9eX18oPz1cUykoW1xzXFNdKj9cUylfXyg/IV8pfF5cKlwqKD89XFMpKFtcc1xTXSo/
157
+ XFMpXCpcKig/IVwqKS8sZW06L15fKD89XFMpKFtcc1xTXSo/XFMpXyg/IV8pfF5cKig/PVxTKShb
158
+ XHNcU10qP1xTKVwqKD8hXCopL30pO2lubGluZS5nZm09bWVyZ2Uoe30saW5saW5lLm5vcm1hbCx7
159
+ ZXNjYXBlOnJlcGxhY2UoaW5saW5lLmVzY2FwZSkoIl0pIiwifnxdKSIpKCksdXJsOi9eKGh0dHBz
160
+ PzpcL1wvW15cczxdK1tePC4sOjsiJylcXVxzXSkvLGRlbDovXn5+KD89XFMpKFtcc1xTXSo/XFMp
161
+ fn4vLHRleHQ6cmVwbGFjZShpbmxpbmUudGV4dCkoIl18Iiwifl18IikoInwiLCJ8aHR0cHM/Oi8v
162
+ fCIpKCl9KTtpbmxpbmUuYnJlYWtzPW1lcmdlKHt9LGlubGluZS5nZm0se2JyOnJlcGxhY2UoaW5s
163
+ aW5lLmJyKSgiezIsfSIsIioiKSgpLHRleHQ6cmVwbGFjZShpbmxpbmUuZ2ZtLnRleHQpKCJ7Mix9
164
+ IiwiKiIpKCl9KTtmdW5jdGlvbiBJbmxpbmVMZXhlcihsaW5rcyxvcHRpb25zKXt0aGlzLm9wdGlv
165
+ bnM9b3B0aW9uc3x8bWFya2VkLmRlZmF1bHRzO3RoaXMubGlua3M9bGlua3M7dGhpcy5ydWxlcz1p
166
+ bmxpbmUubm9ybWFsO3RoaXMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyfHxuZXcgUmVu
167
+ ZGVyZXI7aWYoIXRoaXMubGlua3Mpe3Rocm93IG5ldyBFcnJvcigiVG9rZW5zIGFycmF5IHJlcXVp
168
+ cmVzIGEgYGxpbmtzYCBwcm9wZXJ0eS4iKX1pZih0aGlzLm9wdGlvbnMuZ2ZtKXtpZih0aGlzLm9w
169
+ dGlvbnMuYnJlYWtzKXt0aGlzLnJ1bGVzPWlubGluZS5icmVha3N9ZWxzZXt0aGlzLnJ1bGVzPWlu
170
+ bGluZS5nZm19fWVsc2UgaWYodGhpcy5vcHRpb25zLnBlZGFudGljKXt0aGlzLnJ1bGVzPWlubGlu
171
+ ZS5wZWRhbnRpY319SW5saW5lTGV4ZXIucnVsZXM9aW5saW5lO0lubGluZUxleGVyLm91dHB1dD1m
172
+ dW5jdGlvbihzcmMsbGlua3Msb3B0aW9ucyl7dmFyIGlubGluZT1uZXcgSW5saW5lTGV4ZXIobGlu
173
+ a3Msb3B0aW9ucyk7cmV0dXJuIGlubGluZS5vdXRwdXQoc3JjKX07SW5saW5lTGV4ZXIucHJvdG90
174
+ eXBlLm91dHB1dD1mdW5jdGlvbihzcmMpe3ZhciBvdXQ9IiIsbGluayx0ZXh0LGhyZWYsY2FwO3do
175
+ aWxlKHNyYyl7aWYoY2FwPXRoaXMucnVsZXMuZXNjYXBlLmV4ZWMoc3JjKSl7c3JjPXNyYy5zdWJz
176
+ dHJpbmcoY2FwWzBdLmxlbmd0aCk7b3V0Kz1jYXBbMV07Y29udGludWV9aWYoY2FwPXRoaXMucnVs
177
+ ZXMuYXV0b2xpbmsuZXhlYyhzcmMpKXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTtp
178
+ ZihjYXBbMl09PT0iQCIpe3RleHQ9Y2FwWzFdLmNoYXJBdCg2KT09PSI6Ij90aGlzLm1hbmdsZShj
179
+ YXBbMV0uc3Vic3RyaW5nKDcpKTp0aGlzLm1hbmdsZShjYXBbMV0pO2hyZWY9dGhpcy5tYW5nbGUo
180
+ Im1haWx0bzoiKSt0ZXh0fWVsc2V7dGV4dD1lc2NhcGUoY2FwWzFdKTtocmVmPXRleHR9b3V0Kz10
181
+ aGlzLnJlbmRlcmVyLmxpbmsoaHJlZixudWxsLHRleHQpO2NvbnRpbnVlfWlmKGNhcD10aGlzLnJ1
182
+ bGVzLnVybC5leGVjKHNyYykpe3NyYz1zcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpO3RleHQ9
183
+ ZXNjYXBlKGNhcFsxXSk7aHJlZj10ZXh0O291dCs9dGhpcy5yZW5kZXJlci5saW5rKGhyZWYsbnVs
184
+ bCx0ZXh0KTtjb250aW51ZX1pZihjYXA9dGhpcy5ydWxlcy50YWcuZXhlYyhzcmMpKXtzcmM9c3Jj
185
+ LnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTtvdXQrPXRoaXMub3B0aW9ucy5zYW5pdGl6ZT9lc2Nh
186
+ cGUoY2FwWzBdKTpjYXBbMF07Y29udGludWV9aWYoY2FwPXRoaXMucnVsZXMubGluay5leGVjKHNy
187
+ Yykpe3NyYz1zcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpO291dCs9dGhpcy5vdXRwdXRMaW5r
188
+ KGNhcCx7aHJlZjpjYXBbMl0sdGl0bGU6Y2FwWzNdfSk7Y29udGludWV9aWYoKGNhcD10aGlzLnJ1
189
+ bGVzLnJlZmxpbmsuZXhlYyhzcmMpKXx8KGNhcD10aGlzLnJ1bGVzLm5vbGluay5leGVjKHNyYykp
190
+ KXtzcmM9c3JjLnN1YnN0cmluZyhjYXBbMF0ubGVuZ3RoKTtsaW5rPShjYXBbMl18fGNhcFsxXSku
191
+ cmVwbGFjZSgvXHMrL2csIiAiKTtsaW5rPXRoaXMubGlua3NbbGluay50b0xvd2VyQ2FzZSgpXTtp
192
+ ZighbGlua3x8IWxpbmsuaHJlZil7b3V0Kz1jYXBbMF0uY2hhckF0KDApO3NyYz1jYXBbMF0uc3Vi
193
+ c3RyaW5nKDEpK3NyYztjb250aW51ZX1vdXQrPXRoaXMub3V0cHV0TGluayhjYXAsbGluayk7Y29u
194
+ dGludWV9aWYoY2FwPXRoaXMucnVsZXMuc3Ryb25nLmV4ZWMoc3JjKSl7c3JjPXNyYy5zdWJzdHJp
195
+ bmcoY2FwWzBdLmxlbmd0aCk7b3V0Kz10aGlzLnJlbmRlcmVyLnN0cm9uZyh0aGlzLm91dHB1dChj
196
+ YXBbMl18fGNhcFsxXSkpO2NvbnRpbnVlfWlmKGNhcD10aGlzLnJ1bGVzLmVtLmV4ZWMoc3JjKSl7
197
+ c3JjPXNyYy5zdWJzdHJpbmcoY2FwWzBdLmxlbmd0aCk7b3V0Kz10aGlzLnJlbmRlcmVyLmVtKHRo
198
+ aXMub3V0cHV0KGNhcFsyXXx8Y2FwWzFdKSk7Y29udGludWV9aWYoY2FwPXRoaXMucnVsZXMuY29k
199
+ ZS5leGVjKHNyYykpe3NyYz1zcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpO291dCs9dGhpcy5y
200
+ ZW5kZXJlci5jb2Rlc3Bhbihlc2NhcGUoY2FwWzJdLHRydWUpKTtjb250aW51ZX1pZihjYXA9dGhp
201
+ cy5ydWxlcy5ici5leGVjKHNyYykpe3NyYz1zcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpO291
202
+ dCs9dGhpcy5yZW5kZXJlci5icigpO2NvbnRpbnVlfWlmKGNhcD10aGlzLnJ1bGVzLmRlbC5leGVj
203
+ KHNyYykpe3NyYz1zcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpO291dCs9dGhpcy5yZW5kZXJl
204
+ ci5kZWwodGhpcy5vdXRwdXQoY2FwWzFdKSk7Y29udGludWV9aWYoY2FwPXRoaXMucnVsZXMudGV4
205
+ dC5leGVjKHNyYykpe3NyYz1zcmMuc3Vic3RyaW5nKGNhcFswXS5sZW5ndGgpO291dCs9ZXNjYXBl
206
+ KHRoaXMuc21hcnR5cGFudHMoY2FwWzBdKSk7Y29udGludWV9aWYoc3JjKXt0aHJvdyBuZXcgRXJy
207
+ b3IoIkluZmluaXRlIGxvb3Agb24gYnl0ZTogIitzcmMuY2hhckNvZGVBdCgwKSl9fXJldHVybiBv
208
+ dXR9O0lubGluZUxleGVyLnByb3RvdHlwZS5vdXRwdXRMaW5rPWZ1bmN0aW9uKGNhcCxsaW5rKXt2
209
+ YXIgaHJlZj1lc2NhcGUobGluay5ocmVmKSx0aXRsZT1saW5rLnRpdGxlP2VzY2FwZShsaW5rLnRp
210
+ dGxlKTpudWxsO2lmKGNhcFswXS5jaGFyQXQoMCkhPT0iISIpe3JldHVybiB0aGlzLnJlbmRlcmVy
211
+ LmxpbmsoaHJlZix0aXRsZSx0aGlzLm91dHB1dChjYXBbMV0pKX1lbHNle3JldHVybiB0aGlzLnJl
212
+ bmRlcmVyLmltYWdlKGhyZWYsdGl0bGUsZXNjYXBlKGNhcFsxXSkpfX07SW5saW5lTGV4ZXIucHJv
213
+ dG90eXBlLnNtYXJ0eXBhbnRzPWZ1bmN0aW9uKHRleHQpe2lmKCF0aGlzLm9wdGlvbnMuc21hcnR5
214
+ cGFudHMpcmV0dXJuIHRleHQ7cmV0dXJuIHRleHQucmVwbGFjZSgvLS0vZywi4oCUIikucmVwbGFj
215
+ ZSgvKF58Wy1cdTIwMTQvKFxbeyJcc10pJy9nLCIkMeKAmCIpLnJlcGxhY2UoLycvZywi4oCZIiku
216
+ cmVwbGFjZSgvKF58Wy1cdTIwMTQvKFxbe1x1MjAxOFxzXSkiL2csIiQx4oCcIikucmVwbGFjZSgv
217
+ Ii9nLCLigJ0iKS5yZXBsYWNlKC9cLnszfS9nLCLigKYiKX07SW5saW5lTGV4ZXIucHJvdG90eXBl
218
+ Lm1hbmdsZT1mdW5jdGlvbih0ZXh0KXt2YXIgb3V0PSIiLGw9dGV4dC5sZW5ndGgsaT0wLGNoO2Zv
219
+ cig7aTxsO2krKyl7Y2g9dGV4dC5jaGFyQ29kZUF0KGkpO2lmKE1hdGgucmFuZG9tKCk+LjUpe2No
220
+ PSJ4IitjaC50b1N0cmluZygxNil9b3V0Kz0iJiMiK2NoKyI7In1yZXR1cm4gb3V0fTtmdW5jdGlv
221
+ biBSZW5kZXJlcigpe31SZW5kZXJlci5wcm90b3R5cGUuY29kZT1mdW5jdGlvbihjb2RlLGxhbmcp
222
+ e2lmKCFsYW5nKXtyZXR1cm4iPHByZT48Y29kZT4iK2VzY2FwZShjb2RlLHRydWUpKyJcbjwvY29k
223
+ ZT48L3ByZT4ifXJldHVybic8cHJlPjxjb2RlIGNsYXNzPSInKyJsYW5nLSIrbGFuZysnIj4nK2Vz
224
+ Y2FwZShjb2RlKSsiXG48L2NvZGU+PC9wcmU+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUuYmxvY2tx
225
+ dW90ZT1mdW5jdGlvbihxdW90ZSl7cmV0dXJuIjxibG9ja3F1b3RlPlxuIitxdW90ZSsiPC9ibG9j
226
+ a3F1b3RlPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLmh0bWw9ZnVuY3Rpb24oaHRtbCl7cmV0dXJu
227
+ IGh0bWx9O1JlbmRlcmVyLnByb3RvdHlwZS5oZWFkaW5nPWZ1bmN0aW9uKHRleHQsbGV2ZWwscmF3
228
+ LG9wdGlvbnMpe3JldHVybiI8aCIrbGV2ZWwrIj4iK3RleHQrIjwvaCIrbGV2ZWwrIj5cbiJ9O1Jl
229
+ bmRlcmVyLnByb3RvdHlwZS5ocj1mdW5jdGlvbigpe3JldHVybiI8aHI+XG4ifTtSZW5kZXJlci5w
230
+ cm90b3R5cGUubGlzdD1mdW5jdGlvbihib2R5LG9yZGVyZWQpe3ZhciB0eXBlPW9yZGVyZWQ/Im9s
231
+ IjoidWwiO3JldHVybiI8Iit0eXBlKyI+XG4iK2JvZHkrIjwvIit0eXBlKyI+XG4ifTtSZW5kZXJl
232
+ ci5wcm90b3R5cGUubGlzdGl0ZW09ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxsaT4iK3RleHQrIjwv
233
+ bGk+XG4ifTtSZW5kZXJlci5wcm90b3R5cGUucGFyYWdyYXBoPWZ1bmN0aW9uKHRleHQpe3JldHVy
234
+ biI8cD4iK3RleHQrIjwvcD5cbiJ9O1JlbmRlcmVyLnByb3RvdHlwZS50YWJsZT1mdW5jdGlvbiho
235
+ ZWFkZXIsYm9keSl7cmV0dXJuIjx0YWJsZT5cbiIrIjx0aGVhZD5cbiIraGVhZGVyKyI8L3RoZWFk
236
+ PlxuIisiPHRib2R5PlxuIitib2R5KyI8L3Rib2R5PlxuIisiPC90YWJsZT5cbiJ9O1JlbmRlcmVy
237
+ LnByb3RvdHlwZS50YWJsZXJvdz1mdW5jdGlvbihjb250ZW50KXtyZXR1cm4iPHRyPlxuIitjb250
238
+ ZW50KyI8L3RyPlxuIn07UmVuZGVyZXIucHJvdG90eXBlLnRhYmxlY2VsbD1mdW5jdGlvbihjb250
239
+ ZW50LGZsYWdzKXt2YXIgdHlwZT1mbGFncy5oZWFkZXI/InRoIjoidGQiO3ZhciB0YWc9ZmxhZ3Mu
240
+ YWxpZ24/IjwiK3R5cGUrJyBzdHlsZT0idGV4dC1hbGlnbjonK2ZsYWdzLmFsaWduKyciPic6Ijwi
241
+ K3R5cGUrIj4iO3JldHVybiB0YWcrY29udGVudCsiPC8iK3R5cGUrIj5cbiJ9O1JlbmRlcmVyLnBy
242
+ b3RvdHlwZS5zdHJvbmc9ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxzdHJvbmc+Iit0ZXh0KyI8L3N0
243
+ cm9uZz4ifTtSZW5kZXJlci5wcm90b3R5cGUuZW09ZnVuY3Rpb24odGV4dCl7cmV0dXJuIjxlbT4i
244
+ K3RleHQrIjwvZW0+In07UmVuZGVyZXIucHJvdG90eXBlLmNvZGVzcGFuPWZ1bmN0aW9uKHRleHQp
245
+ e3JldHVybiI8Y29kZT4iK3RleHQrIjwvY29kZT4ifTtSZW5kZXJlci5wcm90b3R5cGUuYnI9ZnVu
246
+ Y3Rpb24oKXtyZXR1cm4iPGJyPiJ9O1JlbmRlcmVyLnByb3RvdHlwZS5kZWw9ZnVuY3Rpb24odGV4
247
+ dCl7cmV0dXJuIjxkZWw+Iit0ZXh0KyI8L2RlbD4ifTtSZW5kZXJlci5wcm90b3R5cGUubGluaz1m
248
+ dW5jdGlvbihocmVmLHRpdGxlLHRleHQpe3ZhciBvdXQ9JzxhIGhyZWY9IicraHJlZisnIic7aWYo
249
+ dGl0bGUpe291dCs9JyB0aXRsZT0iJyt0aXRsZSsnIid9b3V0Kz0iPiIrdGV4dCsiPC9hPiI7cmV0
250
+ dXJuIG91dH07UmVuZGVyZXIucHJvdG90eXBlLmltYWdlPWZ1bmN0aW9uKGhyZWYsdGl0bGUsdGV4
251
+ dCl7dmFyIG91dD0nPGltZyBzcmM9IicraHJlZisnIiBhbHQ9IicrdGV4dCsnIic7aWYodGl0bGUp
252
+ e291dCs9JyB0aXRsZT0iJyt0aXRsZSsnIid9b3V0Kz0iPiI7cmV0dXJuIG91dH07ZnVuY3Rpb24g
253
+ UGFyc2VyKG9wdGlvbnMpe3RoaXMudG9rZW5zPVtdO3RoaXMudG9rZW49bnVsbDt0aGlzLm9wdGlv
254
+ bnM9b3B0aW9uc3x8bWFya2VkLmRlZmF1bHRzO3RoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9w
255
+ dGlvbnMucmVuZGVyZXJ8fG5ldyBSZW5kZXJlcjt0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5y
256
+ ZW5kZXJlcn1QYXJzZXIucGFyc2U9ZnVuY3Rpb24oc3JjLG9wdGlvbnMscmVuZGVyZXIpe3ZhciBw
257
+ YXJzZXI9bmV3IFBhcnNlcihvcHRpb25zLHJlbmRlcmVyKTtyZXR1cm4gcGFyc2VyLnBhcnNlKHNy
258
+ Yyl9O1BhcnNlci5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oc3JjKXt0aGlzLmlubGluZT1uZXcg
259
+ SW5saW5lTGV4ZXIoc3JjLmxpbmtzLHRoaXMub3B0aW9ucyx0aGlzLnJlbmRlcmVyKTt0aGlzLnRv
260
+ a2Vucz1zcmMucmV2ZXJzZSgpO3ZhciBvdXQ9IiI7d2hpbGUodGhpcy5uZXh0KCkpe291dCs9dGhp
261
+ cy50b2soKX1yZXR1cm4gb3V0fTtQYXJzZXIucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtyZXR1
262
+ cm4gdGhpcy50b2tlbj10aGlzLnRva2Vucy5wb3AoKX07UGFyc2VyLnByb3RvdHlwZS5wZWVrPWZ1
263
+ bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMudG9rZW5zLmxlbmd0aC0xXXx8MH07UGFy
264
+ c2VyLnByb3RvdHlwZS5wYXJzZVRleHQ9ZnVuY3Rpb24oKXt2YXIgYm9keT10aGlzLnRva2VuLnRl
265
+ eHQ7d2hpbGUodGhpcy5wZWVrKCkudHlwZT09PSJ0ZXh0Iil7Ym9keSs9IlxuIit0aGlzLm5leHQo
266
+ KS50ZXh0fXJldHVybiB0aGlzLmlubGluZS5vdXRwdXQoYm9keSl9O1BhcnNlci5wcm90b3R5cGUu
267
+ dG9rPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMudG9rZW4udHlwZSl7Y2FzZSJzcGFjZSI6e3JldHVy
268
+ biIifWNhc2UiaHIiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5ocigpfWNhc2UiaGVhZGluZyI6e3Jl
269
+ dHVybiB0aGlzLnJlbmRlcmVyLmhlYWRpbmcodGhpcy5pbmxpbmUub3V0cHV0KHRoaXMudG9rZW4u
270
+ dGV4dCksdGhpcy50b2tlbi5kZXB0aCl9Y2FzZSJjb2RlIjp7cmV0dXJuIHRoaXMucmVuZGVyZXIu
271
+ Y29kZSh0aGlzLnRva2VuLnRleHQsdGhpcy50b2tlbi5sYW5nKX1jYXNlInRhYmxlIjp7dmFyIGhl
272
+ YWRlcj0iIixib2R5PSIiLGkscm93LGNlbGwsZmxhZ3MsajtjZWxsPSIiO2ZvcihpPTA7aTx0aGlz
273
+ LnRva2VuLmhlYWRlci5sZW5ndGg7aSsrKXtmbGFncz17aGVhZGVyOnRydWUsYWxpZ246dGhpcy50
274
+ b2tlbi5hbGlnbltpXX07Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5pbmxpbmUu
275
+ b3V0cHV0KHRoaXMudG9rZW4uaGVhZGVyW2ldKSx7aGVhZGVyOnRydWUsYWxpZ246dGhpcy50b2tl
276
+ bi5hbGlnbltpXX0pfWhlYWRlcis9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKTtmb3IoaT0w
277
+ O2k8dGhpcy50b2tlbi5jZWxscy5sZW5ndGg7aSsrKXtyb3c9dGhpcy50b2tlbi5jZWxsc1tpXTtj
278
+ ZWxsPSIiO2ZvcihqPTA7ajxyb3cubGVuZ3RoO2orKyl7Y2VsbCs9dGhpcy5yZW5kZXJlci50YWJs
279
+ ZWNlbGwodGhpcy5pbmxpbmUub3V0cHV0KHJvd1tqXSkse2hlYWRlcjpmYWxzZSxhbGlnbjp0aGlz
280
+ LnRva2VuLmFsaWduW2pdfSl9Ym9keSs9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKX1yZXR1
281
+ cm4gdGhpcy5yZW5kZXJlci50YWJsZShoZWFkZXIsYm9keSl9Y2FzZSJibG9ja3F1b3RlX3N0YXJ0
282
+ Ijp7dmFyIGJvZHk9IiI7d2hpbGUodGhpcy5uZXh0KCkudHlwZSE9PSJibG9ja3F1b3RlX2VuZCIp
283
+ e2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShib2R5KX1j
284
+ YXNlImxpc3Rfc3RhcnQiOnt2YXIgYm9keT0iIixvcmRlcmVkPXRoaXMudG9rZW4ub3JkZXJlZDt3
285
+ aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfZW5kIil7Ym9keSs9dGhpcy50b2soKX1yZXR1
286
+ cm4gdGhpcy5yZW5kZXJlci5saXN0KGJvZHksb3JkZXJlZCl9Y2FzZSJsaXN0X2l0ZW1fc3RhcnQi
287
+ Ont2YXIgYm9keT0iIjt3aGlsZSh0aGlzLm5leHQoKS50eXBlIT09Imxpc3RfaXRlbV9lbmQiKXti
288
+ b2R5Kz10aGlzLnRva2VuLnR5cGU9PT0idGV4dCI/dGhpcy5wYXJzZVRleHQoKTp0aGlzLnRvaygp
289
+ fXJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RpdGVtKGJvZHkpfWNhc2UibG9vc2VfaXRlbV9zdGFy
290
+ dCI6e3ZhciBib2R5PSIiO3doaWxlKHRoaXMubmV4dCgpLnR5cGUhPT0ibGlzdF9pdGVtX2VuZCIp
291
+ e2JvZHkrPXRoaXMudG9rKCl9cmV0dXJuIHRoaXMucmVuZGVyZXIubGlzdGl0ZW0oYm9keSl9Y2Fz
292
+ ZSJodG1sIjp7dmFyIGh0bWw9IXRoaXMudG9rZW4ucHJlJiYhdGhpcy5vcHRpb25zLnBlZGFudGlj
293
+ P3RoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpOnRoaXMudG9rZW4udGV4dDtyZXR1
294
+ cm4gdGhpcy5yZW5kZXJlci5odG1sKGh0bWwpfWNhc2UicGFyYWdyYXBoIjp7cmV0dXJuIHRoaXMu
295
+ cmVuZGVyZXIucGFyYWdyYXBoKHRoaXMuaW5saW5lLm91dHB1dCh0aGlzLnRva2VuLnRleHQpKX1j
296
+ YXNlInRleHQiOntyZXR1cm4gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodGhpcy5wYXJzZVRleHQo
297
+ KSl9fX07ZnVuY3Rpb24gZXNjYXBlKGh0bWwsZW5jb2RlKXtyZXR1cm4gaHRtbC5yZXBsYWNlKCFl
298
+ bmNvZGU/LyYoPyEjP1x3KzspL2c6LyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5y
299
+ ZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywi
300
+ JiMzOTsiKX1mdW5jdGlvbiByZXBsYWNlKHJlZ2V4LG9wdCl7cmVnZXg9cmVnZXguc291cmNlO29w
301
+ dD1vcHR8fCIiO3JldHVybiBmdW5jdGlvbiBzZWxmKG5hbWUsdmFsKXtpZighbmFtZSlyZXR1cm4g
302
+ bmV3IFJlZ0V4cChyZWdleCxvcHQpO3ZhbD12YWwuc291cmNlfHx2YWw7dmFsPXZhbC5yZXBsYWNl
303
+ KC8oXnxbXlxbXSlcXi9nLCIkMSIpO3JlZ2V4PXJlZ2V4LnJlcGxhY2UobmFtZSx2YWwpO3JldHVy
304
+ biBzZWxmfX1mdW5jdGlvbiBub29wKCl7fW5vb3AuZXhlYz1ub29wO2Z1bmN0aW9uIG1lcmdlKG9i
305
+ ail7dmFyIGk9MSx0YXJnZXQsa2V5O2Zvcig7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dGFyZ2V0
306
+ PWFyZ3VtZW50c1tpXTtmb3Ioa2V5IGluIHRhcmdldCl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNP
307
+ d25Qcm9wZXJ0eS5jYWxsKHRhcmdldCxrZXkpKXtvYmpba2V5XT10YXJnZXRba2V5XX19fXJldHVy
308
+ biBvYmp9ZnVuY3Rpb24gbWFya2VkKHNyYyxvcHQsY2FsbGJhY2spe2lmKGNhbGxiYWNrfHx0eXBl
309
+ b2Ygb3B0PT09ImZ1bmN0aW9uIil7aWYoIWNhbGxiYWNrKXtjYWxsYmFjaz1vcHQ7b3B0PW51bGx9
310
+ b3B0PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHR8fHt9KTt2YXIgaGlnaGxpZ2h0PW9wdC5o
311
+ aWdobGlnaHQsdG9rZW5zLHBlbmRpbmcsaT0wO3RyeXt0b2tlbnM9TGV4ZXIubGV4KHNyYyxvcHQp
312
+ fWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1wZW5kaW5nPXRva2Vucy5sZW5ndGg7dmFyIGRv
313
+ bmU9ZnVuY3Rpb24oKXt2YXIgb3V0LGVycjt0cnl7b3V0PVBhcnNlci5wYXJzZSh0b2tlbnMsb3B0
314
+ KX1jYXRjaChlKXtlcnI9ZX1vcHQuaGlnaGxpZ2h0PWhpZ2hsaWdodDtyZXR1cm4gZXJyP2NhbGxi
315
+ YWNrKGVycik6Y2FsbGJhY2sobnVsbCxvdXQpfTtyZXR1cm4gZG9uZSgpfXRyeXtpZihvcHQpb3B0
316
+ PW1lcmdlKHt9LG1hcmtlZC5kZWZhdWx0cyxvcHQpO3JldHVybiBQYXJzZXIucGFyc2UoTGV4ZXIu
317
+ bGV4KHNyYyxvcHQpLG9wdCl9Y2F0Y2goZSl7ZS5tZXNzYWdlKz0iXG5QbGVhc2UgcmVwb3J0IHRo
318
+ aXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL2NoamovbWFya2VkLiI7aWYoKG9wdHx8bWFya2VkLmRl
319
+ ZmF1bHRzKS5zaWxlbnQpe3JldHVybiI8cD5BbiBlcnJvciBvY2N1cmVkOjwvcD48cHJlPiIrZXNj
320
+ YXBlKGUubWVzc2FnZSsiIix0cnVlKSsiPC9wcmU+In10aHJvdyBlfX1tYXJrZWQub3B0aW9ucz1t
321
+ YXJrZWQuc2V0T3B0aW9ucz1mdW5jdGlvbihvcHQpe21lcmdlKG1hcmtlZC5kZWZhdWx0cyxvcHQp
322
+ O3JldHVybiBtYXJrZWR9O21hcmtlZC5kZWZhdWx0cz17Z2ZtOnRydWUsdGFibGVzOnRydWUsYnJl
323
+ YWtzOmZhbHNlLHBlZGFudGljOmZhbHNlLHNhbml0aXplOmZhbHNlLHNtYXJ0TGlzdHM6ZmFsc2Us
324
+ c2lsZW50OmZhbHNlLHNtYXJ0eXBhbnRzOmZhbHNlLHJlbmRlcmVyOm5ldyBSZW5kZXJlcn07bWFy
325
+ a2VkLlBhcnNlcj1QYXJzZXI7bWFya2VkLnBhcnNlcj1QYXJzZXIucGFyc2U7bWFya2VkLlJlbmRl
326
+ cmVyPVJlbmRlcmVyO21hcmtlZC5MZXhlcj1MZXhlcjttYXJrZWQubGV4ZXI9TGV4ZXIubGV4O21h
327
+ cmtlZC5JbmxpbmVMZXhlcj1JbmxpbmVMZXhlcjttYXJrZWQuaW5saW5lTGV4ZXI9SW5saW5lTGV4
328
+ ZXIub3V0cHV0O21hcmtlZC5wYXJzZT1tYXJrZWQ7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0
329
+ Iil7bW9kdWxlLmV4cG9ydHM9bWFya2VkfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlv
330
+ biImJmRlZmluZS5hbWQpe2RlZmluZShmdW5jdGlvbigpe3JldHVybiBtYXJrZWR9KX1lbHNle3Ro
331
+ aXMubWFya2VkPW1hcmtlZH19KS5jYWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN8fCh0eXBlb2Yg
332
+ d2luZG93IT09InVuZGVmaW5lZCI/d2luZG93Omdsb2JhbCl9KCkpOw==
@@ -0,0 +1,373 @@
1
+ module Lissio; class Component
2
+
3
+ class Tooltip < Lissio::Component
4
+ DEFAULTS = {
5
+ placement: :top,
6
+ animate: true,
7
+ container: false,
8
+ delay: 0,
9
+ escape: true
10
+ }
11
+
12
+ def initialize(*args, &block)
13
+ if Lissio::Component === args.first
14
+ super(args.shift)
15
+ end
16
+
17
+ @options = DEFAULTS.merge(args.first)
18
+ @block = block
19
+ @enabled = true
20
+
21
+ render
22
+ end
23
+
24
+ def enabled?
25
+ @enabled
26
+ end
27
+
28
+ def enable
29
+ @enabled = true
30
+ end
31
+
32
+ def disable
33
+ @enabled = false
34
+ end
35
+
36
+ def shown?
37
+ element.has_class? :in
38
+ end
39
+
40
+ def register(element, trigger)
41
+ case trigger
42
+ when :click
43
+ element.on :click do
44
+ toggle
45
+ end
46
+
47
+ when :hover
48
+ element.on 'mouse:over' do
49
+ show
50
+ end
51
+
52
+ element.on 'mouse:out' do
53
+ hide
54
+ end
55
+
56
+ when :focus
57
+ element.on :focus do
58
+ show
59
+ end
60
+
61
+ element.on :blur do
62
+ hide
63
+ end
64
+ end
65
+
66
+ self
67
+ end
68
+
69
+ def show(content = @options[:content])
70
+ return unless enabled?
71
+
72
+ placement = @block ? block.call(self) : @options[:placement] || place
73
+
74
+ element.detach
75
+ element.style(top: 0, left: 0, display: 0)
76
+ element.add_class placement, :in
77
+ element.append_to container
78
+
79
+ element.at('.tooltip-inner').content = content
80
+ element.show()
81
+
82
+ apply(placement)
83
+ end
84
+
85
+ def hide
86
+ element.remove_class :in
87
+ end
88
+
89
+ def toggle
90
+ if shown?
91
+ hide
92
+ else
93
+ show
94
+ end
95
+ end
96
+
97
+ def destroy
98
+
99
+ end
100
+
101
+ private
102
+ def container
103
+ if container = @options[:container]
104
+ if String === container
105
+ container = (parent ? parent.element : $document).at(container)
106
+ end
107
+
108
+ container
109
+ else
110
+ parent ? parent.element : $document.body
111
+ end
112
+ end
113
+
114
+ def along
115
+ if along = @options[:along]
116
+ if String === along
117
+ along = (parent ? parent.element : $document).at(along)
118
+ end
119
+
120
+ along
121
+ else
122
+ raise ArgumentError, "no parent or along"
123
+
124
+ parent.element
125
+ end
126
+ end
127
+
128
+ def offset(placement)
129
+ along_position = along.position
130
+ along_size = along.size
131
+ size = element.size
132
+
133
+ case placement
134
+ when :bottom
135
+ Browser::Position.new(along_position.x + (along_size.width / 2) - (size.width / 2),
136
+ along_position.y + along_size.height)
137
+
138
+ when :top
139
+ Browser::Position.new(along_position.x + (along_size.width / 2) - (size.width / 2),
140
+ along_position.y - size.height)
141
+
142
+ when :left
143
+ Browser::Position.new(along_position.x - size.width,
144
+ along_position.y + (along_size.height / 2) - (size.height / 2))
145
+
146
+ when :right
147
+ Browser::Position.new(along_position.x + along_size.width,
148
+ along_position.y + (along_size.height / 2) - (size.height / 2))
149
+ end
150
+ end
151
+
152
+ def apply(placement)
153
+ position = offset(placement)
154
+ size = element.size
155
+
156
+ margin_top = element.style['margin-top'].to_u
157
+ margin_left = element.style['margin-left'].to_u
158
+
159
+ element.offset = position.x + margin_top, position.y + margin_left
160
+ end
161
+
162
+ def place
163
+ :top
164
+ end
165
+
166
+ tag class: :tooltip
167
+
168
+ html do
169
+ div.tooltip[:arrow]
170
+ div.tooltip[:inner]
171
+ end
172
+
173
+ css do
174
+ rule '.tooltip' do
175
+ position :absolute
176
+ z index: 9001
177
+
178
+ display :block
179
+ visibility :visible
180
+
181
+ font size: 12.px
182
+ line height: 1.4
183
+
184
+ opacity 0
185
+
186
+ rule '&.in' do
187
+ opacity 0.9
188
+ end
189
+
190
+ rule '&.top' do
191
+ margin top: -3.px
192
+ padding 5.px, 0
193
+ end
194
+
195
+ rule '&.right' do
196
+ margin left: 3.px
197
+ padding 0, 5.px
198
+ end
199
+
200
+ rule '&.bottom' do
201
+ margin top: 3.px
202
+ padding 5.px, 0
203
+ end
204
+
205
+ rule '&.left' do
206
+ margin left: -3.px
207
+ padding 0, 5.px
208
+ end
209
+
210
+ rule '.tooltip-inner' do
211
+ max width: 200.px
212
+ padding 3.px, 8.px
213
+ color '#fff'
214
+
215
+ text align: :center,
216
+ decoration: :none
217
+
218
+ background color: '#000'
219
+ border radius: 4.px
220
+ end
221
+
222
+ rule '.tooltip-arrow' do
223
+ position :absolute
224
+ width 0
225
+ height 0
226
+
227
+ border color: :transparent,
228
+ style: :solid
229
+ end
230
+
231
+ rule '&.top .tooltip-arrow' do
232
+ bottom 0
233
+ left 50.%
234
+
235
+ margin left: -5.px
236
+ border width: [5.px, 5.px, 0],
237
+ color: { top: '#000' }
238
+ end
239
+
240
+ rule '&.top-left .tooltip-arrow' do
241
+ bottom 0
242
+ left 5.px
243
+
244
+ border width: [5.px, 5.px, 0],
245
+ color: { top: '#000' }
246
+ end
247
+
248
+ rule '&.top-right .tooltip-arrow' do
249
+ bottom 0
250
+ right 5.px
251
+
252
+ border width: [5.px, 5.px, 0],
253
+ color: { top: '#000' }
254
+ end
255
+
256
+ rule '&.right .tooltip-arrow' do
257
+ top 50.%
258
+ left 0
259
+
260
+ margin top: -5.px
261
+ border width: [5.px, 5.px, 5.px, 0],
262
+ color: { right: '#000' }
263
+ end
264
+
265
+ rule '&.left .tooltip-arrow' do
266
+ top 50.%
267
+ right 0
268
+
269
+ margin top: -5.px
270
+ border width: [5.px, 0, 5.px, 5.px],
271
+ color: { left: '#000' }
272
+ end
273
+
274
+ rule '&.bottom .tooltip-arrow' do
275
+ top 0
276
+ left 50.%
277
+
278
+ margin left: -5.px
279
+ border width: [0, 5.px, 5.px],
280
+ color: { bottom: '#000' }
281
+ end
282
+
283
+ rule '&.bottom-left .tooltip-arrow' do
284
+ top 0
285
+ left 5.px
286
+
287
+ border width: [0, 5.px, 5.px],
288
+ color: { bottom: '#000' }
289
+ end
290
+
291
+ rule '&.bottom-right .tooltip-arrow' do
292
+ top 0
293
+ right 5.px
294
+
295
+ border width: [0, 5.px, 5.px],
296
+ color: { bottom: '#000' }
297
+ end
298
+ end
299
+ end
300
+
301
+ def self.customize(*args, &block)
302
+ if args.length == 1
303
+ options = args.first
304
+ else
305
+ name, options = args
306
+ end
307
+
308
+ name ||= "tooltip-custom-#{rand(10000)}"
309
+ options ||= {}
310
+
311
+ Class.new(self) {
312
+ tag class: [:tooltip, name]
313
+
314
+ css do
315
+ rule ".tooltip.#{name}" do
316
+ instance_exec(&block) if block
317
+
318
+ if value = options[:opacity]
319
+ rule '&.in' do
320
+ opacity value
321
+ end
322
+ end
323
+
324
+ if value = options[:foreground] || options[:fg]
325
+ rule '.tooltip-inner' do
326
+ color value
327
+ end
328
+ end
329
+
330
+ if value = options[:background] || options[:bg]
331
+ rule '.tooltip-inner' do
332
+ background color: value
333
+ end
334
+
335
+ rule '&.top .tooltip-arrow' do
336
+ border color: { top: value }
337
+ end
338
+
339
+ rule '&.top-right .tooltip-arrow' do
340
+ border color: { top: value }
341
+ end
342
+
343
+ rule '&.top-left .tooltip-arrow' do
344
+ border color: { top: value }
345
+ end
346
+
347
+ rule '&.right .tooltip-arrow' do
348
+ border color: { right: value }
349
+ end
350
+
351
+ rule '&.left .tooltip-arrow' do
352
+ border color: { right: value }
353
+ end
354
+
355
+ rule '&.bottom .tooltip-arrow' do
356
+ border color: { bottom: value }
357
+ end
358
+
359
+ rule '&.bottom-right .tooltip-arrow' do
360
+ border color: { bottom: value }
361
+ end
362
+
363
+ rule '&.bottom-left .tooltip-arrow' do
364
+ border color: { bottom: value }
365
+ end
366
+ end
367
+ end
368
+ end
369
+ }
370
+ end
371
+ end
372
+
373
+ end; end