reflekt 0.9.6 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "reflekt-server",
3
+ "version": "1.0.0",
4
+ "description": "Serves the UI and writes to the DB.",
5
+ "main": "server.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "start": "nodemon server.js"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/refIekt/reflekt-ui.git"
13
+ },
14
+ "author": "Maedi Prichard",
15
+ "license": "MPL-2.0",
16
+ "bugs": {
17
+ "url": "https://github.com/refIekt/reflekt-ui/issues"
18
+ },
19
+ "homepage": "https://reflekt.dev",
20
+ "dependencies": {
21
+ "express": "^4.17.1"
22
+ },
23
+ "devDependencies": {
24
+ "nodemon": "^2.0.5"
25
+ }
26
+ }
@@ -0,0 +1,118 @@
1
+ const express = require('express')
2
+ const path = require('path')
3
+ const vm = require("vm");
4
+ const fs = require('fs');
5
+ const app = express();
6
+
7
+ // Config.
8
+ const port = 3001;
9
+ const db_path = 'db.js';
10
+
11
+ // Configure express.
12
+ app.use(express.json());
13
+ app.use(express.static('.'));
14
+ app.use('/dist', express.static('../dist'));
15
+
16
+ // Respond with React app.
17
+ app.get('/', (req, res) => {
18
+ res.sendFile(path.join(__dirname, 'index.html'))
19
+ })
20
+
21
+ ////
22
+ // READ
23
+ ////
24
+
25
+ var load_db = () => {
26
+
27
+ const data = fs.readFileSync(db_path);
28
+ const script = new vm.Script(data);
29
+ script.runInThisContext();
30
+
31
+ return JSON.parse(db);
32
+
33
+ }
34
+
35
+ ////
36
+ // WRITE
37
+ ////
38
+
39
+ var save_db = (db) => {
40
+ // Save JS file to disk.
41
+ try {
42
+ fs.writeFileSync(db_path, 'var db = ' + JSON.stringify(JSON.stringify(db)) + ';');
43
+ }
44
+ catch (err) {
45
+ console.log("ERROR: save_db() failed to save.");
46
+ console.error(err);
47
+ }
48
+
49
+ }
50
+
51
+ ////
52
+ // DELETE.
53
+ ////
54
+
55
+ // Handle controls delete request.
56
+ app.post('/controls/delete', (req, res) => {
57
+
58
+ // Get execution ID that controls share.
59
+ var exe_id = req.body.exe_id;
60
+
61
+ // Get database.
62
+ db = load_db();
63
+
64
+ // Delete controls.
65
+ for (let [index, control] of db.controls.entries()) {
66
+ if (control.exe_id == exe_id) {
67
+ console.log("DELETE CONTROL:");
68
+ console.log(db.controls[index]);
69
+ db.controls.splice(index, 1);
70
+ }
71
+ if (control.base_id != null && control.base_id == exe_id) {
72
+ console.log("DELETE:");
73
+ console.log(db.controls[index]);
74
+ db.controls.splice(index, 1);
75
+ }
76
+ }
77
+
78
+ // Save database.
79
+ save_db(db)
80
+
81
+ res.status(200).send({ message: 'ok' });
82
+
83
+ })
84
+
85
+ // Handle control delete request.
86
+ app.post('/control/delete', (req, res) => {
87
+
88
+ // Get control ID.
89
+ ref_id = req.body.ref_id;
90
+
91
+ // Get database.
92
+ db = load_db();
93
+
94
+ // Delete control.
95
+ for (let [index, control] of db.controls.entries()) {
96
+ if (control.r == ref_id) {
97
+ console.log("DELETE CONTROL:")
98
+ console.log(db.controls[index]);
99
+ db.controls.splice(index, 1);
100
+ break;
101
+ }
102
+ }
103
+
104
+ // Save database.
105
+ save_db(db)
106
+
107
+ res.status(200).send({ message: 'ok' });
108
+
109
+ })
110
+
111
+ ////
112
+ // SERVE
113
+ ////
114
+
115
+ // Listen for requests.
116
+ app.listen(port, () => {
117
+ console.log(`Example app listening at http://localhost:${port}`)
118
+ })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reflekt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.6
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maedi Prichard
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-07 00:00:00.000000000 Z
11
+ date: 2020-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rowdb
@@ -25,32 +25,47 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  description: Testing that's completely automated.
28
- email: maediprichard@gmailcom
28
+ email: maediprichard@gmail.com
29
29
  executables: []
30
30
  extensions: []
31
31
  extra_rdoc_files: []
32
32
  files:
33
33
  - lib/Accessor.rb
34
+ - lib/Aggregator.rb
35
+ - lib/Clone.rb
36
+ - lib/Config.rb
34
37
  - lib/Control.rb
35
38
  - lib/Execution.rb
39
+ - lib/Meta.rb
40
+ - lib/MetaBuilder.rb
36
41
  - lib/Reflection.rb
37
42
  - lib/Reflekt.rb
38
43
  - lib/Renderer.rb
39
44
  - lib/Rule.rb
40
45
  - lib/RuleSet.rb
41
- - lib/Ruler.rb
42
46
  - lib/ShadowStack.rb
47
+ - lib/meta/ArrayMeta.rb
48
+ - lib/meta/BooleanMeta.rb
49
+ - lib/meta/FloatMeta.rb
50
+ - lib/meta/IntegerMeta.rb
51
+ - lib/meta/StringMeta.rb
52
+ - lib/rules/ArrayRule.rb
53
+ - lib/rules/BooleanRule.rb
43
54
  - lib/rules/FloatRule.rb
44
55
  - lib/rules/IntegerRule.rb
45
56
  - lib/rules/StringRule.rb
46
- - lib/web/script.js
47
- - lib/web/style.css
48
- - lib/web/template.html.erb
57
+ - lib/web/README.md
58
+ - lib/web/bundle.js
59
+ - lib/web/gitignore.txt
60
+ - lib/web/index.html
61
+ - lib/web/package-lock.json
62
+ - lib/web/package.json
63
+ - lib/web/server.js
49
64
  homepage: https://github.com/refIekt/reflekt
