diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e08e634
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,142 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+.env.production
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+# random
+.DS_STORE
+
+# Generated by Cargo
+# will have compiled files and executables
+debug/
+target/
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
+Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
+
+# MSVC Windows builds of rustc generate these, which store debugging information
+*.pdb
+
+
+# dfx
+.dfx/
+scripts/
+canister_ids.json
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..c9d3354
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,9 @@
+[workspace]
+members = [
+ "src/ic_loot_rs",
+]
+
+[profile.release]
+lto = true
+opt-level = 'z'
+codegen-units = 1
\ No newline at end of file
diff --git a/dfx.json b/dfx.json
new file mode 100644
index 0000000..4b3bc94
--- /dev/null
+++ b/dfx.json
@@ -0,0 +1,34 @@
+{
+ "version": 1,
+ "canisters": {
+ "ic_loot_rs": {
+ "type": "custom",
+ "candid": "src/ic_loot_rs/ic_loot.did",
+ "wasm": "target/wasm32-unknown-unknown/release/ic_loot_rs.wasm",
+ "build": "cargo build --target wasm32-unknown-unknown --release --package ic_loot_rs"
+ },
+ "ic_loot_assets": {
+ "dependencies": [
+ "ic_loot_rs"
+ ],
+ "frontend": {
+ "entrypoint": "dist/index.html"
+ },
+ "source": [
+ "dist/"
+ ],
+ "type": "assets"
+ }
+ },
+ "dfx": "0.8.1",
+ "defaults": {
+ "build": {
+ "output": "canisters/"
+ },
+ "start": {
+ "address": "127.0.0.1",
+ "port": 8000,
+ "serve_root": "canisters/eeoo/assets"
+ }
+ }
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..a5abcf5
--- /dev/null
+++ b/index.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+ IC DRIP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..2f669f6
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1501 @@
+{
+ "name": "ic_loot",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@antfu/utils": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.2.4.tgz",
+ "integrity": "sha512-2bZNkVfL9IZESmvE26UKi8SzyvSoaIsGXDcnbHFMtmGMqUiB1fXpAJ1ijGf+tSqKRQ5yagck2U1Qk0p+705/kw==",
+ "dev": true,
+ "requires": {
+ "@types/throttle-debounce": "^2.1.0"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g=="
+ },
+ "@babel/parser": {
+ "version": "7.15.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz",
+ "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg=="
+ },
+ "@babel/types": {
+ "version": "7.15.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz",
+ "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.9",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@dfinity/agent": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.10.0.tgz",
+ "integrity": "sha512-wRXZ54spejA6K74Gn5g0sdtf2nSi6B2gTpx+D/WxqQKDvZbtkp8AOT+zhH5o+UQILrchZgq40pCzOWpy2W01mQ==",
+ "requires": {
+ "base64-arraybuffer": "^0.2.0",
+ "bignumber.js": "^9.0.0",
+ "borc": "^2.1.1",
+ "js-sha256": "0.9.0",
+ "simple-cbor": "^0.4.1"
+ }
+ },
+ "@dfinity/auth-client": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-0.10.0.tgz",
+ "integrity": "sha512-Po6TLXWOmytH7t9wuzeJ+FiM7rUmRGStCDAnbhpSAGstTtOh2HheTXIVgpwv3XFbUgkdOjpI3lNsG+G1kNm/1Q=="
+ },
+ "@dfinity/candid": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.10.0.tgz",
+ "integrity": "sha512-APU9Qefk6fhTVsKaltxDP1tlg5Gy41XlCMZWbDGHH7UTKJdmEEpylUWgSwn/AzMZCMWoF3PXt2kyq7OijVy01g=="
+ },
+ "@dfinity/identity": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-0.10.0.tgz",
+ "integrity": "sha512-0KUAcP/s5j/3q8uWXAFbE5dWuxf9xSack6OYkSa5LGGdJ/s3DCwrgb0bPzYEX2CeIqNUG3x8/YwUZrMNWBxvNQ==",
+ "requires": {
+ "borc": "^2.1.1",
+ "js-sha256": "^0.9.0",
+ "secp256k1": "^4.0.2",
+ "tweetnacl": "^1.0.1"
+ }
+ },
+ "@dfinity/principal": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.10.0.tgz",
+ "integrity": "sha512-SvlsLDLpqDQFqmTWttLWKR1D5XODmT7BmTN9QdEx+Q8x9Zxcm9K5EJevuXhe9bAAAorwgRK+vg5riF4+hW7fAw=="
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@trust/keyto": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/@trust/keyto/-/keyto-0.3.7.tgz",
+ "integrity": "sha512-t5kWWCTkPgg24JWVuCTPMx7l13F7YHdxBeJkT1vmoHjROgiOIEAN8eeY+iRmP1Hwsx+S7U55HyuqSsECr08a8A==",
+ "requires": {
+ "asn1.js": "^5.0.1",
+ "base64url": "^3.0.1",
+ "elliptic": "^6.4.1"
+ }
+ },
+ "@trust/webcrypto": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@trust/webcrypto/-/webcrypto-0.9.2.tgz",
+ "integrity": "sha512-5iMAVcGYKhqLJGjefB1nzuQSqUJTru0nG4CytpBT/GGp1Piz/MVnj2jORdYf4JBYzggCIa8WZUr2rchP2Ngn/w==",
+ "requires": {
+ "@trust/keyto": "^0.3.4",
+ "base64url": "^3.0.0",
+ "elliptic": "^6.4.0",
+ "node-rsa": "^0.4.0",
+ "text-encoding": "^0.6.1"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.48",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz",
+ "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew=="
+ },
+ "@types/throttle-debounce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz",
+ "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==",
+ "dev": true
+ },
+ "@vitejs/plugin-vue": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.6.1.tgz",
+ "integrity": "sha512-tX2Ju8fOyEtfstfmwjfSJcstTFXwzdFAUbYJ5bWWifvKIgbe6B0FbM8l3Wb7wOaaxKn4FYkii7WQnAPcsTqaIA=="
+ },
+ "@vue/compiler-core": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.9.tgz",
+ "integrity": "sha512-smi76K+pg1LeltWSLoOI9GqXdH1oK13sd+SrO/XTdyfvf2dOQn5zE0o+C4B4Wj9M8Jd66Z5dEfGEldvcOutixQ==",
+ "requires": {
+ "@babel/parser": "^7.15.0",
+ "@babel/types": "^7.15.0",
+ "@vue/shared": "3.2.9",
+ "estree-walker": "^2.0.2",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-dom": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.9.tgz",
+ "integrity": "sha512-7GAMoCyBGMzMsbzxxFFCQMdblg10NRXkgFFhkjLJ4djItL0hyeO8t9wSLmaDaJejo1xjK8lm+4xPAUwvHuC8cA==",
+ "requires": {
+ "@vue/compiler-core": "3.2.9",
+ "@vue/shared": "3.2.9"
+ }
+ },
+ "@vue/compiler-sfc": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.9.tgz",
+ "integrity": "sha512-egQCUOvb+3fz7sNx5F85ysPslbbtHiw0l2hOlqSGx5S7vQ8nzPvhxjy/VATYbd4lHZGQltA/3U090ncZu8M6hQ==",
+ "requires": {
+ "@babel/parser": "^7.15.0",
+ "@babel/types": "^7.15.0",
+ "@types/estree": "^0.0.48",
+ "@vue/compiler-core": "3.2.9",
+ "@vue/compiler-dom": "3.2.9",
+ "@vue/compiler-ssr": "3.2.9",
+ "@vue/ref-transform": "3.2.9",
+ "@vue/shared": "3.2.9",
+ "consolidate": "^0.16.0",
+ "estree-walker": "^2.0.2",
+ "hash-sum": "^2.0.0",
+ "lru-cache": "^5.1.1",
+ "magic-string": "^0.25.7",
+ "merge-source-map": "^1.1.0",
+ "postcss": "^8.1.10",
+ "postcss-modules": "^4.0.0",
+ "postcss-selector-parser": "^6.0.4",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-ssr": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.9.tgz",
+ "integrity": "sha512-3QhSnpmMKvM67VQeUttDVy6+BeWlpo1mTqSnEl2x1bIEXNfZ6aIWeV42YmItXfiJ0j+JZI/29sDiEl3QLhAHow==",
+ "requires": {
+ "@vue/compiler-dom": "3.2.9",
+ "@vue/shared": "3.2.9"
+ }
+ },
+ "@vue/reactivity": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.9.tgz",
+ "integrity": "sha512-V0me78KlETt/9u3S9BoViEZNCFr/fDWodLq/KqYbFj+YySnCDD0clmjgBSQvIM63D+z3iUXftJyv08vAjlWrvw==",
+ "requires": {
+ "@vue/shared": "3.2.9"
+ }
+ },
+ "@vue/ref-transform": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.9.tgz",
+ "integrity": "sha512-sKNJZlVWW9s0+Xy8WVaGZTX8jVXvkY85ooDTv21ryAS0gzQ4PzHUvqQFQSgtZSbszU2/Qpi13u2h5oZBBYFm8g==",
+ "requires": {
+ "@babel/parser": "^7.15.0",
+ "@vue/compiler-core": "3.2.9",
+ "@vue/shared": "3.2.9",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7"
+ }
+ },
+ "@vue/runtime-core": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.9.tgz",
+ "integrity": "sha512-CaSjy/kBrSFtSwyW2sY7RTN5YGmcDg8xLzKmFmIrkI9AXv/YjViQjSKUNHTAhnGq0K739vhFO4r3meBNEWqiOw==",
+ "requires": {
+ "@vue/reactivity": "3.2.9",
+ "@vue/shared": "3.2.9"
+ }
+ },
+ "@vue/runtime-dom": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.9.tgz",
+ "integrity": "sha512-Vi8eOaP7/8NYSWIl8/klPtkiI+IQq/gPAI77U7PVoJ22tTcK/+9IIrMEN2TD+jUkHTRRIymMECEv+hWQT1Mo1g==",
+ "requires": {
+ "@vue/runtime-core": "3.2.9",
+ "@vue/shared": "3.2.9",
+ "csstype": "^2.6.8"
+ }
+ },
+ "@vue/shared": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.9.tgz",
+ "integrity": "sha512-+CifxkLVhjKT14g/LMZil8//SdCzkMkS8VfRX0cqNJiFKK4AWvxj0KV1dhbr8czikY0DZUGQew3tRMRRChMGtA=="
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
+ },
+ "asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "base64-arraybuffer": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
+ "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ=="
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "base64url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
+ "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A=="
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+ },
+ "bignumber.js": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
+ "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "borc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz",
+ "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==",
+ "requires": {
+ "bignumber.js": "^9.0.0",
+ "buffer": "^5.5.0",
+ "commander": "^2.15.0",
+ "ieee754": "^1.1.13",
+ "iso-url": "~0.4.7",
+ "json-text-sequence": "~0.1.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "cac": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.3.tgz",
+ "integrity": "sha512-ECVqVZh74qgSuZG9YOt2OJPI3wGcf+EwwuF/XIOYqZBD0KZYLtgPWqFPxmDPQ6joxI1nOlvVgRV6VT53Ooyocg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "colorette": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz",
+ "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w=="
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "consolidate": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz",
+ "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==",
+ "requires": {
+ "bluebird": "^3.7.2"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+ },
+ "csstype": {
+ "version": "2.6.17",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz",
+ "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A=="
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "delimit-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz",
+ "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs="
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+ },
+ "esbuild": {
+ "version": "0.12.25",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.25.tgz",
+ "integrity": "sha512-woie0PosbRSoN8gQytrdCzUbS2ByKgO8nD1xCZkEup3D9q92miCze4PqEI9TZDYAuwn6CruEnQpJxgTRWdooAg=="
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "fast-glob": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
+ "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ }
+ },
+ "fastq": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
+ "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "generic-names": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz",
+ "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==",
+ "requires": {
+ "loader-utils": "^1.1.0"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globby": {
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
+ "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg=="
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0="
+ },
+ "icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true
+ },
+ "import-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+ "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+ "dev": true,
+ "requires": {
+ "import-from": "^3.0.0"
+ }
+ },
+ "import-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+ "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz",
+ "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "iso-url": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz",
+ "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog=="
+ },
+ "jiti": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.11.0.tgz",
+ "integrity": "sha512-/2c7e61hxxTIN34UeHBB0LCJ5Tq64kgJDV7GR+++e8XRxCKRIKmB8tH6ww1W+Z6Kgd6By+C3RSCu1lXjbPT68A==",
+ "dev": true
+ },
+ "joycon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.0.1.tgz",
+ "integrity": "sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==",
+ "dev": true
+ },
+ "js-sha256": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
+ "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
+ },
+ "json-text-sequence": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz",
+ "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=",
+ "requires": {
+ "delimit-stream": "0.1.0"
+ }
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "lilconfig": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz",
+ "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==",
+ "dev": true
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
+ },
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.25.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+ "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "requires": {
+ "sourcemap-codec": "^1.4.4"
+ }
+ },
+ "merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "requires": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "nanoid": {
+ "version": "3.1.25",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
+ "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q=="
+ },
+ "node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "node-gyp-build": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
+ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
+ },
+ "node-modules-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
+ "dev": true
+ },
+ "node-rsa": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz",
+ "integrity": "sha1-1jkXKewWqDDtWjgEKzFX0tXXJTA=",
+ "requires": {
+ "asn1": "0.2.3"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true
+ },
+ "pirates": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+ "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+ "dev": true,
+ "requires": {
+ "node-modules-regexp": "^1.0.0"
+ }
+ },
+ "postcss": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz",
+ "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==",
+ "requires": {
+ "colorette": "^1.2.2",
+ "nanoid": "^3.1.23",
+ "source-map-js": "^0.6.2"
+ }
+ },
+ "postcss-load-config": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz",
+ "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==",
+ "dev": true,
+ "requires": {
+ "import-cwd": "^3.0.0",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ }
+ },
+ "postcss-modules": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.2.2.tgz",
+ "integrity": "sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==",
+ "requires": {
+ "generic-names": "^2.0.1",
+ "icss-replace-symbols": "^1.1.0",
+ "lodash.camelcase": "^4.3.0",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "string-hash": "^1.1.1"
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw=="
+ },
+ "postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "requires": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "requires": {
+ "icss-utils": "^5.0.0"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+ "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "requires": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rollup": {
+ "version": "2.56.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz",
+ "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==",
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "secp256k1": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
+ "requires": {
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "simple-cbor": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz",
+ "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w=="
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-js": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
+ "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug=="
+ },
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+ },
+ "string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs="
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "sucrase": {
+ "version": "3.20.1",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.20.1.tgz",
+ "integrity": "sha512-BIG59HaJOxNct9Va6KvT5yzBA/rcMGetzvZyTx0ZdCcspIbpJTPS64zuAfYlJuOj+3WaI5JOdA+F0bJQQi8ZiQ==",
+ "dev": true,
+ "requires": {
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk="
+ },
+ "thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "dev": true,
+ "requires": {
+ "thenify": ">= 3.1.0 < 4"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true
+ },
+ "ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "tsup": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/tsup/-/tsup-4.14.0.tgz",
+ "integrity": "sha512-77rWdzhikTP9mQ34XMRzK83tw++LF6f4ox/HNERlgesB7g6g5VQ1iJlueG9O0P9HAZGVKavUwyoZv0+322p6rg==",
+ "dev": true,
+ "requires": {
+ "cac": "^6.7.2",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.5.1",
+ "debug": "^4.3.1",
+ "esbuild": "^0.12.9",
+ "execa": "^5.0.0",
+ "globby": "^11.0.3",
+ "joycon": "^3.0.1",
+ "postcss-load-config": "^3.0.1",
+ "resolve-from": "^5.0.0",
+ "rollup": "^2.56.1",
+ "sucrase": "^3.18.1",
+ "tree-kill": "^1.2.2"
+ }
+ },
+ "tweetnacl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "vite": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.3.tgz",
+ "integrity": "sha512-1wMDnjflvtTTkMov8O/Xb5+w1/VW/Gw8oCf8f6dqgHn8lMOEqq0SaPtFEQeikFcOKCfSbiU0nEi0LDIx6DNsaQ==",
+ "requires": {
+ "esbuild": "^0.12.17",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.3.6",
+ "resolve": "^1.20.0",
+ "rollup": "^2.38.5"
+ }
+ },
+ "vite-plugin-windicss": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/vite-plugin-windicss/-/vite-plugin-windicss-1.4.1.tgz",
+ "integrity": "sha512-LLWipPvTexLSF0RRFhfNuPiCifKQsfLuyd3y7z27gSBtDPmHOOXwpfEWrAv9oUnMQzXfG93RJ1HVnjk1hUo77Q==",
+ "dev": true,
+ "requires": {
+ "@windicss/plugin-utils": "1.4.1",
+ "chalk": "^4.1.2",
+ "debug": "^4.3.2",
+ "windicss": "^3.1.7"
+ },
+ "dependencies": {
+ "@windicss/config": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@windicss/config/-/config-1.4.1.tgz",
+ "integrity": "sha512-4jWG8sajwfV1pa+igFTwEcJgcrqHqcuxRI96IXIt6SuET3vSkwjP8X+4rBfns7QcR+Thxy6K/kBL0xvZNrJsPQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.2",
+ "jiti": "^1.11.0",
+ "tsup": "^4.14.0",
+ "windicss": "^3.1.7"
+ }
+ },
+ "@windicss/plugin-utils": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@windicss/plugin-utils/-/plugin-utils-1.4.1.tgz",
+ "integrity": "sha512-7gfGroXHH3iHxG6cUakvTjO9ZytxhxUsscc4P++p2Q0KGTh29NnlJci9AQpvO2h+b6+z8VqsDLv1/8ob6hd42g==",
+ "dev": true,
+ "requires": {
+ "@antfu/utils": "^0.2.4",
+ "@windicss/config": "1.4.1",
+ "debug": "^4.3.2",
+ "fast-glob": "^3.2.7",
+ "magic-string": "^0.25.7",
+ "micromatch": "^4.0.4",
+ "windicss": "^3.1.7"
+ }
+ }
+ }
+ },
+ "vue": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.9.tgz",
+ "integrity": "sha512-mqRzh3Qp0Jg66foZz9F70e6xoe/mIjegyPKjC8gXBBfTP3gt4QxA3b8pXtKJRlXk894CteUIhkFnHU8xcobrXA==",
+ "requires": {
+ "@vue/compiler-dom": "3.2.9",
+ "@vue/runtime-dom": "3.2.9",
+ "@vue/shared": "3.2.9"
+ }
+ },
+ "vue-analytics": {
+ "version": "5.22.1",
+ "resolved": "https://registry.npmjs.org/vue-analytics/-/vue-analytics-5.22.1.tgz",
+ "integrity": "sha512-HPKQMN7gfcUqS5SxoO0VxqLRRSPkG1H1FqglsHccz6BatBatNtm/Vyy8brApktZxNCfnAkrSVDpxg3/FNDeOgQ=="
+ },
+ "vue-gtag-next": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/vue-gtag-next/-/vue-gtag-next-1.14.0.tgz",
+ "integrity": "sha512-iJl+cOG2GU5NuxqzSSIpt03WVOvZqyKB9TOy7d55KiuvRklcnb2nlqxW5B/a3/sbIt7fla+XEkRyMCcoz0zAHw=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "windicss": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/windicss/-/windicss-3.1.7.tgz",
+ "integrity": "sha512-Q/HQ9j+r2R0fdt85zAjccdo11kHWzQmpkuwIUQIO6PSypyDmBTfN14aAy4szLrpgo2woyuHM7Y+kir4IG4qnKQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ },
+ "yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..a54efce
--- /dev/null
+++ b/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "ic_loot",
+ "version": "1.0.0",
+ "description": "",
+ "author": "",
+ "scripts": {
+ "build": "vite build",
+ "dev": "vite",
+ "dfx:install": "dfx canister install --all --mode reinstall",
+ "dfx:rebuild": "dfx build && npm run dfx:install",
+ "dfx:setup": "dfx canister create --all && dfx build && npm run dfx:install"
+ },
+ "main": "index.js",
+ "dependencies": {
+ "@dfinity/agent": "^0.10.0",
+ "@dfinity/auth-client": "^0.10.0-beta.1",
+ "@dfinity/candid": "^0.10.0",
+ "@dfinity/identity": "^0.10.0",
+ "@dfinity/principal": "^0.10.0",
+ "@trust/webcrypto": "^0.9.2",
+ "@vitejs/plugin-vue": "^1.6.1",
+ "@vue/compiler-sfc": "^3.2.9",
+ "node-fetch": "^2.3.0",
+ "vite": "^2.5.3",
+ "vue": "^3.0.5",
+ "vue-gtag-next": "^1.14.0"
+ },
+ "devDependencies": {
+ "vite-plugin-windicss": "^1.4.1",
+ "windicss": "^3.1.7"
+ },
+ "license": "ISC"
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..037fe5b
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/ic_drip.png b/public/ic_drip.png
new file mode 100644
index 0000000..71f6854
Binary files /dev/null and b/public/ic_drip.png differ
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..f2e9a70
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,25 @@
+# IC LOOT
+
+An [Internet Computer](https://internetcomputer.org/) version of [Loot Project](https://www.lootproject.com/)
+
+
+## Projects
+----
+### [IC Drip](http://icdrip.io/)
+IC Drip are randomly generated meta-commerce shopping carts for outfits
+and personas stored on chain. Stats, images, and other functionality are
+intentionally omitted for others to interpret. Feel free to use IC Drip in
+any way you want.
+
+
+## Getting Started
+
+1. Install
+
+ ```
+ npm i
+ dfx start
+ npm run dfx:setup
+ ```
+
+2. [http://rrkah-fqaaa-aaaaa-aaaaq-cai.localhost:8000/?tokenId=100](http://rrkah-fqaaa-aaaaa-aaaaq-cai.localhost:8000/?tokenId=100)
\ No newline at end of file
diff --git a/src/ic_loot_assets/App.vue b/src/ic_loot_assets/App.vue
new file mode 100644
index 0000000..3ae7e7a
--- /dev/null
+++ b/src/ic_loot_assets/App.vue
@@ -0,0 +1,68 @@
+
+
+
IC DRIP
+
+
+ IC Drip are randomly generated meta-commerce shopping carts for outfits
+ and personas stored on chain. Stats, images, and other functionality are
+ intentionally omitted for others to interpret. Feel free to use IC Drip in
+ any way you want.
+
+
Example shopping carts:
+
+
Coming Soon...
+
+ an open source
+
Internet Computer
+ project based on the
+
Loot Project
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ic_loot_assets/main.js b/src/ic_loot_assets/main.js
new file mode 100644
index 0000000..9a5584c
--- /dev/null
+++ b/src/ic_loot_assets/main.js
@@ -0,0 +1,19 @@
+import { createApp } from "vue";
+import App from "./App.vue";
+import "virtual:windi.css";
+import VueGtag from "vue-gtag-next";
+
+/**
+ * @dfinity/agent requires this. Can be removed once it's fixed
+ */
+window.global = window;
+
+const app = createApp(App);
+
+app.use(VueGtag, {
+ property: {
+ id: "G-KE88EVJHWW",
+ },
+});
+
+app.mount("#app");
diff --git a/src/ic_loot_rs/Cargo.toml b/src/ic_loot_rs/Cargo.toml
new file mode 100644
index 0000000..ca11896
--- /dev/null
+++ b/src/ic_loot_rs/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "ic_loot_rs"
+version = "0.1.0"
+authors = ["Rick Porter "]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+path = "lib.rs"
+crate-type = ["cdylib"]
+
+[dependencies]
+ic-types = "0.2.1"
+ic-cdk = "0.2.4"
+base64 = "0.13.0"
+ic-cdk-macros = "0.3.0"
+ic-certified-map = "0.1.0"
+libflate = "1"
+num-traits = "0.2.14"
+serde = "1.0.116"
+serde_cbor = "0.11"
+serde_bytes = "0.11"
+serde_with = "1.6.2"
\ No newline at end of file
diff --git a/src/ic_loot_rs/address.rs b/src/ic_loot_rs/address.rs
new file mode 100644
index 0000000..d72853a
--- /dev/null
+++ b/src/ic_loot_rs/address.rs
@@ -0,0 +1,102 @@
+
+
+use ic_cdk::export::{candid::{CandidType, Deserialize}, Principal};
+use std::collections::BTreeMap;
+
+#[derive(Clone, Debug, Default, CandidType, Deserialize)]
+pub struct AddressBook {
+ pub total_supply: u64,
+ pub tokens: BTreeMap,
+ pub controllers: Vec,
+ pub claim_index: u64,
+ pub token_seeds: BTreeMap
+}
+
+
+impl AddressBook {
+
+ pub fn user_tokens(&self, user: &Principal) -> Vec {
+ let mut results: Vec = Vec::new();
+ for (token_id, user_id) in &self.tokens {
+ if user_id == user {
+ results.push(*token_id);
+ }
+ }
+ return results;
+ }
+
+ pub fn owner_of(&self, token_id: &u64) -> Option {
+ match self.tokens.get(token_id) {
+ Some(owner_id) => return Some(owner_id.clone()),
+ None => {
+ return None;
+ }
+ }
+ }
+
+ pub fn is_owner_of(&self, user: Principal, token_id: &u64) -> bool {
+ match self.owner_of(&token_id) {
+ Some(owner_id) => return user == owner_id,
+ None => {
+ return false;
+ }
+ }
+ }
+
+ pub fn is_controller(&self, user: &Principal) -> bool {
+ return self.controllers.contains(user);
+ }
+
+ pub fn add_controller(&mut self, user: &Principal) -> bool {
+ if !self.is_controller(user) {
+ self.controllers.push(user.clone());
+ return true;
+ }
+ return false;
+ }
+
+ pub fn remove_controller(&mut self, user: &Principal) -> bool {
+ if self.is_controller(user) {
+ let index = self.controllers.iter().position(|x| x == user).unwrap();
+ self.controllers.remove(index);
+ return true;
+ }
+ return false;
+ }
+
+ pub fn transfer_to(&mut self, user: Principal, token_id: u64) -> bool {
+ if let Some(token_owner) = self.tokens.get(&token_id) {
+ if token_owner == &ic_cdk::caller() {
+ self.tokens.insert(token_id, user);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ pub fn remaining(&self) -> u64 {
+ return self.total_supply - self.claim_index;
+ }
+
+ pub fn is_claimed(&self, token_id: &u64) -> bool {
+ return self.tokens.contains_key(token_id);
+ }
+
+ pub fn claim(&mut self, user_id: Principal) -> Result {
+
+ if self.claim_index > self.total_supply {
+ return Err("No more claims left".to_string());
+ }
+
+ self.claim_index += 1;
+
+ match self.tokens.get(&self.claim_index) {
+ Some(_) => return Err("Already claimed".to_string()),
+ None => {
+ self.token_seeds.insert(self.claim_index, ic_cdk::api::time() as u64);
+ self.tokens.insert(self.claim_index, user_id);
+ return Ok(self.claim_index);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ic_loot_rs/ic_loot.did b/src/ic_loot_rs/ic_loot.did
new file mode 100644
index 0000000..ad124f7
--- /dev/null
+++ b/src/ic_loot_rs/ic_loot.did
@@ -0,0 +1,49 @@
+type HeaderField = record { text; text; };
+
+type HttpRequest = record {
+ method: text;
+ url: text;
+ headers: vec HeaderField;
+ body: blob;
+};
+
+type HttpResponse = record {
+ status_code: nat16;
+ headers: vec HeaderField;
+ body: blob;
+};
+
+type AddressBook = record {
+ total_supply: nat64;
+ tokens: vec record { nat64; principal};
+ controllers: vec principal;
+ claim_index: nat64;
+ token_seeds: vec record { nat64; nat64};
+};
+
+type ClaimResult = variant {
+ Ok : nat64;
+ Err: text;
+};
+
+service : {
+ http_request: (request: HttpRequest) -> (HttpResponse) query;
+
+ get_address_book: () -> (AddressBook) query;
+ get_token_properties: (nat64) -> (vec record { text; text}) query;
+
+ get_airdrops: () -> (vec record { nat64; bool }) query;
+ add_airdrops: (vec principal) -> (bool);
+ name: () -> (text) query;
+ symbol: () -> (text) query;
+ user_tokens: (principal) -> (vec nat64) query;
+ owner_of: (nat64) -> (opt principal) query;
+ transfer_to: (principal, nat64) -> (bool);
+ claim: () -> (ClaimResult);
+ remaining: () -> (nat64);
+ supply: () -> (nat64);
+
+ get_controllers: () -> (vec principal) query;
+ add_controller: (principal) -> (bool);
+ remove_controller: (principal) -> (bool);
+}
diff --git a/src/ic_loot_rs/lib.rs b/src/ic_loot_rs/lib.rs
new file mode 100644
index 0000000..d2e664f
--- /dev/null
+++ b/src/ic_loot_rs/lib.rs
@@ -0,0 +1,724 @@
+use ic_cdk::export::{candid::{CandidType, Deserialize}, Principal};
+use ic_cdk::storage;
+use ic_cdk_macros::*;
+use serde_bytes::{ByteBuf};
+use std::collections::BTreeMap;
+
+mod loot;
+mod rand;
+mod address;
+
+use crate::address::AddressBook;
+use crate::loot::Loot;
+
+
+#[init]
+fn init() {
+ ic_cdk::println!("Init {:?}", ic_cdk::api::time());
+
+ let address_book = storage::get_mut::();
+ address_book.total_supply = 8000;
+
+ //needs to be a way to pass this into init
+ let owner_id = Principal::from_text(
+ "2c22g-lboam-nseoa-i5al6-o7k6f-o2fwz-huoua-be63r-oi3k2-wy7uq-zae"
+ ).unwrap();
+ address_book.add_controller(&owner_id);
+
+ init_loot();
+}
+
+fn init_loot() -> () {
+
+ let loot = storage::get_mut::();
+
+ loot.weapons = vec![
+ "Cellphone",
+ "Laptop",
+ "Purse",
+ "Cat",
+ "Golf Club",
+ "Spoon",
+ "Beggar Cup",
+ "Wine Glass",
+ "Fidget Spinner",
+ "Massager",
+ "Beer Mug",
+ "TV Controller",
+ "Pillow",
+ "Blanket",
+ "Wand",
+ "Waifu Pillow",
+ "Microphone",
+ "Guitar",
+ "Trumpet",
+ "Banjo",
+ "Cane",
+ "Yo-yo",
+ "Tennis Racket",
+ "Record Player",
+ "Video Game Console",
+ "Umbrella",
+ "Surf Board",
+ "Whip",
+ "Scissors",
+ "Key",
+ "Pen",
+ "Paintbrush",
+ "Megaphone",
+ "Dog Leash",
+ "Book",
+ "Pocket Watch",
+ "Wrench",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.chest = vec![
+ "Robe",
+ "Shirt",
+ "Hoodie",
+ "Fishnet Shirt",
+ "Plastic Shirt",
+ "Polyester Shirt",
+ "Hawaiian Shirt",
+ "Polo Shirt",
+ "Ring Mail",
+ "Blazer",
+ "Vest",
+ "Tank Top",
+ "Button Up",
+ "Bowling Shirt",
+ "Shawl",
+ "Cardigan",
+ "Wind Breaker",
+ "Rain Coat",
+ "Sports Bra",
+ "Graphic Tee",
+ "Body Paint",
+ "Tunic",
+ "Corset",
+ "Sweater",
+ "Crop Top",
+ "Cardigan",
+ "Safari Jacket",
+ "Bandeau Top",
+ "Bra",
+ "Bikini Top",
+ "Dress",
+ "Puffer Jacket",
+ "Dinner Jacket",
+ "Smoking Jacket",
+ "Waist Coat",
+ "Tailcoat",
+ "Tuxedo Jacket",
+ "Parka",
+ "Overcoat",
+ "Turtle Neck",
+ "Bomber Jacket",
+ "Trench Coat",
+ "Cape",
+ "Kimono",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.head = vec![
+ "Fedora",
+ "Sombrero",
+ "Sun Hat",
+ "Viking Helm",
+ "Silk Hood",
+ "Hood",
+ "Top Hat",
+ "Bucket Hat",
+ "Baseball Cap",
+ "Beret",
+ "Doo Rag",
+ "Cowboy",
+ "Flat Cap",
+ "Porkpie Hat",
+ "Panama Hat",
+ "Sailors Bonet",
+ "Beanie",
+ "Headband",
+ "Captain Hat",
+ "Equestrian Helm",
+ "Visor",
+ "Turban",
+ "Wedding Veil",
+ "Feather Hat",
+ "Propeller Hat",
+ "Cat Ears",
+ "Headphones",
+ "Helmet",
+ "Wizard Hat",
+ "Safari Hat",
+ "Pith Helmet",
+ "Tiara",
+ "Flower Crown",
+ "Crown",
+ "Bandana",
+ "Umbrella Hat",
+ "Motorcycle Helmet",
+ "Peaked Cap",
+ "Golf Visor",
+ "Bowler Hat",
+ "Bow Hat",
+ "Dunce Cap",
+ "Towel",
+ "Jewelry Headpiece",
+ "Cheese Head",
+ "Yarmulke",
+ "Bald Cap",
+ "Coonskin Cap",
+ "Balaclava",
+ "Bonnet",
+ "Fez",
+ "Space Helmet",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.waist = vec![
+ "Fanny Pack",
+ "Fish Belt",
+ "Studded Belt",
+ "Belt",
+ "Leather Belt",
+ "Chrome Belt",
+ "Platinum Belt",
+ "Belt",
+ "Bat Belt",
+ "Shoelace Belt",
+ "Suspenders",
+ "Rope",
+ "Jeweled Belt",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.foot = vec![
+ "Slippers",
+ "Hightops",
+ "Boat shoes",
+ "Studded Boots",
+ "Leather Boots",
+ "Linen Shoes",
+ "Shoes",
+ "Dress Shoe",
+ "Ballet Shoe",
+ "Riding Boots",
+ "Slides",
+ "Roller Skates",
+ "Ice Skates",
+ "Socks",
+ "Flip Flops",
+ "Platform Boots",
+ "Stilletos",
+ "Pumps",
+ "Sandals",
+ "Sneakers",
+ "Cowboy Boots",
+ "Snow Boots",
+ "Ski Boots",
+ "Fins",
+ "High Heel Sandals",
+ "Jeweled Sandals",
+ "Wedge",
+ "Rain Boots",
+ "Cleats",
+ "Brogues",
+ "Derby Shoes",
+ "Moccasins",
+ "Espadrilles",
+ "Loafers",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.underwear = vec![
+ "Thong",
+ "Boxers",
+ "Boxer Briefs",
+ "Panties",
+ "Jockstrap",
+ "Tighty-whities",
+ "Trunks",
+ "Bikini",
+ "Midway Briefs",
+ "Boy Shorts",
+ "String Bikini",
+ "G-String",
+ "Granny Panties",
+ "Diaper",
+ "Garter",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.accessory = vec![
+ "Necklace",
+ "Amulet",
+ "Pendant",
+ "Chain",
+ "Choker",
+ "Cross Necklace",
+ "Ear Buds",
+ "Hoops",
+ "Neck Tie",
+ "Bow Tie",
+ "Exclusive Pass",
+ "Scarf",
+ "Feather Boa",
+ "Neck Pillow",
+ "Ascot",
+ "Hope Diamond",
+ "Snake",
+ "Stethoscope",
+ "Shades",
+ "Heart Glasses",
+ "Nerd Glasses",
+ "Goggles",
+ "Ski Goggle",
+ "Contact Lenses",
+ "Monocle",
+ "Green Contacts",
+ "3D Glasses",
+ "Sunglasses",
+ "Blindfold",
+ "VR Goggles",
+ "Cyclops Glasses",
+ "Aviator Sunglasses",
+ "Spectacles",
+ "Purse",
+ "Backpack",
+ "Tote Bag",
+ "Grocery Bag",
+ "Briefcase",
+ "Suitcase",
+ "Messenger Bag",
+ "Wallet",
+ "Crossbody Bag",
+ "Hat Bag",
+ "Golf Bag",
+ "Portfolio Bag",
+ "Tackle Box",
+ "Tennis Bag",
+ "Steamer Trunk",
+ "Tool Box",
+ "Guitar Case",
+ "Watch",
+ "Smart Watch",
+ "Casio Watch",
+ "Atomic Watch",
+ "Festival Wristband",
+ "Engagement Ring",
+ "Antique Watch",
+ "Wristband",
+ "Scrunchie",
+ "Bracelet",
+ "Kandi Bracelet",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.pants = vec![
+ "Shorts",
+ "Skirt",
+ "Jeans",
+ "Skort",
+ "Sweat Pants",
+ "Yoga Pants",
+ "Kilt",
+ "Track Pants",
+ "Cargo Shorts",
+ "Skinny Jeans",
+ "Cargo Pants",
+ "Riding Pants",
+ "Cutoff Pants",
+ "Baggy Pants",
+ "Tights",
+ "Dress Pants",
+ "Bell Bottoms",
+ "Karate Pants",
+ "Miniskirt",
+ "Tennis Skirt",
+ "Chaps",
+ "Leggings",
+ "Crop Pants",
+ "Trousers",
+ "Hot Pants",
+ "Swim Trunks",
+ "Capri Pants",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.prefixes = vec![
+ "Second Hand",
+ "Aged",
+ "Worn Out",
+ "Brand New",
+ "Used",
+ "Old",
+ "2yr Old",
+ "5yr Old",
+ "3yr Old",
+ "2021",
+ "1980s",
+ "1990s",
+ "1970s",
+ "1960s",
+ "1950s",
+ "1920s",
+ "1800s",
+ "Medieval",
+ "Futuristic",
+ "Vintage",
+ "Retro",
+ "Victorian",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.name_prefixes = vec![
+ "Gold",
+ "Shiny",
+ "Psychedelic",
+ "Blazing",
+ "Cheetah Print",
+ "Leopard Print",
+ "Rainbow",
+ "Camo",
+ "Neon",
+ "Flashing",
+ "Hot Pink",
+ "Checkered",
+ "Pinstripe",
+ "Icy",
+ "Silver",
+ "Tie Dye",
+ "Steampunk",
+ "Sparkly",
+ "Plaid",
+ "Anime",
+ "Colorful",
+ "Floral",
+ "8 Bit",
+ "Blood Red",
+ "Icy Blue",
+ "Forest Green",
+ "Bright Yellow",
+ "Mystic Purple",
+ "Night Black",
+ "Cloud White",
+ "Glittery",
+ "Goth",
+ "Emo",
+ "Punk",
+ "Preppy",
+ "Electric Swirl",
+ "Fruit Print",
+ "Paisley",
+ "Crunchy",
+ "Aesthetic",
+ "Boho",
+ "Military",
+ "Velour",
+ ].iter().map(|s| s.to_string()).collect();
+
+ loot.name_suffixes = vec![
+ "Dirty",
+ "Clean",
+ "Designer",
+ "Synthetic",
+ "Wet",
+ "Alien",
+ "Organic",
+ "Vegan",
+ "Kawaii",
+ "Badass",
+ "Cute",
+ "Sexy",
+ "Beautiful",
+ "Ugly",
+ "Fire",
+ "Cruelty Free",
+ "Collectors Edition",
+ "Limited Edition",
+ "Drippin",
+ "Stylin",
+ "Custom",
+ "Imaginary",
+ "Knockoff",
+ "Fake",
+ "Signed",
+ "Cheap",
+ "Expensive",
+ "Hip",
+ "Chic",
+ "Trendy",
+ "Casual",
+ "Formal",
+ "Monogramed",
+ "Haute Couture",
+ ].iter().map(|s| s.to_string()).collect();
+}
+
+#[query]
+fn user_tokens(user: Principal) -> Vec {
+ return storage::get::().user_tokens(&user);
+}
+
+#[query]
+fn supply() -> u64 {
+ return storage::get::().total_supply;
+}
+
+#[query]
+fn remaining() -> u64 {
+ return storage::get::().remaining();
+}
+
+#[query]
+fn owner_of(token_id: u64) -> Option {
+ return storage::get::().owner_of(&token_id);
+}
+
+#[update]
+fn transfer_to(user: Principal, token_id: u64) -> bool {
+ return storage::get_mut::().transfer_to(user, token_id);
+}
+
+#[update]
+fn claim() -> Result {
+ return Err("No claims for this NFT type (IC DRIP)".to_string());
+ //return storage::get_mut::().claim(ic_cdk::caller());
+}
+
+//Allow the original airdrop to always exists for future references
+//where sites can use this to know if the person transferred their NFT or not.
+#[query]
+fn get_airdrops() -> Vec<(u64, bool)> {
+ let airdroppers = storage::get_mut::>>();
+ let address_book = storage::get_mut::();
+ match airdroppers.get(&ic_cdk::caller()) {
+ Some(tokens) => {
+ let mut results: Vec<(u64, bool)> = Vec::new();
+ for token in tokens {
+ results.push((
+ token.clone(),
+ address_book.is_owner_of(ic_cdk::caller(), token)
+ ));
+ }
+ return results;
+ },
+ None => Vec::new()
+ }
+}
+
+//Save list of airdrops for other platforms to use.
+fn update_airdroppers(user: Principal, token_id: u64) -> () {
+ let airdroppers = storage::get_mut::>>();
+ match airdroppers.get_mut(&user) {
+ Some(tokens) => tokens.push(token_id),
+ None => {
+ airdroppers.insert(user, vec![token_id]);
+ }
+ }
+}
+
+#[update(guard = "is_controller")]
+fn add_airdrops(users: Vec) -> bool {
+ let address_book = storage::get_mut::();
+ for id in users {
+ match address_book.claim(id) {
+ Ok(token_id) => update_airdroppers(id, token_id),
+ Err(_) => return false
+ }
+ }
+ return true;
+}
+
+#[update(guard = "is_controller")]
+fn add_controller(user: Principal) -> bool {
+ return storage::get_mut::().add_controller(&user);
+}
+
+#[update(guard = "is_controller")]
+fn remove_controller(user: Principal) -> bool {
+ return storage::get_mut::().remove_controller(&user);
+}
+
+#[update(guard = "is_controller")]
+fn get_controllers() -> Vec {
+ return storage::get::().controllers.clone();
+}
+
+#[query]
+fn name() -> String {
+ return "IC_DRIP".to_string();
+}
+
+#[query]
+fn symbol() -> String {
+ return "IC_DRIP".to_string();
+}
+
+#[query]
+fn get_address_book() -> AddressBook {
+ return storage::get::().clone();
+}
+
+type HeaderField = (String, String);
+
+#[derive(Clone, Debug, CandidType, Deserialize)]
+struct HttpRequest {
+ method: String,
+ url: String,
+ headers: Vec<(String, String)>,
+ body: ByteBuf,
+}
+
+#[derive(Clone, Debug, CandidType, Deserialize)]
+struct HttpResponse {
+ status_code: u16,
+ headers: Vec,
+ body: Vec,
+}
+
+
+#[query]
+async fn http_request(req: HttpRequest) -> HttpResponse {
+
+ let parts: Vec<&str> = req.url.split('?').collect();
+
+ let token_param: Vec<&str> = parts[1].split('=').collect();
+ let token_id = token_param[1].parse::().unwrap();
+
+ let address_book = storage::get_mut::();
+
+ if token_id <= 0 || token_id > address_book.total_supply || !address_book.is_claimed(&token_id) {
+ return HttpResponse {
+ status_code: 404,
+ headers: Vec::new(),
+ body: Vec::new(),
+ }
+ }
+
+ let loot = storage::get_mut::();
+
+ let seed = address_book.token_seeds.get(&token_id).unwrap();
+
+ let data = loot.generate(token_id.clone() + seed.clone());
+
+ let results = data.as_bytes();
+
+ let mut headers: Vec = Vec::new();
+ headers.push(("content-type".to_string(), "image/svg+xml".to_string()));
+ headers.push(("cache-control".to_string(), "public, max-age=604800, immutable".to_string()));
+ return HttpResponse {
+ status_code: 200,
+ headers,
+ body: results.to_vec(),
+ }
+}
+
+#[query]
+fn get_token_properties(token_id: u64) -> Vec<(String, String)> {
+
+ let address_book = storage::get_mut::();
+ if token_id <= 0 || token_id > address_book.total_supply || !address_book.is_claimed(&token_id) {
+ return Vec::new();
+ }
+
+ let loot = storage::get_mut::();
+ return loot.get_properties(token_id);
+}
+
+
+//this is not working correctly.
+#[query(name = "__get_candid_interface_tmp_hack")]
+fn export_candid() -> String {
+ return r#"
+type HeaderField = record { text; text; };
+
+type HttpRequest = record {
+ method: text;
+ url: text;
+ headers: vec HeaderField;
+ body: blob;
+};
+
+type HttpResponse = record {
+ status_code: nat16;
+ headers: vec HeaderField;
+ body: blob;
+};
+
+type AddressBook = record {
+ total_supply: nat64;
+ tokens: vec record { nat64; principal};
+ controllers: vec principal;
+ claim_index: nat64;
+ token_seeds: vec record { nat64; nat64};
+};
+
+type ClaimResult = variant {
+ Ok : nat64;
+ Err: text;
+};
+
+service : {
+ http_request: (request: HttpRequest) -> (HttpResponse) query;
+
+ get_address_book: () -> (AddressBook) query;
+ get_token_properties: (nat64) -> (vec record { text; text}) query;
+
+ get_airdrops: () -> (vec record { nat64; bool }) query;
+ add_airdrops: (vec principal) -> (bool);
+ name: () -> (text) query;
+ symbol: () -> (text) query;
+ user_tokens: (principal) -> (vec nat64) query;
+ owner_of: (nat64) -> (opt principal) query;
+ transfer_to: (principal, nat64) -> (bool);
+ claim: () -> (ClaimResult);
+ remaining: () -> (nat64);
+
+ get_controllers: () -> (vec principal) query;
+ add_controller: (principal) -> (bool);
+ remove_controller: (principal) -> (bool);
+ supply: () -> (nat64);
+}
+ "#.to_string();
+}
+
+#[derive(CandidType, Deserialize)]
+struct StableStorage {
+ address_book: AddressBook,
+ airdroppers: BTreeMap>
+}
+
+
+#[pre_upgrade]
+fn pre_upgrade() {
+
+ let stable = StableStorage {
+ address_book: storage::get::().clone(),
+ airdroppers: storage::get::>>().clone(),
+ };
+
+ match storage::stable_save((stable,)) {
+ Ok(_) => (),
+ Err(candid_err) => {
+ ic_cdk::trap(&format!(
+ "An error occurred when saving to stable memory (pre_upgrade): {}",
+ candid_err
+ ));
+ }
+ };
+}
+
+#[post_upgrade]
+fn post_upgrade() {
+ init();
+ if let Ok((storage,)) = storage::stable_restore::<(StableStorage,)>() {
+
+ let address_book = storage::get_mut::();
+ *address_book = storage.address_book;
+
+ let airdroppers = storage::get_mut::>>();
+ *airdroppers = storage.airdroppers;
+ }
+}
+
+fn is_controller() -> Result<(), String> {
+ if storage::get::().is_controller(&ic_cdk::caller()) {
+ Ok(())
+ } else {
+ Err("Only the controller can call this method.".to_string())
+ }
+}
diff --git a/src/ic_loot_rs/loot.rs b/src/ic_loot_rs/loot.rs
new file mode 100644
index 0000000..82c2f5f
--- /dev/null
+++ b/src/ic_loot_rs/loot.rs
@@ -0,0 +1,146 @@
+
+use ic_cdk::export::{candid::{CandidType, Deserialize}};
+use crate::rand::Rand;
+
+
+#[derive(Clone, Debug, Default, CandidType, Deserialize)]
+pub struct Loot {
+ pub weapons: Vec,
+ pub chest: Vec,
+ pub head: Vec,
+ pub waist: Vec,
+ pub foot: Vec,
+ pub underwear: Vec,
+ pub accessory: Vec,
+ pub pants: Vec,
+
+ pub prefixes: Vec,
+ pub suffixes: Vec,
+ pub name_prefixes: Vec,
+ pub name_suffixes: Vec,
+}
+
+impl Loot {
+
+ pub fn get_weapon(&self, token_id: u64) -> String {
+ self.compute(&self.weapons, 1, token_id)
+ }
+
+ pub fn get_chest(&self, token_id: u64) -> String {
+ self.compute(&self.chest, 222, token_id)
+ }
+
+ pub fn get_head(&self, token_id: u64) -> String {
+ self.compute(&self.head, 333, token_id)
+ }
+
+ pub fn get_waist(&self, token_id: u64) -> String {
+ self.compute(&self.waist, 4444, token_id)
+ }
+
+ pub fn get_foot(&self, token_id: u64) -> String {
+ self.compute(&self.foot, 55555, token_id)
+ }
+
+ pub fn get_underwear(&self, token_id: u64) -> String {
+ self.compute(&self.underwear, 666666, token_id)
+ }
+
+ pub fn get_accessory(&self, token_id: u64) -> String {
+ self.compute(&self.accessory, 7777777, token_id)
+ }
+
+ pub fn get_pants(&self, token_id: u64) -> String {
+ self.compute(&self.pants, 88888888, token_id)
+ }
+
+ pub fn get_prefix(&self, rand: u64) -> String {
+ return self.prefixes[rand as usize % &self.prefixes.len()].clone();
+ }
+
+ pub fn get_name_prefix(&self, rand: u64) -> String {
+ return self.name_prefixes[rand as usize % &self.name_prefixes.len()].clone();
+ }
+
+ pub fn get_name_suffix(&self, rand: u64) -> String {
+ return self.name_suffixes[rand as usize % &self.name_suffixes.len()].clone();
+ }
+
+ pub fn compute(&self, items: &Vec, offset: u64, token_id: u64) -> String {
+ let rand = Rand::new(token_id + offset).rand();
+ let item_index = rand as usize % items.len();
+
+ let mut output = items[item_index].clone();
+
+ let greatness = rand % 21;
+
+ if greatness > 14 {
+ output = format!("{} {}",self.get_prefix(rand), output);
+ }
+ if greatness > 19 {
+ if greatness == 19 {
+ output = format!("\"{}\" {} ({})", self.get_name_prefix(rand), self.get_name_suffix(rand), output);
+ } else {
+ output = format!("\"{}\" {} ({}) 🔥", self.get_name_prefix(rand), output, self.get_name_suffix(rand));
+ }
+ }
+ return output;
+ }
+
+ pub fn get_properties(&self, token_id: u64) -> Vec<(String, String)> {
+ return vec![
+ ("hand".to_string(), self.get_weapon(token_id)),
+ ("shirt".to_string(), self.get_chest(token_id)),
+ ("head".to_string(), self.get_head(token_id)),
+ ("waist".to_string(), self.get_waist(token_id)),
+ ("foot".to_string(), self.get_foot(token_id)),
+ ("pants".to_string(), self.get_pants(token_id)),
+ ("underwear".to_string(), self.get_underwear(token_id)),
+ ("accessory".to_string(), self.get_accessory(token_id)),
+ ]
+ }
+
+ pub fn generate(&self, token_id: u64) -> String {
+ return format!(r#"
+
+
+
+
+ {}
+
+
+ {}
+
+
+ {}
+
+
+ {}
+
+
+ {}
+
+
+ {}
+
+
+ {}
+
+
+ {}
+
+
+ "#,
+ self.get_weapon(token_id),
+ self.get_chest(token_id),
+ self.get_head(token_id),
+ self.get_waist(token_id),
+ self.get_foot(token_id),
+ self.get_underwear(token_id),
+ self.get_accessory(token_id),
+ self.get_pants(token_id),
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/ic_loot_rs/rand.rs b/src/ic_loot_rs/rand.rs
new file mode 100644
index 0000000..54d0629
--- /dev/null
+++ b/src/ic_loot_rs/rand.rs
@@ -0,0 +1,32 @@
+const KX: u64 = 123456789;
+const KY: u64 = 362436069;
+const KZ: u64 = 521288629;
+const KW: u64 = 88675123;
+
+pub struct Rand {
+ x: u64,
+ y: u64,
+ z: u64,
+ w: u64,
+}
+
+impl Rand {
+ pub fn new(seed: u64) -> Rand {
+ Rand {
+ x: KX ^ seed,
+ y: KY ^ seed,
+ z: KZ,
+ w: KW,
+ }
+ }
+
+ // Xorshift 128, taken from German Wikipedia
+ pub fn rand(&mut self) -> u64 {
+ let t = self.x ^ self.x.wrapping_shl(11);
+ self.x = self.y;
+ self.y = self.z;
+ self.z = self.w;
+ self.w ^= self.w.wrapping_shr(19) ^ t ^ t.wrapping_shr(8);
+ return self.w;
+ }
+}
\ No newline at end of file
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..fe3119e
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,77 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import path from "path";
+import dfxJson from "./dfx.json";
+import WindiCSS from 'vite-plugin-windicss'
+
+let localCanisters, prodCanisters, canisters;
+
+function initCanisterIds() {
+ try {
+ localCanisters = require(path.resolve(
+ ".dfx",
+ "local",
+ "canister_ids.json"
+ ));
+ } catch (error) {
+ console.log("No local canister_ids.json found. Continuing production");
+ }
+ try {
+ prodCanisters = require(path.resolve("canister_ids.json"));
+ } catch (error) {
+ console.log("No production canister_ids.json found. Continuing with local");
+ }
+
+ const network = process.env.DFX_NETWORK || "local";
+
+ canisters = network === "local" ? localCanisters : prodCanisters;
+
+ for (const canister in canisters) {
+ process.env["VITE_APP_" + canister.toUpperCase() + "_CANISTER_ID"] =
+ canisters[canister][network];
+ }
+}
+initCanisterIds();
+
+// List of all aliases for canisters
+const aliases = Object.entries(dfxJson.canisters).reduce(
+ (acc, [name, _value]) => {
+ // Get the network name, or `local` by default.
+ const networkName = process.env["DFX_NETWORK"] || "local";
+ const outputRoot = path.join(
+ __dirname,
+ ".dfx",
+ networkName,
+ "canisters",
+ name
+ );
+
+ return {
+ ...acc,
+ ["dfx-generated/" + name]: path.join(outputRoot, name + ".did.js"),
+ };
+ },
+ {}
+);
+
+//https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [vue(), WindiCSS()],
+ resolve: {
+ alias: {
+ ...aliases,
+ },
+ },
+ define: {
+ "process.env": process.env,
+ },
+ server: {
+ proxy: {
+ "/api": {
+ target: "http://localhost:8000",
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/api/, "/api"),
+ },
+ },
+ },
+});