@base44-preview/cli 0.0.31-pr.246.c851bc7 → 0.0.32-pr.166.496e743
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.
- package/README.md +2 -2
- package/dist/cli/index.js +73 -81
- package/dist/cli/index.js.map +34 -33
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -83,9 +83,9 @@ base44 <command> --help
|
|
|
83
83
|
base44 --version
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
##
|
|
86
|
+
## Beta
|
|
87
87
|
|
|
88
|
-
The CLI and Base44 backend service are currently in
|
|
88
|
+
The CLI and Base44 backend service are currently in beta. We're actively improving them based on user feedback. Share your thoughts and feature requests on our [GitHub Discussions](https://github.com/orgs/base44/discussions).
|
|
89
89
|
|
|
90
90
|
Found a bug? [Open an issue](https://github.com/base44/cli/issues).
|
|
91
91
|
|
package/dist/cli/index.js
CHANGED
|
@@ -1867,6 +1867,23 @@ var require_commander = __commonJS((exports) => {
|
|
|
1867
1867
|
exports.InvalidOptionArgumentError = InvalidArgumentError;
|
|
1868
1868
|
});
|
|
1869
1869
|
|
|
1870
|
+
// node_modules/@commander-js/extra-typings/index.js
|
|
1871
|
+
var require_extra_typings = __commonJS((exports, module) => {
|
|
1872
|
+
var commander = require_commander();
|
|
1873
|
+
exports = module.exports = {};
|
|
1874
|
+
exports.program = new commander.Command;
|
|
1875
|
+
exports.Argument = commander.Argument;
|
|
1876
|
+
exports.Command = commander.Command;
|
|
1877
|
+
exports.CommanderError = commander.CommanderError;
|
|
1878
|
+
exports.Help = commander.Help;
|
|
1879
|
+
exports.InvalidArgumentError = commander.InvalidArgumentError;
|
|
1880
|
+
exports.InvalidOptionArgumentError = commander.InvalidArgumentError;
|
|
1881
|
+
exports.Option = commander.Option;
|
|
1882
|
+
exports.createCommand = (name) => new commander.Command(name);
|
|
1883
|
+
exports.createOption = (flags, description) => new commander.Option(flags, description);
|
|
1884
|
+
exports.createArgument = (name, description) => new commander.Argument(name, description);
|
|
1885
|
+
});
|
|
1886
|
+
|
|
1870
1887
|
// node_modules/sisteransi/src/index.js
|
|
1871
1888
|
var require_src = __commonJS((exports, module) => {
|
|
1872
1889
|
var ESC = "\x1B";
|
|
@@ -9296,10 +9313,10 @@ var require_ejs = __commonJS((exports) => {
|
|
|
9296
9313
|
};
|
|
9297
9314
|
if (opts.filename && typeof Object.defineProperty === "function") {
|
|
9298
9315
|
var filename = opts.filename;
|
|
9299
|
-
var
|
|
9316
|
+
var basename3 = path11.basename(filename, path11.extname(filename));
|
|
9300
9317
|
try {
|
|
9301
9318
|
Object.defineProperty(returnedFn, "name", {
|
|
9302
|
-
value:
|
|
9319
|
+
value: basename3,
|
|
9303
9320
|
writable: false,
|
|
9304
9321
|
enumerable: false,
|
|
9305
9322
|
configurable: true
|
|
@@ -111567,12 +111584,12 @@ function getLanguageByFileName(languages2, file2) {
|
|
|
111567
111584
|
if (!file2) {
|
|
111568
111585
|
return;
|
|
111569
111586
|
}
|
|
111570
|
-
const
|
|
111587
|
+
const basename4 = getFileBasename(file2).toLowerCase();
|
|
111571
111588
|
return languages2.find(({
|
|
111572
111589
|
filenames
|
|
111573
|
-
}) => filenames?.some((name2) => name2.toLowerCase() ===
|
|
111590
|
+
}) => filenames?.some((name2) => name2.toLowerCase() === basename4)) ?? languages2.find(({
|
|
111574
111591
|
extensions
|
|
111575
|
-
}) => extensions?.some((extension) =>
|
|
111592
|
+
}) => extensions?.some((extension) => basename4.endsWith(extension)));
|
|
111576
111593
|
}
|
|
111577
111594
|
function getLanguageByLanguageName(languages2, languageName) {
|
|
111578
111595
|
if (!languageName) {
|
|
@@ -116794,8 +116811,8 @@ var init_prettier = __esm(() => {
|
|
|
116794
116811
|
}
|
|
116795
116812
|
exports.endsWithSlashGlobStar = endsWithSlashGlobStar;
|
|
116796
116813
|
function isAffectDepthOfReadingPattern(pattern) {
|
|
116797
|
-
const
|
|
116798
|
-
return endsWithSlashGlobStar(pattern) || isStaticPattern(
|
|
116814
|
+
const basename4 = path152.basename(pattern);
|
|
116815
|
+
return endsWithSlashGlobStar(pattern) || isStaticPattern(basename4);
|
|
116799
116816
|
}
|
|
116800
116817
|
exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;
|
|
116801
116818
|
function expandPatternsWithBraceExpansion(patterns) {
|
|
@@ -155679,7 +155696,7 @@ var require_view = __commonJS((exports, module) => {
|
|
|
155679
155696
|
var path18 = __require("node:path");
|
|
155680
155697
|
var fs28 = __require("node:fs");
|
|
155681
155698
|
var dirname11 = path18.dirname;
|
|
155682
|
-
var
|
|
155699
|
+
var basename4 = path18.basename;
|
|
155683
155700
|
var extname2 = path18.extname;
|
|
155684
155701
|
var join15 = path18.join;
|
|
155685
155702
|
var resolve5 = path18.resolve;
|
|
@@ -155718,7 +155735,7 @@ var require_view = __commonJS((exports, module) => {
|
|
|
155718
155735
|
var root2 = roots[i5];
|
|
155719
155736
|
var loc = resolve5(root2, name2);
|
|
155720
155737
|
var dir = dirname11(loc);
|
|
155721
|
-
var file2 =
|
|
155738
|
+
var file2 = basename4(loc);
|
|
155722
155739
|
path19 = this.resolve(dir, file2);
|
|
155723
155740
|
}
|
|
155724
155741
|
return path19;
|
|
@@ -155748,7 +155765,7 @@ var require_view = __commonJS((exports, module) => {
|
|
|
155748
155765
|
if (stat2 && stat2.isFile()) {
|
|
155749
155766
|
return path19;
|
|
155750
155767
|
}
|
|
155751
|
-
path19 = join15(dir,
|
|
155768
|
+
path19 = join15(dir, basename4(file2, ext), "index" + ext);
|
|
155752
155769
|
stat2 = tryStat(path19);
|
|
155753
155770
|
if (stat2 && stat2.isFile()) {
|
|
155754
155771
|
return path19;
|
|
@@ -159069,7 +159086,7 @@ var require_content_disposition = __commonJS((exports, module) => {
|
|
|
159069
159086
|
*/
|
|
159070
159087
|
module.exports = contentDisposition;
|
|
159071
159088
|
module.exports.parse = parse10;
|
|
159072
|
-
var
|
|
159089
|
+
var basename4 = __require("path").basename;
|
|
159073
159090
|
var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g;
|
|
159074
159091
|
var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/;
|
|
159075
159092
|
var HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g;
|
|
@@ -159104,9 +159121,9 @@ var require_content_disposition = __commonJS((exports, module) => {
|
|
|
159104
159121
|
if (typeof fallback === "string" && NON_LATIN1_REGEXP.test(fallback)) {
|
|
159105
159122
|
throw new TypeError("fallback must be ISO-8859-1 string");
|
|
159106
159123
|
}
|
|
159107
|
-
var name2 =
|
|
159124
|
+
var name2 = basename4(filename);
|
|
159108
159125
|
var isQuotedString = TEXT_REGEXP.test(name2);
|
|
159109
|
-
var fallbackName = typeof fallback !== "string" ? fallback && getlatin1(name2) :
|
|
159126
|
+
var fallbackName = typeof fallback !== "string" ? fallback && getlatin1(name2) : basename4(fallback);
|
|
159110
159127
|
var hasFallback = typeof fallbackName === "string" && fallbackName !== name2;
|
|
159111
159128
|
if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name2)) {
|
|
159112
159129
|
params["filename*"] = name2;
|
|
@@ -162817,8 +162834,8 @@ var require_dist3 = __commonJS((exports, module) => {
|
|
|
162817
162834
|
}
|
|
162818
162835
|
});
|
|
162819
162836
|
|
|
162820
|
-
// node_modules
|
|
162821
|
-
var import__ = __toESM(
|
|
162837
|
+
// node_modules/@commander-js/extra-typings/esm.mjs
|
|
162838
|
+
var import__ = __toESM(require_extra_typings(), 1);
|
|
162822
162839
|
var {
|
|
162823
162840
|
program,
|
|
162824
162841
|
createCommand,
|
|
@@ -185051,6 +185068,10 @@ var TikTokConnectorSchema = exports_external.object({
|
|
|
185051
185068
|
type: exports_external.literal("tiktok"),
|
|
185052
185069
|
scopes: exports_external.array(exports_external.string()).default([])
|
|
185053
185070
|
});
|
|
185071
|
+
var GoogleBigQueryConnectorSchema = exports_external.object({
|
|
185072
|
+
type: exports_external.literal("googlebigquery"),
|
|
185073
|
+
scopes: exports_external.array(exports_external.string()).default([])
|
|
185074
|
+
});
|
|
185054
185075
|
var CustomTypeSchema = exports_external.string().min(1).regex(/^[a-z0-9_-]+$/i);
|
|
185055
185076
|
var GenericConnectorSchema = exports_external.object({
|
|
185056
185077
|
type: CustomTypeSchema,
|
|
@@ -185063,6 +185084,7 @@ var ConnectorResourceSchema = exports_external.union([
|
|
|
185063
185084
|
GoogleSheetsConnectorSchema,
|
|
185064
185085
|
GoogleDocsConnectorSchema,
|
|
185065
185086
|
GoogleSlidesConnectorSchema,
|
|
185087
|
+
GoogleBigQueryConnectorSchema,
|
|
185066
185088
|
SlackConnectorSchema,
|
|
185067
185089
|
NotionConnectorSchema,
|
|
185068
185090
|
SalesforceConnectorSchema,
|
|
@@ -185078,6 +185100,7 @@ var KnownIntegrationTypes = [
|
|
|
185078
185100
|
"googlesheets",
|
|
185079
185101
|
"googledocs",
|
|
185080
185102
|
"googleslides",
|
|
185103
|
+
"googlebigquery",
|
|
185081
185104
|
"slack",
|
|
185082
185105
|
"notion",
|
|
185083
185106
|
"salesforce",
|
|
@@ -185340,7 +185363,10 @@ var connectorResource = {
|
|
|
185340
185363
|
// src/core/resources/entity/schema.ts
|
|
185341
185364
|
var FieldConditionSchema = exports_external.union([
|
|
185342
185365
|
exports_external.string(),
|
|
185343
|
-
exports_external.
|
|
185366
|
+
exports_external.number(),
|
|
185367
|
+
exports_external.boolean(),
|
|
185368
|
+
exports_external.null(),
|
|
185369
|
+
exports_external.looseObject({
|
|
185344
185370
|
$in: exports_external.unknown().optional(),
|
|
185345
185371
|
$nin: exports_external.unknown().optional(),
|
|
185346
185372
|
$ne: exports_external.unknown().optional(),
|
|
@@ -185357,6 +185383,15 @@ var rlsConditionAllowedKeys = new Set([
|
|
|
185357
185383
|
"user_condition",
|
|
185358
185384
|
"created_by",
|
|
185359
185385
|
"created_by_id",
|
|
185386
|
+
"id",
|
|
185387
|
+
"_id",
|
|
185388
|
+
"created_date",
|
|
185389
|
+
"updated_date",
|
|
185390
|
+
"app_id",
|
|
185391
|
+
"entity_name",
|
|
185392
|
+
"is_deleted",
|
|
185393
|
+
"deleted_date",
|
|
185394
|
+
"environment",
|
|
185360
185395
|
"$or",
|
|
185361
185396
|
"$and",
|
|
185362
185397
|
"$nor"
|
|
@@ -185385,60 +185420,33 @@ var isValidFieldCondition = (value) => {
|
|
|
185385
185420
|
}
|
|
185386
185421
|
return false;
|
|
185387
185422
|
};
|
|
185388
|
-
var RefineRLSConditionSchema = RLSConditionSchema.refine((val) => Object.entries(val).every(([key, value]) =>
|
|
185389
|
-
if (rlsConditionAllowedKeys.has(key)) {
|
|
185390
|
-
return true;
|
|
185391
|
-
}
|
|
185392
|
-
if (!key.startsWith("data.")) {
|
|
185393
|
-
return false;
|
|
185394
|
-
}
|
|
185395
|
-
return isValidFieldCondition(value);
|
|
185396
|
-
}), "Keys must be known RLS keys or match data.* pattern with valid value");
|
|
185423
|
+
var RefineRLSConditionSchema = RLSConditionSchema.refine((val) => Object.entries(val).every(([key, value]) => rlsConditionAllowedKeys.has(key) || isValidFieldCondition(value)), "Field condition values must be a primitive or an operator object ($in, $nin, $ne, $all)");
|
|
185397
185424
|
var RLSRuleSchema = exports_external.union([exports_external.boolean(), RefineRLSConditionSchema]);
|
|
185398
|
-
var EntityRLSSchema = exports_external.
|
|
185425
|
+
var EntityRLSSchema = exports_external.looseObject({
|
|
185399
185426
|
create: RLSRuleSchema.optional(),
|
|
185400
185427
|
read: RLSRuleSchema.optional(),
|
|
185401
185428
|
update: RLSRuleSchema.optional(),
|
|
185402
185429
|
delete: RLSRuleSchema.optional(),
|
|
185403
185430
|
write: RLSRuleSchema.optional()
|
|
185404
185431
|
});
|
|
185405
|
-
var FieldRLSSchema = exports_external.
|
|
185432
|
+
var FieldRLSSchema = exports_external.looseObject({
|
|
185406
185433
|
read: RLSRuleSchema.optional(),
|
|
185407
185434
|
write: RLSRuleSchema.optional(),
|
|
185408
185435
|
create: RLSRuleSchema.optional(),
|
|
185409
185436
|
update: RLSRuleSchema.optional(),
|
|
185410
185437
|
delete: RLSRuleSchema.optional()
|
|
185411
185438
|
});
|
|
185412
|
-
var
|
|
185413
|
-
|
|
185414
|
-
"number",
|
|
185415
|
-
"integer",
|
|
185416
|
-
"boolean",
|
|
185417
|
-
"array",
|
|
185418
|
-
"object"
|
|
185419
|
-
]);
|
|
185420
|
-
var StringFormatSchema = exports_external.enum([
|
|
185421
|
-
"date",
|
|
185422
|
-
"date-time",
|
|
185423
|
-
"time",
|
|
185424
|
-
"email",
|
|
185425
|
-
"uri",
|
|
185426
|
-
"hostname",
|
|
185427
|
-
"ipv4",
|
|
185428
|
-
"ipv6",
|
|
185429
|
-
"uuid"
|
|
185430
|
-
]);
|
|
185431
|
-
var PropertyDefinitionSchema = exports_external.object({
|
|
185432
|
-
type: PropertyTypeSchema,
|
|
185439
|
+
var PropertyDefinitionSchema = exports_external.looseObject({
|
|
185440
|
+
type: exports_external.string().optional(),
|
|
185433
185441
|
title: exports_external.string().optional(),
|
|
185434
185442
|
description: exports_external.string().optional(),
|
|
185435
185443
|
minLength: exports_external.number().int().min(0).optional(),
|
|
185436
185444
|
maxLength: exports_external.number().int().min(0).optional(),
|
|
185437
185445
|
pattern: exports_external.string().optional(),
|
|
185438
|
-
format:
|
|
185446
|
+
format: exports_external.string().optional(),
|
|
185439
185447
|
minimum: exports_external.number().optional(),
|
|
185440
185448
|
maximum: exports_external.number().optional(),
|
|
185441
|
-
enum: exports_external.array(exports_external.
|
|
185449
|
+
enum: exports_external.array(exports_external.unknown()).optional(),
|
|
185442
185450
|
enumNames: exports_external.array(exports_external.string()).optional(),
|
|
185443
185451
|
default: exports_external.unknown().optional(),
|
|
185444
185452
|
$ref: exports_external.string().optional(),
|
|
@@ -185451,12 +185459,12 @@ var PropertyDefinitionSchema = exports_external.object({
|
|
|
185451
185459
|
return exports_external.record(exports_external.string(), PropertyDefinitionSchema).optional();
|
|
185452
185460
|
}
|
|
185453
185461
|
});
|
|
185454
|
-
var EntitySchema = exports_external.
|
|
185455
|
-
type: exports_external.literal("object"),
|
|
185456
|
-
name: exports_external.string().regex(/^[a-zA-Z0-9]+$/, "Entity name must be alphanumeric only"),
|
|
185462
|
+
var EntitySchema = exports_external.looseObject({
|
|
185463
|
+
type: exports_external.literal("object").default("object"),
|
|
185464
|
+
name: exports_external.string().min(1).regex(/^[a-zA-Z0-9]+$/, "Entity name must be alphanumeric only"),
|
|
185457
185465
|
title: exports_external.string().optional(),
|
|
185458
185466
|
description: exports_external.string().optional(),
|
|
185459
|
-
properties: exports_external.record(exports_external.string(), PropertyDefinitionSchema),
|
|
185467
|
+
properties: exports_external.record(exports_external.string(), PropertyDefinitionSchema).default({}),
|
|
185460
185468
|
required: exports_external.array(exports_external.string()).optional(),
|
|
185461
185469
|
rls: EntityRLSSchema.optional()
|
|
185462
185470
|
});
|
|
@@ -185615,7 +185623,7 @@ async function deployFunctions(functions) {
|
|
|
185615
185623
|
return result.data;
|
|
185616
185624
|
}
|
|
185617
185625
|
// src/core/resources/function/config.ts
|
|
185618
|
-
import {
|
|
185626
|
+
import { dirname as dirname4, join as join5 } from "node:path";
|
|
185619
185627
|
async function readFunctionConfig(configPath) {
|
|
185620
185628
|
const parsed = await readJsonFile(configPath);
|
|
185621
185629
|
const result = FunctionConfigSchema.safeParse(parsed);
|
|
@@ -185646,24 +185654,7 @@ async function readAllFunctions(functionsDir) {
|
|
|
185646
185654
|
cwd: functionsDir,
|
|
185647
185655
|
absolute: true
|
|
185648
185656
|
});
|
|
185649
|
-
const
|
|
185650
|
-
cwd: functionsDir,
|
|
185651
|
-
absolute: true
|
|
185652
|
-
});
|
|
185653
|
-
const configFilesDirs = new Set(configFiles.map((f) => dirname4(f)));
|
|
185654
|
-
const indexFilesDirs = indexFiles.filter((indexFile) => !configFilesDirs.has(dirname4(indexFile)));
|
|
185655
|
-
const functionsFromConfig = await Promise.all(configFiles.map((configPath) => readFunction(configPath)));
|
|
185656
|
-
const functionsWithoutConfig = await Promise.all(indexFilesDirs.map(async (functionFile) => {
|
|
185657
|
-
const functionDir = dirname4(functionFile);
|
|
185658
|
-
const filePaths = await globby("*.{js,ts,json}", {
|
|
185659
|
-
cwd: functionDir,
|
|
185660
|
-
absolute: true
|
|
185661
|
-
});
|
|
185662
|
-
const name2 = basename2(functionDir);
|
|
185663
|
-
const entry = basename2(functionFile);
|
|
185664
|
-
return { name: name2, entry, entryPath: functionFile, filePaths };
|
|
185665
|
-
}));
|
|
185666
|
-
const functions = [...functionsFromConfig, ...functionsWithoutConfig];
|
|
185657
|
+
const functions = await Promise.all(configFiles.map((configPath) => readFunction(configPath)));
|
|
185667
185658
|
const names = new Set;
|
|
185668
185659
|
for (const fn of functions) {
|
|
185669
185660
|
if (names.has(fn.name)) {
|
|
@@ -185674,11 +185665,11 @@ async function readAllFunctions(functionsDir) {
|
|
|
185674
185665
|
return functions;
|
|
185675
185666
|
}
|
|
185676
185667
|
// src/core/resources/function/deploy.ts
|
|
185677
|
-
import { basename as
|
|
185668
|
+
import { basename as basename2 } from "node:path";
|
|
185678
185669
|
async function loadFunctionCode(fn) {
|
|
185679
185670
|
const loadedFiles = await Promise.all(fn.filePaths.map(async (filePath) => {
|
|
185680
185671
|
const content = await readTextFile(filePath);
|
|
185681
|
-
return { path:
|
|
185672
|
+
return { path: basename2(filePath), content };
|
|
185682
185673
|
}));
|
|
185683
185674
|
return { ...fn, files: loadedFiles };
|
|
185684
185675
|
}
|
|
@@ -186041,7 +186032,7 @@ async function handleUnauthorized(request, _options, response) {
|
|
|
186041
186032
|
return;
|
|
186042
186033
|
}
|
|
186043
186034
|
retriedRequests.add(request);
|
|
186044
|
-
return distribution_default(request, {
|
|
186035
|
+
return distribution_default(request.clone(), {
|
|
186045
186036
|
headers: { Authorization: `Bearer ${newAccessToken}` }
|
|
186046
186037
|
});
|
|
186047
186038
|
}
|
|
@@ -193462,7 +193453,7 @@ var {
|
|
|
193462
193453
|
// package.json
|
|
193463
193454
|
var package_default = {
|
|
193464
193455
|
name: "base44",
|
|
193465
|
-
version: "0.0.
|
|
193456
|
+
version: "0.0.32",
|
|
193466
193457
|
description: "Base44 CLI - Unified interface for managing Base44 applications",
|
|
193467
193458
|
type: "module",
|
|
193468
193459
|
bin: {
|
|
@@ -193500,6 +193491,7 @@ var package_default = {
|
|
|
193500
193491
|
devDependencies: {
|
|
193501
193492
|
"@biomejs/biome": "^2.0.0",
|
|
193502
193493
|
"@clack/prompts": "^0.11.0",
|
|
193494
|
+
"@commander-js/extra-typings": "^12.1.0",
|
|
193503
193495
|
"@types/bun": "^1.2.15",
|
|
193504
193496
|
"@types/common-tags": "^1.8.4",
|
|
193505
193497
|
"@types/cors": "^2.8.19",
|
|
@@ -194646,7 +194638,7 @@ function getFunctionsDeployCommand(context) {
|
|
|
194646
194638
|
}
|
|
194647
194639
|
|
|
194648
194640
|
// src/cli/commands/project/create.ts
|
|
194649
|
-
import { basename as
|
|
194641
|
+
import { basename as basename3, join as join11, resolve as resolve2 } from "node:path";
|
|
194650
194642
|
var import_lodash = __toESM(require_lodash(), 1);
|
|
194651
194643
|
var DEFAULT_TEMPLATE_ID = "backend-only";
|
|
194652
194644
|
async function getTemplateById(templateId) {
|
|
@@ -194681,8 +194673,8 @@ async function createInteractive(options) {
|
|
|
194681
194673
|
name: () => {
|
|
194682
194674
|
return options.name ? Promise.resolve(options.name) : he({
|
|
194683
194675
|
message: "What is the name of your project?",
|
|
194684
|
-
placeholder:
|
|
194685
|
-
initialValue:
|
|
194676
|
+
placeholder: basename3(process.cwd()),
|
|
194677
|
+
initialValue: basename3(process.cwd()),
|
|
194686
194678
|
validate: (value) => {
|
|
194687
194679
|
if (!value || value.trim().length === 0) {
|
|
194688
194680
|
return "Every project deserves a name";
|
|
@@ -199777,4 +199769,4 @@ export {
|
|
|
199777
199769
|
CLIExitError
|
|
199778
199770
|
};
|
|
199779
199771
|
|
|
199780
|
-
//# debugId=
|
|
199772
|
+
//# debugId=83DE11188CBE46DA64756E2164756E21
|