50
65
  licenses:
51
66
  - MPL-2.0
52
67
  metadata: {}
53
- post_install_message:
68
+ post_install_message:
54
69
  rdoc_options: []
55
70
  require_paths:
56
71
  - lib
@@ -65,8 +80,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
80
  - !ruby/object:Gem::Version
66
81
  version: '0'
67
82
  requirements: []
68
- rubygems_version: 3.0.2
69
- signing_key:
83
+ rubygems_version: 3.1.4
84
+ signing_key:
70
85
  specification_version: 4
71
86
  summary: Reflective testing.
72
87
  test_files: []
@@ -1,197 +0,0 @@
1
- ################################################################################
2
- # RULER
3
- #
4
- # Aggregates input/output from controls.
5
- # Creates and trains RuleSets from aggregated input/output.
6
- # Validates reflection input/output against RuleSets.
7
- ################################################################################
8
-
9
- require 'RuleSet'
10
-
11
- class Ruler
12
-
13
- INPUTS = "i"
14
- OUTPUT = "o"
15
- TYPE = "T"
16
- VALUE = "V"
17
-
18
- def initialize()
19
- @rule_sets = {}
20
- end
21
-
22
- ##
23
- # Get input RuleSets.
24
- #
25
- # @param Symbol klass
26
- # @param Symbol method
27
- #
28
- # @return Array
29
- ##
30
- def get_input_rule_sets(klass, method)
31
- return @rule_sets.dig(klass, method, :inputs)
32
- end
33
-
34
- ##
35
- # Get input RuleSet.
36
- #
37
- # @param Symbol klass
38
- # @param Symbol method
39
- #
40
- # @return RuleSet
41
- ##
42
- def get_input_rule_set(klass, method, arg_num)
43
- @rule_sets.dig(klass, method, :inputs, arg_num)
44
- end
45
-
46
- ##
47
- # Get output RuleSet.
48
- #
49
- # @param Symbol klass
50
- # @param Symbol method
51
- #
52
- # @return RuleSet.
53
- ##
54
- def get_output_rule_set(klass, method)
55
- @rule_sets.dig(klass, method, :output)
56
- end
57
-
58
- ##
59
- # Set input RuleSet.
60
- #
61
- # @param Symbol klass
62
- # @param Symbol method
63
- ##
64
- def set_input_rule_set(klass, method, arg_num, rule_set)
65
- # Set defaults.
66
- @rule_sets[klass] = {} unless @rule_sets.key? klass
67
- @rule_sets[klass][method] = {} unless @rule_sets[klass].key? method
68
- @rule_sets[klass][method][:inputs] = [] unless @rule_sets[klass][method].key? :inputs
69
- # Set value.
70
- @rule_sets[klass][method][:inputs][arg_num] = rule_set
71
- end
72
-
73
- ##
74
- # Set output RuleSet.
75
- #
76
- # @param Symbol klass
77
- # @param Symbol method
78
- # @param RuleSet rule_set
79
- ##
80
- def set_output_rule_set(klass, method, rule_set)
81
- # Set defaults.
82
- @rule_sets[klass] = {} unless @rule_sets.key? klass
83
- @rule_sets[klass][method] = {} unless @rule_sets[klass].key? method
84
- # Set value.
85
- @rule_sets[klass][method][:output] = rule_set
86
- end
87
-
88
- ##
89
- # Load RuleSets.
90
- #
91
- # @param Symbol klass
92
- # @param Symbol method
93
- # @param Array controls
94
- ##
95
- def load(klass, method, controls)
96
-
97
- # Create a RuleSet for each control's inputs/output.
98
- controls.each_with_index do |control, index|
99
-
100
- # Process inputs.
101
- control[INPUTS].each_with_index do |input, arg_num|
102
- rule_set = get_input_rule_set(klass, method, arg_num)
103
- if rule_set.nil?
104
- rule_set = RuleSet.new()
105
- set_input_rule_set(klass, method, arg_num, rule_set)
106
- end
107
- rule_set.load(input[TYPE], input[VALUE])
108
- end
109
-
110
- # Process output.
111
- output_rule_set = get_output_rule_set(klass, method)
112
- if output_rule_set.nil?
113
- output_rule_set = RuleSet.new()
114
- set_output_rule_set(klass, method, output_rule_set)
115
- end
116
- output_rule_set.load(control[OUTPUT][TYPE], control[OUTPUT][VALUE])
117
-
118
- end
119
-
120
- end
121
-
122
- ##
123
- # Train RuleSets from controls.
124
- #
125
- # @param Symbol klass
126
- # @param Symbol method
127
- ##
128
- def train(klass, method)
129
-
130
- input_rule_sets = get_input_rule_sets(klass, method)
131
- unless input_rule_sets.nil?
132
- input_rule_sets.each do |input_rule_set|
133
- input_rule_set.train()
134
- end
135
- end
136
-
137
- output_rule_set = get_output_rule_set(klass, method)
138
- unless output_rule_set.nil?
139
- output_rule_set.train()
140
- end
141
-
142
- end
143
-
144
- ##
145
- # Validate inputs.
146
- #
147
- # @param Array inputs - The method's arguments.
148
- # @param Array input_rule_sets - The RuleSets to validate each input with.
149
- ##
150
- def validate_inputs(inputs, input_rule_sets)
151
-
152
- # Default to a PASS result.
153
- result = true
154
-
155
- # Validate each argument against each rule set for that argument.
156
- inputs.each_with_index do |input, arg_num|
157
-
158
- unless input_rule_sets[arg_num].nil?
159
-
160
- rule_set = input_rule_sets[arg_num]
161
-
162
- unless rule_set.validate_rule(input)
163
- result = false
164
- end
165
-
166
- end
167
- end
168
-
169
- return result
170
-
171
- end
172
-
173
- ##
174
- # Validate output.
175
- #
176
- # @param dynamic output - The method's return value.
177
- # @param RuleSet output_rule_set - The RuleSet to validate the output with.
178
- ##
179
- def validate_output(output, output_rule_set)
180
-
181
- # Default to a PASS result.
182
- result = true
183
-
184
- unless output_rule_set.nil?
185
-
186
- # Validate output RuleSet for that argument.
187
- unless output_rule_set.validate_rule(output)
188
- result = false
189
- end
190
-
191
- end
192
-
193
- return result
194
-
195
- end
196
-
197
- end
@@ -1,8 +0,0 @@
1
- /**
2
- * Minified by jsDelivr using Terser v3.14.1.
3
- * Original file: /gh/alpinejs/alpine@2.6.0/dist/alpine.js
4
- *
5
- * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
6
- */
7
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Alpine=t()}(this,function(){"use strict";function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,i)}return n}function n(n){for(var i=1;i<arguments.length;i++){var r=null!=arguments[i]?arguments[i]:{};i%2?t(Object(r),!0).forEach(function(t){e(n,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):t(Object(r)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(r,e))})}return n}function i(e){return Array.from(new Set(e))}function r(){return navigator.userAgent.includes("Node.js")||navigator.userAgent.includes("jsdom")}function s(e,t){"template"!==e.tagName.toLowerCase()?console.warn(`Alpine: [${t}] directive should only be added to <template> tags. See https://github.com/alpinejs/alpine#${t}`):1!==e.content.childElementCount&&console.warn(`Alpine: <template> tag with [${t}] encountered with multiple element roots. Make sure <template> only has a single child node.`)}function o(e){return e.toLowerCase().replace(/-(\w)/g,(e,t)=>t.toUpperCase())}function a(e,t){var n;return function(){var i=this,r=arguments;clearTimeout(n),n=setTimeout(function(){n=null,e.apply(i,r)},t)}}function l(e,t,n={}){return"function"==typeof e?e.call(t):new Function(["$data",...Object.keys(n)],`var __alpine_result; with($data) { __alpine_result = ${e} }; return __alpine_result`)(t,...Object.values(n))}const c=/^x-(on|bind|data|text|html|model|if|for|show|cloak|transition|ref|spread)\b/;function u(e){const t=m(e.name);return c.test(t)}function d(e,t,n){let i=Array.from(e.attributes).filter(u).map(f),r=i.filter(e=>"spread"===e.type)[0];if(r){let e=l(r.expression,t.$data);i=i.concat(Object.entries(e).map(([e,t])=>f({name:e,value:t})))}return n?i.filter(e=>e.type===n):function(e){let t=["bind","model","show","catch-all"];return e.sort((e,n)=>{let i=-1===t.indexOf(e.type)?"catch-all":e.type,r=-1===t.indexOf(n.type)?"catch-all":n.type;return t.indexOf(i)-t.indexOf(r)})}(i)}function f({name:e,value:t}){const n=m(e),i=n.match(c),r=n.match(/:([a-zA-Z0-9\-:]+)/),s=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[];return{type:i?i[1]:null,value:r?r[1]:null,modifiers:s.map(e=>e.replace(".","")),expression:t}}function m(e){return e.startsWith("@")?e.replace("@","x-on:"):e.startsWith(":")?e.replace(":","x-bind:"):e}function p(e,t=Boolean){return e.split(" ").filter(t)}const h="in",v="out";function b(e,t,n,i=!1){if(i)return t();if(e.__x_transition&&e.__x_transition.type===h)return;const r=d(e,n,"transition"),s=d(e,n,"show")[0];if(s&&s.modifiers.includes("transition")){let n=s.modifiers;if(n.includes("out")&&!n.includes("in"))return t();const i=n.includes("in")&&n.includes("out");(function(e,t,n){const i={duration:g(t,"duration",150),origin:g(t,"origin","center"),first:{opacity:0,scale:g(t,"scale",95)},second:{opacity:1,scale:100}};x(e,t,n,()=>{},i,h)})(e,n=i?n.filter((e,t)=>t<n.indexOf("out")):n,t)}else r.some(e=>["enter","enter-start","enter-end"].includes(e.value))?function(e,t,n,i){let r=n=>"function"==typeof n?t.evaluateReturnExpression(e,n):n;const s=p(r((n.find(e=>"enter"===e.value)||{expression:""}).expression)),o=p(r((n.find(e=>"enter-start"===e.value)||{expression:""}).expression)),a=p(r((n.find(e=>"enter-end"===e.value)||{expression:""}).expression));_(e,s,o,a,i,()=>{},h)}(e,n,r,t):t()}function y(e,t,n,i=!1){if(i)return t();if(e.__x_transition&&e.__x_transition.type===v)return;const r=d(e,n,"transition"),s=d(e,n,"show")[0];if(s&&s.modifiers.includes("transition")){let n=s.modifiers;if(n.includes("in")&&!n.includes("out"))return t();const i=n.includes("in")&&n.includes("out");(function(e,t,n,i){const r={duration:n?g(t,"duration",150):g(t,"duration",150)/2,origin:g(t,"origin","center"),first:{opacity:1,scale:100},second:{opacity:0,scale:g(t,"scale",95)}};x(e,t,()=>{},i,r,v)})(e,n=i?n.filter((e,t)=>t>n.indexOf("out")):n,i,t)}else r.some(e=>["leave","leave-start","leave-end"].includes(e.value))?function(e,t,n,i){const r=p((n.find(e=>"leave"===e.value)||{expression:""}).expression),s=p((n.find(e=>"leave-start"===e.value)||{expression:""}).expression),o=p((n.find(e=>"leave-end"===e.value)||{expression:""}).expression);_(e,r,s,o,()=>{},i,v)}(e,0,r,t):t()}function g(e,t,n){if(-1===e.indexOf(t))return n;const i=e[e.indexOf(t)+1];if(!i)return n;if("scale"===t&&!E(i))return n;if("duration"===t){let e=i.match(/([0-9]+)ms/);if(e)return e[1]}return"origin"===t&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[i,e[e.indexOf(t)+2]].join(" "):i}function x(e,t,n,i,r,s){e.__x_transition&&(cancelAnimationFrame(e.__x_transition.nextFrame),e.__x_transition.callback&&e.__x_transition.callback());const o=e.style.opacity,a=e.style.transform,l=e.style.transformOrigin,c=!t.includes("opacity")&&!t.includes("scale"),u=c||t.includes("opacity"),d=c||t.includes("scale"),f={start(){u&&(e.style.opacity=r.first.opacity),d&&(e.style.transform=`scale(${r.first.scale/100})`)},during(){d&&(e.style.transformOrigin=r.origin),e.style.transitionProperty=[u?"opacity":"",d?"transform":""].join(" ").trim(),e.style.transitionDuration=`${r.duration/1e3}s`,e.style.transitionTimingFunction="cubic-bezier(0.4, 0.0, 0.2, 1)"},show(){n()},end(){u&&(e.style.opacity=r.second.opacity),d&&(e.style.transform=`scale(${r.second.scale/100})`)},hide(){i()},cleanup(){u&&(e.style.opacity=o),d&&(e.style.transform=a),d&&(e.style.transformOrigin=l),e.style.transitionProperty=null,e.style.transitionDuration=null,e.style.transitionTimingFunction=null}};w(e,f,s)}function _(e,t,n,i,r,s,o){e.__x_transition&&(cancelAnimationFrame(e.__x_transition.nextFrame),e.__x_transition.callback&&e.__x_transition.callback());const a=e.__x_original_classes||[],l={start(){e.classList.add(...n)},during(){e.classList.add(...t)},show(){r()},end(){e.classList.remove(...n.filter(e=>!a.includes(e))),e.classList.add(...i)},hide(){s()},cleanup(){e.classList.remove(...t.filter(e=>!a.includes(e))),e.classList.remove(...i.filter(e=>!a.includes(e)))}};w(e,l,o)}function w(e,t,n){e.__x_transition={type:n,callback:O(()=>{t.hide(),e.isConnected&&t.cleanup(),delete e.__x_transition}),nextFrame:null},t.start(),t.during(),e.__x_transition.nextFrame=requestAnimationFrame(()=>{let n=1e3*Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s",""));0===n&&(n=1e3*Number(getComputedStyle(e).animationDuration.replace("s",""))),t.show(),e.__x_transition.nextFrame=requestAnimationFrame(()=>{t.end(),setTimeout(e.__x_transition.callback,n)})})}function E(e){return!isNaN(e)}function O(e){let t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}function k(e,t,i,r,o){s(t,"x-for");let a=A("function"==typeof i?e.evaluateReturnExpression(t,i):i),l=function(e,t,n,i){let r=d(t,e,"if")[0];if(r&&!e.evaluateReturnExpression(t,r.expression))return[];return e.evaluateReturnExpression(t,n.items,i)}(e,t,a,o),c=t;l.forEach((i,s)=>{let u=function(e,t,i,r,s){let o=s?n({},s):{};o[e.item]=t,e.index&&(o[e.index]=i);e.collection&&(o[e.collection]=r);return o}(a,i,s,l,o()),f=function(e,t,n,i){let r=d(t,e,"bind").filter(e=>"key"===e.value)[0];return r?e.evaluateReturnExpression(t,r.expression,()=>i):n}(e,t,s,u),m=function(e,t){if(!e)return;if(e.__x_for_key===t)return e;let n=e;for(;n;){if(n.__x_for_key===t)return n.parentElement.insertBefore(n,e);n=!(!n.nextElementSibling||void 0===n.nextElementSibling.__x_for_key)&&n.nextElementSibling}}(c.nextElementSibling,f);m?(delete m.__x_for_key,m.__x_for=u,e.updateElements(m,()=>m.__x_for)):(b(m=function(e,t){let n=document.importNode(e.content,!0);return t.parentElement.insertBefore(n,t.nextElementSibling),t.nextElementSibling}(t,c),()=>{},e,r),m.__x_for=u,e.initializeElements(m,()=>m.__x_for)),(c=m).__x_for_key=f}),function(e,t){var n=!(!e.nextElementSibling||void 0===e.nextElementSibling.__x_for_key)&&e.nextElementSibling;for(;n;){let e=n,i=n.nextElementSibling;y(n,()=>{e.remove()},t),n=!(!i||void 0===i.__x_for_key)&&i}}(c,e)}function A(e){let t=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,n=e.match(/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/);if(!n)return;let i={};i.items=n[2].trim();let r=n[1].trim().replace(/^\(|\)$/g,""),s=r.match(t);return s?(i.item=r.replace(t,"").trim(),i.index=s[1].trim(),s[2]&&(i.collection=s[2].trim())):i.item=r,i}function S(e,t,n,r,s,a,l){var c=e.evaluateReturnExpression(t,r,s);if("value"===n){if(me.ignoreFocusedForValueBinding&&document.activeElement.isSameNode(t))return;if(void 0===c&&r.match(/\./)&&(c=""),"radio"===t.type)void 0===t.attributes.value&&"bind"===a?t.value=c:"bind"!==a&&(t.checked=t.value==c);else if("checkbox"===t.type)"string"==typeof c&&"bind"===a?t.value=c:"bind"!==a&&(Array.isArray(c)?t.checked=c.some(e=>e==t.value):t.checked=!!c);else if("SELECT"===t.tagName)!function(e,t){const n=[].concat(t).map(e=>e+"");Array.from(e.options).forEach(e=>{e.selected=n.includes(e.value||e.text)})}(t,c);else{if(t.value===c)return;t.value=c}}else if("class"===n)if(Array.isArray(c)){const e=t.__x_original_classes||[];t.setAttribute("class",i(e.concat(c)).join(" "))}else if("object"==typeof c){Object.keys(c).sort((e,t)=>c[e]-c[t]).forEach(e=>{c[e]?p(e).forEach(e=>t.classList.add(e)):p(e).forEach(e=>t.classList.remove(e))})}else{const e=t.__x_original_classes||[],n=p(c);t.setAttribute("class",i(e.concat(n)).join(" "))}else n=l.includes("camel")?o(n):n,[null,void 0,!1].includes(c)?t.removeAttribute(n):!function(e){return["disabled","checked","required","readonly","hidden","open","selected","autofocus","itemscope","multiple","novalidate","allowfullscreen","allowpaymentrequest","formnovalidate","autoplay","controls","loop","muted","playsinline","default","ismap","reversed","async","defer","nomodule"].includes(e)}(n)?$(t,n,c):$(t,n,n)}function $(e,t,n){e.getAttribute(t)!=n&&e.setAttribute(t,n)}function P(e,t,n,i,r,s={}){const l={passive:i.includes("passive")};if(i.includes("camel")&&(n=o(n)),i.includes("away")){let o=a=>{t.contains(a.target)||t.offsetWidth<1&&t.offsetHeight<1||(C(e,r,a,s),i.includes("once")&&document.removeEventListener(n,o,l))};document.addEventListener(n,o,l)}else{let o=i.includes("window")?window:i.includes("document")?document:t,c=a=>{if(o!==window&&o!==document||document.body.contains(t)){if(!(function(e){return["keydown","keyup"].includes(e)}(n)&&function(e,t){let n=t.filter(e=>!["window","document","prevent","stop"].includes(e));if(n.includes("debounce")){let e=n.indexOf("debounce");n.splice(e,E((n[e+1]||"invalid-wait").split("ms")[0])?2:1)}if(0===n.length)return!1;if(1===n.length&&n[0]===D(e.key))return!1;const i=["ctrl","shift","alt","meta","cmd","super"].filter(e=>n.includes(e));if(n=n.filter(e=>!i.includes(e)),i.length>0){const t=i.filter(t=>("cmd"!==t&&"super"!==t||(t="meta"),e[`${t}Key`]));if(t.length===i.length&&n[0]===D(e.key))return!1}return!0}(a,i)||(i.includes("prevent")&&a.preventDefault(),i.includes("stop")&&a.stopPropagation(),i.includes("self")&&a.target!==t))){C(e,r,a,s).then(e=>{!1===e?a.preventDefault():i.includes("once")&&o.removeEventListener(n,c,l)})}}else o.removeEventListener(n,c,l)};if(i.includes("debounce")){let e=i[i.indexOf("debounce")+1]||"invalid-wait",t=E(e.split("ms")[0])?Number(e.split("ms")[0]):250;c=a(c,t)}o.addEventListener(n,c,l)}}function C(e,t,i,r){return e.evaluateCommandExpression(i.target,t,()=>n(n({},r()),{},{$event:i}))}function D(e){switch(e){case"/":return"slash";case" ":case"Spacebar":return"space";default:return e&&e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[_\s]/,"-").toLowerCase()}}function j(e,t,n){return"radio"===e.type&&(e.hasAttribute("name")||e.setAttribute("name",n)),(n,i)=>{if(n instanceof CustomEvent&&n.detail)return n.detail;if("checkbox"===e.type){if(Array.isArray(i)){const e=t.includes("number")?T(n.target.value):n.target.value;return n.target.checked?i.concat([e]):i.filter(t=>t!==e)}return n.target.checked}if("select"===e.tagName.toLowerCase()&&e.multiple)return t.includes("number")?Array.from(n.target.selectedOptions).map(e=>{return T(e.value||e.text)}):Array.from(n.target.selectedOptions).map(e=>e.value||e.text);{const e=n.target.value;return t.includes("number")?T(e):t.includes("trim")?e.trim():e}}}function T(e){const t=e?parseFloat(e):null;return E(t)?t:e}const{isArray:L}=Array,{getPrototypeOf:N,create:z,defineProperty:R,defineProperties:F,isExtensible:I,getOwnPropertyDescriptor:M,getOwnPropertyNames:B,getOwnPropertySymbols:U,preventExtensions:q,hasOwnProperty:W}=Object,{push:K,concat:G,map:H}=Array.prototype;function V(e){return void 0===e}function Z(e){return"function"==typeof e}const J=new WeakMap;function Q(e,t){J.set(e,t)}const X=e=>J.get(e)||e;function Y(e,t){return e.valueIsObservable(t)?e.getProxy(t):t}function ee(e,t,n){G.call(B(n),U(n)).forEach(i=>{let r=M(n,i);r.configurable||(r=ue(e,r,Y)),R(t,i,r)}),q(t)}class te{constructor(e,t){this.originalTarget=t,this.membrane=e}get(e,t){const{originalTarget:n,membrane:i}=this,r=n[t],{valueObserved:s}=i;return s(n,t),i.getProxy(r)}set(e,t,n){const{originalTarget:i,membrane:{valueMutated:r}}=this;return i[t]!==n?(i[t]=n,r(i,t)):"length"===t&&L(i)&&r(i,t),!0}deleteProperty(e,t){const{originalTarget:n,membrane:{valueMutated:i}}=this;return delete n[t],i(n,t),!0}apply(e,t,n){}construct(e,t,n){}has(e,t){const{originalTarget:n,membrane:{valueObserved:i}}=this;return i(n,t),t in n}ownKeys(e){const{originalTarget:t}=this;return G.call(B(t),U(t))}isExtensible(e){const t=I(e);if(!t)return t;const{originalTarget:n,membrane:i}=this,r=I(n);return r||ee(i,e,n),r}setPrototypeOf(e,t){}getPrototypeOf(e){const{originalTarget:t}=this;return N(t)}getOwnPropertyDescriptor(e,t){const{originalTarget:n,membrane:i}=this,{valueObserved:r}=this.membrane;r(n,t);let s=M(n,t);if(V(s))return s;const o=M(e,t);return V(o)?((s=ue(i,s,Y)).configurable||R(e,t,s),s):o}preventExtensions(e){const{originalTarget:t,membrane:n}=this;return ee(n,e,t),q(t),!0}defineProperty(e,t,n){const{originalTarget:i,membrane:r}=this,{valueMutated:s}=r,{configurable:o}=n;if(W.call(n,"writable")&&!W.call(n,"value")){const e=M(i,t);n.value=e.value}return R(i,t,function(e){return W.call(e,"value")&&(e.value=X(e.value)),e}(n)),!1===o&&R(e,t,ue(r,n,Y)),s(i,t),!0}}function ne(e,t){return e.valueIsObservable(t)?e.getReadOnlyProxy(t):t}class ie{constructor(e,t){this.originalTarget=t,this.membrane=e}get(e,t){const{membrane:n,originalTarget:i}=this,r=i[t],{valueObserved:s}=n;return s(i,t),n.getReadOnlyProxy(r)}set(e,t,n){return!1}deleteProperty(e,t){return!1}apply(e,t,n){}construct(e,t,n){}has(e,t){const{originalTarget:n,membrane:{valueObserved:i}}=this;return i(n,t),t in n}ownKeys(e){const{originalTarget:t}=this;return G.call(B(t),U(t))}setPrototypeOf(e,t){}getOwnPropertyDescriptor(e,t){const{originalTarget:n,membrane:i}=this,{valueObserved:r}=i;r(n,t);let s=M(n,t);if(V(s))return s;const o=M(e,t);return V(o)?(s=ue(i,s,ne),W.call(s,"set")&&(s.set=void 0),s.configurable||R(e,t,s),s):o}preventExtensions(e){return!1}defineProperty(e,t,n){return!1}}function re(e){let t=void 0;return L(e)?t=[]:"object"==typeof e&&(t={}),t}const se=Object.prototype;function oe(e){if(null===e)return!1;if("object"!=typeof e)return!1;if(L(e))return!0;const t=N(e);return t===se||null===t||null===N(t)}const ae=(e,t)=>{},le=(e,t)=>{},ce=e=>e;function ue(e,t,n){const{set:i,get:r}=t;return W.call(t,"value")?t.value=n(e,t.value):(V(r)||(t.get=function(){return n(e,r.call(X(this)))}),V(i)||(t.set=function(t){i.call(X(this),e.unwrapProxy(t))})),t}class de{constructor(e){if(this.valueDistortion=ce,this.valueMutated=le,this.valueObserved=ae,this.valueIsObservable=oe,this.objectGraph=new WeakMap,!V(e)){const{valueDistortion:t,valueMutated:n,valueObserved:i,valueIsObservable:r}=e;this.valueDistortion=Z(t)?t:ce,this.valueMutated=Z(n)?n:le,this.valueObserved=Z(i)?i:ae,this.valueIsObservable=Z(r)?r:oe}}getProxy(e){const t=X(e),n=this.valueDistortion(t);if(this.valueIsObservable(n)){const i=this.getReactiveState(t,n);return i.readOnly===e?e:i.reactive}return n}getReadOnlyProxy(e){e=X(e);const t=this.valueDistortion(e);return this.valueIsObservable(t)?this.getReactiveState(e,t).readOnly:t}unwrapProxy(e){return X(e)}getReactiveState(e,t){const{objectGraph:n}=this;let i=n.get(t);if(i)return i;const r=this;return i={get reactive(){const n=new te(r,t),i=new Proxy(re(t),n);return Q(i,e),R(this,"reactive",{value:i}),i},get readOnly(){const n=new ie(r,t),i=new Proxy(re(t),n);return Q(i,e),R(this,"readOnly",{value:i}),i}},n.set(t,i),i}}class fe{constructor(e,t=null){this.$el=e;const n=this.$el.getAttribute("x-data"),i=""===n?"{}":n,r=this.$el.getAttribute("x-init");let s={$el:this.$el},o=t?t.$el:this.$el;Object.entries(me.magicProperties).forEach(([e,t])=>{Object.defineProperty(s,`$${e}`,{get:function(){return t(o)}})}),this.unobservedData=t?t.getUnobservedData():l(i,s);let{membrane:a,data:c}=this.wrapDataInObservable(this.unobservedData);var u;this.$data=c,this.membrane=a,this.unobservedData.$el=this.$el,this.unobservedData.$refs=this.getRefsProxy(),this.nextTickStack=[],this.unobservedData.$nextTick=(e=>{this.nextTickStack.push(e)}),this.watchers={},this.unobservedData.$watch=((e,t)=>{this.watchers[e]||(this.watchers[e]=[]),this.watchers[e].push(t)}),Object.entries(me.magicProperties).forEach(([e,t])=>{Object.defineProperty(this.unobservedData,`$${e}`,{get:function(){return t(o)}})}),this.showDirectiveStack=[],this.showDirectiveLastElement,t||me.onBeforeComponentInitializeds.forEach(e=>e(this)),r&&!t&&(this.pauseReactivity=!0,u=this.evaluateReturnExpression(this.$el,r),this.pauseReactivity=!1),this.initializeElements(this.$el),this.listenForNewElementsToInitialize(),"function"==typeof u&&u.call(this.$data),t||setTimeout(()=>{me.onComponentInitializeds.forEach(e=>e(this))},0)}getUnobservedData(){return function(e,t){let n=e.unwrapProxy(t),i={};return Object.keys(n).forEach(e=>{["$el","$refs","$nextTick","$watch"].includes(e)||(i[e]=n[e])}),i}(this.membrane,this.$data)}wrapDataInObservable(e){var t=this;let n=a(function(){t.updateElements(t.$el)},0);return function(e,t){let n=new de({valueMutated(e,n){t(e,n)}});return{data:n.getProxy(e),membrane:n}}(e,(e,i)=>{t.watchers[i]?t.watchers[i].forEach(t=>t(e[i])):Object.keys(t.watchers).filter(e=>e.includes(".")).forEach(n=>{let r=n.split(".");i===r[r.length-1]&&r.reduce((r,s)=>(Object.is(e,r)&&t.watchers[n].forEach(t=>t(e[i])),r[s]),t.getUnobservedData())}),t.pauseReactivity||n()})}walkAndSkipNestedComponents(e,t,n=(()=>{})){!function e(t,n){if(!1===n(t))return;let i=t.firstElementChild;for(;i;)e(i,n),i=i.nextElementSibling}(e,e=>e.hasAttribute("x-data")&&!e.isSameNode(this.$el)?(e.__x||n(e),!1):t(e))}initializeElements(e,t=(()=>{})){this.walkAndSkipNestedComponents(e,e=>void 0===e.__x_for_key&&(void 0===e.__x_inserted_me&&void this.initializeElement(e,t)),e=>{e.__x=new fe(e)}),this.executeAndClearRemainingShowDirectiveStack(),this.executeAndClearNextTickStack(e)}initializeElement(e,t){e.hasAttribute("class")&&d(e,this).length>0&&(e.__x_original_classes=p(e.getAttribute("class"))),this.registerListeners(e,t),this.resolveBoundAttributes(e,!0,t)}updateElements(e,t=(()=>{})){this.walkAndSkipNestedComponents(e,e=>{if(void 0!==e.__x_for_key&&!e.isSameNode(this.$el))return!1;this.updateElement(e,t)},e=>{e.__x=new fe(e)}),this.executeAndClearRemainingShowDirectiveStack(),this.executeAndClearNextTickStack(e)}executeAndClearNextTickStack(e){e===this.$el&&this.nextTickStack.length>0&&requestAnimationFrame(()=>{for(;this.nextTickStack.length>0;)this.nextTickStack.shift()()})}executeAndClearRemainingShowDirectiveStack(){this.showDirectiveStack.reverse().map(e=>new Promise(t=>{e(e=>{t(e)})})).reduce((e,t)=>e.then(()=>t.then(e=>e())),Promise.resolve(()=>{})),this.showDirectiveStack=[],this.showDirectiveLastElement=void 0}updateElement(e,t){this.resolveBoundAttributes(e,!1,t)}registerListeners(e,t){d(e,this).forEach(({type:i,value:r,modifiers:s,expression:o})=>{switch(i){case"on":P(this,e,r,s,o,t);break;case"model":!function(e,t,i,r,s){var o="select"===t.tagName.toLowerCase()||["checkbox","radio"].includes(t.type)||i.includes("lazy")?"change":"input";P(e,t,o,i,`${r} = rightSideOfExpression($event, ${r})`,()=>n(n({},s()),{},{rightSideOfExpression:j(t,i,r)}))}(this,e,s,o,t)}})}resolveBoundAttributes(e,t=!1,n){let i=d(e,this);i.forEach(({type:r,value:o,modifiers:a,expression:l})=>{switch(r){case"model":S(this,e,"value",l,n,r,a);break;case"bind":if("template"===e.tagName.toLowerCase()&&"key"===o)return;S(this,e,o,l,n,r,a);break;case"text":var c=this.evaluateReturnExpression(e,l,n);!function(e,t,n){void 0===t&&n.match(/\./)&&(t=""),e.innerText=t}(e,c,l);break;case"html":!function(e,t,n,i){t.innerHTML=e.evaluateReturnExpression(t,n,i)}(this,e,l,n);break;case"show":c=this.evaluateReturnExpression(e,l,n);!function(e,t,n,i,r=!1){const s=()=>{t.style.display="none"},o=()=>{1===t.style.length&&"none"===t.style.display?t.removeAttribute("style"):t.style.removeProperty("display")};if(!0===r)return void(n?o():s());const a=i=>{n?(("none"===t.style.display||t.__x_transition)&&b(t,()=>{o()},e),i(()=>{})):"none"!==t.style.display?y(t,()=>{i(()=>{s()})},e):i(()=>{})};i.includes("immediate")?a(e=>e()):(e.showDirectiveLastElement&&!e.showDirectiveLastElement.contains(t)&&e.executeAndClearRemainingShowDirectiveStack(),e.showDirectiveStack.push(a),e.showDirectiveLastElement=t)}(this,e,c,a,t);break;case"if":if(i.some(e=>"for"===e.type))return;c=this.evaluateReturnExpression(e,l,n);!function(e,t,n,i,r){s(t,"x-if");const o=t.nextElementSibling&&!0===t.nextElementSibling.__x_inserted_me;if(!n||o&&!t.__x_transition)!n&&o&&y(t.nextElementSibling,()=>{t.nextElementSibling.remove()},e,i);else{const n=document.importNode(t.content,!0);t.parentElement.insertBefore(n,t.nextElementSibling),b(t.nextElementSibling,()=>{},e,i),e.initializeElements(t.nextElementSibling,r),t.nextElementSibling.__x_inserted_me=!0}}(this,e,c,t,n);break;case"for":k(this,e,l,t,n);break;case"cloak":e.removeAttribute("x-cloak")}})}evaluateReturnExpression(e,t,i=(()=>{})){return l(t,this.$data,n(n({},i()),{},{$dispatch:this.getDispatchFunction(e)}))}evaluateCommandExpression(e,t,i=(()=>{})){return function(e,t,n={}){if("function"==typeof e)return Promise.resolve(e.call(t,n.$event));let i=Function;if(i=Object.getPrototypeOf(async function(){}).constructor,Object.keys(t).includes(e)){let i=new Function(["dataContext",...Object.keys(n)],`with(dataContext) { return ${e} }`)(t,...Object.values(n));return"function"==typeof i?Promise.resolve(i.call(t,n.$event)):Promise.resolve()}return Promise.resolve(new i(["dataContext",...Object.keys(n)],`with(dataContext) { ${e} }`)(t,...Object.values(n)))}(t,this.$data,n(n({},i()),{},{$dispatch:this.getDispatchFunction(e)}))}getDispatchFunction(e){return(t,n={})=>{e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0}))}}listenForNewElementsToInitialize(){const e=this.$el;new MutationObserver(e=>{for(let t=0;t<e.length;t++){const n=e[t].target.closest("[x-data]");if(n&&n.isSameNode(this.$el)){if("attributes"===e[t].type&&"x-data"===e[t].attributeName){const n=l(e[t].target.getAttribute("x-data")||"{}",{$el:this.$el});Object.keys(n).forEach(e=>{this.$data[e]!==n[e]&&(this.$data[e]=n[e])})}e[t].addedNodes.length>0&&e[t].addedNodes.forEach(e=>{1!==e.nodeType||e.__x_inserted_me||(!e.matches("[x-data]")||e.__x?this.initializeElements(e):e.__x=new fe(e))})}}}).observe(e,{childList:!0,attributes:!0,subtree:!0})}getRefsProxy(){var e=this;return new Proxy({},{get(t,n){return"$isAlpineProxy"===n||(e.walkAndSkipNestedComponents(e.$el,e=>{e.hasAttribute("x-ref")&&e.getAttribute("x-ref")===n&&(i=e)}),i);var i}})}}const me={version:"2.6.0",pauseMutationObserver:!1,magicProperties:{},onComponentInitializeds:[],onBeforeComponentInitializeds:[],ignoreFocusedForValueBinding:!1,start:async function(){r()||await new Promise(e=>{"loading"==document.readyState?document.addEventListener("DOMContentLoaded",e):e()}),this.discoverComponents(e=>{this.initializeComponent(e)}),document.addEventListener("turbolinks:load",()=>{this.discoverUninitializedComponents(e=>{this.initializeComponent(e)})}),this.listenForNewUninitializedComponentsAtRunTime(e=>{this.initializeComponent(e)})},discoverComponents:function(e){document.querySelectorAll("[x-data]").forEach(t=>{e(t)})},discoverUninitializedComponents:function(e,t=null){const n=(t||document).querySelectorAll("[x-data]");Array.from(n).filter(e=>void 0===e.__x).forEach(t=>{e(t)})},listenForNewUninitializedComponentsAtRunTime:function(e){const t=document.querySelector("body");new MutationObserver(e=>{if(!this.pauseMutationObserver)for(let t=0;t<e.length;t++)e[t].addedNodes.length>0&&e[t].addedNodes.forEach(e=>{1===e.nodeType&&(e.parentElement&&e.parentElement.closest("[x-data]")||this.discoverUninitializedComponents(e=>{this.initializeComponent(e)},e.parentElement))})}).observe(t,{childList:!0,attributes:!0,subtree:!0})},initializeComponent:function(e){if(!e.__x)try{e.__x=new fe(e)}catch(e){setTimeout(()=>{throw e},0)}},clone:function(e,t){t.__x||(t.__x=new fe(t,e))},addMagicProperty:function(e,t){this.magicProperties[e]=t},onComponentInitialized:function(e){this.onComponentInitializeds.push(e)},onBeforeComponentInitialized:function(e){this.onBeforeComponentInitializeds.push(e)}};return r()||(window.Alpine=me,window.deferLoadingAlpine?window.deferLoadingAlpine(function(){window.Alpine.start()}):window.Alpine.start()),me});
8
- //# sourceMappingURL=/sm/54d8acf4bec59c2ac38179fad55c741f03c418f9ea483b114454c0827631f4ba.map
@@ -1,151 +0,0 @@
1
- /* Layout. */
2
- body {
3
- padding: 0.5rem;
4
- background: #C9D2E6;
5
- font-family: 'Roboto', sans-serif;
6
- }
7
-
8
- .container {
9
- margin: 0 auto;
10
- max-width: 1000px;
11
- padding: 2rem;
12
- background: white;
13
- }
14
-
15
- /* Header. */
16
- #logo {
17
- display: block;
18
- margin: 0 auto;
19
- max-width: 100px;
20
- }
21
-
22
- /* Structure */
23
- ul.classes,
24
- ul.methods,
25
- ul.controls,
26
- ul.reflections {
27
- padding-left: 0;
28
- }
29
-
30
- li.class-container,
31
- li.method-container {
32
- list-style: none;
33
- padding: 1rem;
34
- border: 5px solid #dadcdc;
35
- }
36
-
37
- /* State. */
38
- .status-row {
39
- width: 100%;
40
- display: flex;
41
- align-items: center;
42
- flex-direction: row;
43
- color: white;
44
- background: #A9B6D2;
45
- }
46
- .status-row.pass {
47
- background: #008C32;
48
- }
49
- .status-row.fail {
50
- background: #D04700;
51
- }
52
-
53
- /* Buttons. */
54
- .method .buttons {
55
- margin-left: auto;
56
- margin-right: 1rem;
57
- }
58
- .buttons button {
59
- padding: 1rem 2rem;
60
- }
61
-
62
- /* Stats. */
63
- .class .stats {
64
- margin-left: auto;
65
- }
66
- .stat {
67
- color: #efefef;
68
- font-size: 3.5rem;
69
- font-family: 'Merriweather', serif;
70
- }
71
-
72
- /* Class. */
73
- .class {
74
- padding: 2rem;
75
- margin-bottom: 1rem;
76
- }
77
- .class:hover {
78
- cursor: pointer;
79
- }
80
- .class h2 {
81
- margin: 0;
82
- }
83
-
84
- /* Method. */
85
- .method {
86
- padding: 2rem;
87
- margin-left: 1rem;
88
- margin-bottom: 1rem;
89
- }
90
- .method:hover {
91
- cursor: pointer;
92
- }
93
- .method .stat {
94
- font-size: 2.5rem;
95
- }
96
-
97
- /* Reflection. */
98
- .control,
99
- .reflection {
100
- list-style: none;
101
- margin-left: 2rem;
102
- display: flex;
103
- flex-direction: row;
104
- align-items: center;
105
- background: #EFEFEF;
106
- padding: 0.5rem 1.5rem;
107
- margin-bottom: 0.3rem;
108
- }
109
- .control .time,
110
- .reflection .time {
111
- color: #777777;
112
- margin-right: 2rem;
113
- }
114
-
115
- .info {
116
- display: flex;
117
- flex-direction: row;
118
- align-items: center;
119
- padding: 0.5rem 1rem;
120
- border: 1px solid #aaa;
121
- border-radius: 5px;
122
- }
123
- .info:not(:last-child) {
124
- margin-right: 0.5rem;
125
- }
126
- .info h4 {
127
- margin: 0;
128
- color: #777777;
129
- font-size: 1.2rem;
130
- font-weight: normal;
131
- }
132
-
133
- .info-items {
134
- display: flex;
135
- flex-direction: row;
136
- }
137
- .info-item {
138
- padding-left: 1rem;
139
- padding-right: 1rem;
140
- border-right: 1px solid #ccc;
141
- }
142
- .info-item:last-of-type {
143
- padding-right: 0;
144
- border-right: 0;
145
- }
146
- .info-item strong {
147
- padding-bottom: 0.1rem;
148
- }
149
- .info-item pre {
150
- margin: 0;
151
- }