reflekt 0.9.6 → 1.0.1

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,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
- }